แชร์ผ่าน


ตัวอย่างตัวแทนข้อมูล Fabric ที่มีชุดข้อมูล AdventureWorks (ตัวอย่าง)

บทความนี้แสดงวิธีการตั้งค่าตัวแทนข้อมูลใน Microsoft Fabric โดยใช้เลคเฮาส์เป็นแหล่งข้อมูลตัวอย่าง ก่อนอื่นเราสร้างและเติมข้อมูลเลคเฮาส์ จากนั้นสร้างตัวแทนข้อมูล Fabric และเพิ่มเลคเฮาส์ลงไป ถ้าคุณมีแบบจําลองความหมายของ Power BI อยู่แล้ว (ด้วยสิทธิ์การอ่าน/เขียนที่จําเป็น) คลังสินค้า ฐานข้อมูล KQL หรือออนโทโลยี ให้ทําตามขั้นตอนเดียวกันและเลือกแหล่งข้อมูลนั้นแทน แม้ว่าคําแนะนํานี้จะใช้เลคเฮาส์ แต่รูปแบบจะเหมือนกันสําหรับแหล่งข้อมูลอื่นๆ โดยมีเพียงการเลือกแหล่งข้อมูลเท่านั้นที่ต่างกัน

Important

คุณลักษณะนี้อยู่ในตัวอย่าง

Prerequisites

Important

ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานประสบการณ์ Copilot แบบสแตนด์อโลนในพอร์ทัลผู้ดูแลระบบ Power BI (การตั้งค่า > ผู้เช่า Copilot ประสบการณ์ Copilot > แบบสแตนด์อโลน) หากไม่ได้เปิดใช้งาน คุณจะไม่สามารถใช้ตัวแทนข้อมูลภายในสถานการณ์ Copilot ได้แม้ว่าสวิตช์ผู้เช่า Copilot อื่นๆ จะเปิดอยู่ก็ตาม สําหรับรายละเอียด โปรดดู Copilot ในการตั้งค่าผู้เช่า Power BI

สร้างเลคเฮ้าส์ด้วย AdventureWorksLH

ก่อนอื่นสร้างเลคเฮ้าส์และกรอกข้อมูลที่จําเป็น

ถ้าคุณมีอินสแตนซ์ของ AdventureWorksLH อยู่แล้วในเลคเฮ้าส์ (หรือคลัง) คุณสามารถข้ามขั้นตอนนี้ได้ ถ้าไม่เป็นเช่นนั้น คุณสามารถใช้คําแนะนําต่อไปนี้จาก Fabric notebook เพื่อใส่ข้อมูลในเลคเฮ้าส์

  1. สร้างสมุดบันทึกใหม่ในพื้นที่ทํางานที่คุณต้องการสร้างตัวแทนข้อมูล Fabric ของคุณ

  2. ทางด้านซ้ายของบานหน้าต่าง Explorer ให้เลือก + แหล่งข้อมูล ตัวเลือกนี้ช่วยให้คุณสามารถเพิ่มเลคเฮ้าส์ที่มีอยู่หรือสร้างเลคเฮ้าส์ใหม่ เพื่อความชัดเจนสร้างเลคเฮ้าส์ใหม่และกําหนดชื่อให้มัน

  3. ในเซลล์ด้านบนสุด ให้เพิ่มส่วนย่อยของโค้ดต่อไปนี้:

    import pandas as pd
    from tqdm.auto import tqdm
    base = "https://synapseaisolutionsa.z13.web.core.windows.net/data/AdventureWorks"
    
    # load list of tables
    df_tables = pd.read_csv(f"{base}/adventureworks.csv", names=["table"])
    
    for table in (pbar := tqdm(df_tables['table'].values)):
        pbar.set_description(f"Uploading {table} to lakehouse")
    
        # download
        df = pd.read_parquet(f"{base}/{table}.parquet")
    
        # save as lakehouse table
        spark.createDataFrame(df).write.mode('overwrite').saveAsTable(table)
    
  4. เลือก เรียกใช้ทั้งหมด

สกรีนช็อตที่แสดงสมุดบันทึกที่มีรหัสการอัปโหลด AdventureWorks

หลังจากนั้นไม่กี่นาทีเลคเฮาส์จะมีข้อมูลที่จําเป็น

Caution

โน้ตบุ๊กที่ทํางานต่อไป (ตัวอย่างเช่น เนื่องจากการวนซ้ําที่ไม่มีที่สิ้นสุดโดยไม่ได้ตั้งใจหรือการสํารวจอย่างต่อเนื่อง) สามารถใช้ความจุของ Fabric ได้อย่างไม่มีกําหนด หลังจากโหลดข้อมูลเสร็จแล้ว ให้หยุดเซลล์ที่ใช้งานอยู่และสิ้นสุดเซสชันสมุดบันทึก (แถบ > เครื่องมือสมุดบันทึก หยุดเซสชัน) หากคุณไม่ต้องการอีกต่อไป หลีกเลี่ยงการเพิ่มลูปที่ทํางานเป็นเวลานานโดยไม่มีการหมดเวลา

สร้างตัวแทนข้อมูล Fabric

หากต้องการสร้างตัวแทนข้อมูล Fabric ใหม่ ให้นําทางไปยังพื้นที่ทํางานของคุณและเลือกปุ่ม + รายการใหม่ ตามที่แสดงในภาพหน้าจอนี้:

สกรีนช็อตที่แสดงตําแหน่งที่จะสร้างตัวแทนข้อมูล Fabric

ในแท็บรายการทั้งหมด ค้นหา Fabric data agent เพื่อค้นหาตัวเลือกที่เหมาะสม เมื่อเลือกแล้ว พร้อมท์จะขอให้คุณใส่ชื่อสําหรับตัวแทนข้อมูล Fabric ของคุณ ตามที่แสดงในสกรีนช็อตนี้:

สกรีนช็อตที่แสดงตําแหน่งที่จะใส่ชื่อสําหรับตัวแทนข้อมูล Fabric

หลังจากที่คุณป้อนชื่อ ดําเนินการตามขั้นตอนต่อไปนี้เพื่อจัดแนวตัวแทนข้อมูล Fabric กับข้อกําหนดเฉพาะของคุณ

เลือกข้อมูล

เลือก เลคเฮาส์ที่คุณสร้างขึ้นในขั้นตอนก่อนหน้า แล้วเลือก เพิ่ม ดังที่แสดงในภาพหน้าจอต่อไปนี้:

สกรีนช็อตที่แสดงขั้นตอนเพิ่มเลคเฮ้าส์

เมื่อเพิ่มเลคเฮาส์เป็นแหล่งข้อมูลแล้ว บานหน้าต่าง Explorer ทางด้านซ้ายของหน้า เอเจนต์ข้อมูล Fabric จะแสดงชื่อเลคเฮาส์ เลือกเลคเฮาส์เพื่อดูตารางที่มีทั้งหมด ใช้กล่องกาเครื่องหมายเพื่อเลือกตารางที่คุณต้องการทําให้พร้อมใช้งานสําหรับ AI สําหรับสถานการณ์นี้ เลือกตารางเหล่านี้:

  • dimcustomer
  • dimdate
  • dimgeography
  • dimproduct
  • dimproductcategory
  • dimpromotion
  • dimreseller
  • dimsalesterritory
  • factinternetsales
  • factresellersales

สกรีนช็อตที่แสดงตําแหน่งที่คุณสามารถเลือกตารางสําหรับ AI

ให้คําแนะนํา

หากต้องการเพิ่มคําแนะนํา ให้เลือกปุ่ม คําแนะนําของ ตัวแทนข้อมูล เพื่อเปิดบานหน้าต่างคําแนะนําทางด้านขวา คุณสามารถเพิ่มคําแนะนําต่อไปนี้

แหล่งข้อมูล AdventureWorksLH ประกอบด้วยข้อมูลจากสามตาราง:

  • dimcustomerข้อมูลประชากรและข้อมูลการติดต่อของลูกค้าโดยละเอียด
  • dimdateสําหรับข้อมูลที่เกี่ยวข้องกับวันที่ - ตัวอย่างเช่น ข้อมูลปฏิทินและบัญชี
  • dimgeographyสําหรับรายละเอียดทางภูมิศาสตร์ รวมถึงชื่อเมืองและรหัสภูมิภาค

ใช้แหล่งข้อมูลนี้สําหรับคิวรีและการวิเคราะห์ที่เกี่ยวข้องกับรายละเอียดลูกค้า เหตุการณ์ตามเวลา และตําแหน่งที่ตั้งทางภูมิศาสตร์

สกรีนช็อตที่แสดงตําแหน่งที่คุณสามารถแจ้งคําแนะนําไปยัง AI ได้

ให้ตัวอย่าง

เมื่อต้องการเพิ่มคิวรีตัวอย่าง ให้เลือกปุ่ม คิว รีตัวอย่าง เพื่อเปิดบานหน้าต่างคิวรีตัวอย่างทางด้านขวา บานหน้าต่างนี้มีตัวเลือกในการเพิ่มหรือแก้ไขคิวรีตัวอย่างสําหรับแหล่งข้อมูลที่ได้รับการสนับสนุนทั้งหมด สําหรับแต่ละแหล่งข้อมูล คุณสามารถเลือก เพิ่มหรือแก้ไขคิวรี่ตัวอย่าง เพื่อป้อนค่าตัวอย่างที่เกี่ยวข้อง ดังที่แสดงในภาพหน้าจอต่อไปนี้:

สกรีนช็อตที่แสดงตําแหน่งที่คุณสามารถเพิ่มตัวอย่างที่คุณให้กับ AI

ที่นี่ คุณควรเพิ่มคิวรีตัวอย่างสําหรับแหล่งข้อมูล lakehouse ที่คุณสร้างขึ้น

Question: Calculate the average percentage increase in sales amount for repeat purchases for every zipcode. Repeat purchase is a purchase subsequent to the first purchase (the average should always be computed relative to the first purchase)

SELECT AVG((s.SalesAmount - first_purchase.SalesAmount) / first_purchase.SalesAmount * 100) AS AvgPercentageIncrease
FROM factinternetsales s
INNER JOIN dimcustomer c ON s.CustomerKey = c.CustomerKey
INNER JOIN dimgeography g ON c.GeographyKey = g.GeographyKey
INNER JOIN (
    SELECT *
    FROM (
        SELECT
            CustomerKey,
            SalesAmount,
            OrderDate,
            ROW_NUMBER() OVER (PARTITION BY CustomerKey ORDER BY OrderDate) AS RowNumber
        FROM factinternetsales
    ) AS t
    WHERE RowNumber = 1
) first_purchase ON s.CustomerKey = first_purchase.CustomerKey
WHERE s.OrderDate > first_purchase.OrderDate
GROUP BY g.PostalCode;

Question: Show the monthly total and year-to-date total sales. Order by year and month.

SELECT
    Year,
    Month,
    MonthlySales,
    SUM(MonthlySales) OVER (PARTITION BY Year ORDER BY Year, Month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS CumulativeTotal
FROM (
    SELECT
       YEAR(OrderDate) AS Year,
       MONTH(OrderDate) AS Month,
       SUM(SalesAmount) AS MonthlySales
    FROM factinternetsales
    GROUP BY YEAR(OrderDate), MONTH(OrderDate)
) AS t

สกรีนช็อตที่แสดงการเพิ่มตัวอย่าง SQL

Note

การเพิ่มคู่คิวรี/คําถามตัวอย่างยังไม่ได้รับการสนับสนุนสําหรับแหล่งข้อมูลแบบจําลองเชิงความหมายของ Power BI ในขณะนี้

ทดสอบและแก้ไขตัวแทนข้อมูล Fabric

ตอนนี้คุณได้กําหนดค่าตัวแทนข้อมูล Fabric เพิ่มคําแนะนําของตัวแทนข้อมูล Fabric และคิวรีตัวอย่างสําหรับ lakehouse แล้ว คุณสามารถโต้ตอบได้โดยการถามคําถามและรับคําตอบ เมื่อคุณทําการทดสอบต่อไป คุณสามารถเพิ่มตัวอย่างเพิ่มเติม และปรับแต่งคําแนะนํา เพื่อปรับปรุงประสิทธิภาพการทํางานของตัวแทนข้อมูล Fabric ได้ ทํางานร่วมกับเพื่อนร่วมงานของคุณเพื่อรวบรวมคําติชม และยึดตามการป้อนข้อมูลของพวกเขา ตรวจสอบให้แน่ใจว่าคิวรีตัวอย่างที่ให้มาและคําแนะนําสอดคล้องกับชนิดของคําถามที่พวกเขาต้องการถาม

เผยแพร่ตัวแทนข้อมูล Fabric

หลังจากที่คุณตรวจสอบประสิทธิภาพของตัวแทนข้อมูล Fabric คุณอาจตัดสินใจที่จะเผยแพร่เพื่อให้คุณสามารถแชร์กับเพื่อนร่วมงานของคุณที่ต้องการทํา Q&A ผ่านข้อมูลได้ ในกรณีนี้ ให้เลือก เผยแพร่ ดังที่แสดงในภาพหน้าจอนี้:

สกรีนช็อตที่แสดงการเลือกตัวเลือกเผยแพร่

กล่อง ของตัวแทนการเผยแพร่ เปิดขึ้น ตามที่แสดงในสกรีนช็อตนี้:

สกรีนช็อตที่แสดงคุณลักษณะเผยแพร่ตัวแทนข้อมูล

ในกล่องนี้ ให้เลือก เผยแพร่ เพื่อเผยแพร่ตัวแทนข้อมูล Fabric URL ที่เผยแพร่สําหรับตัวแทนข้อมูล Fabric ปรากฏขึ้น ดังที่แสดงในภาพหน้าจอนี้:

สกรีนช็อตที่แสดง URL ที่เผยแพร่

ใช้ตัวแทนข้อมูล Fabric ใน Copilot ใน Power BI

คุณสามารถใช้ Copilot ใน Power BI เพื่อโต้ตอบกับตัวแทนข้อมูล Fabric หลังจากที่คุณเผยแพร่ ด้วย Copilot ใน Power BI คุณสามารถใช้ตัวแทนข้อมูลและรายการอื่น ๆ ได้โดยตรง (ตัวอย่างเช่น รายงาน หรือแบบจําลองความหมาย) โดยไม่จําเป็นต้องสลับไปมาระหว่างกัน

เลือกปุ่ม Copilot บนบานหน้าต่างนําทางด้านซ้าย เพื่อเปิด Copilot ใน Power BI จากนั้นเลือก เพิ่มรายการ เพื่อให้ได้ผลลัพธ์ที่ดีกว่า ในกล่องข้อความที่ด้านล่างเพื่อเพิ่มตัวแทนข้อมูล เลือก ตัวแทนข้อมูล ในหน้าต่างที่เปิดขึ้น คุณสามารถดูได้เฉพาะตัวแทนข้อมูลที่คุณมีสิทธิ์เข้าถึงเท่านั้น เลือกตัวแทนข้อมูลที่คุณต้องการ แล้วเลือก ยืนยัน ตัวอย่างนี้แสดงวิธีการทํางานกับตัวแทนข้อมูลเดียว แต่คุณสามารถเพิ่มรายการเพิ่มเติม เช่น ตัวแทนข้อมูล รายงาน หรือแบบจําลองความหมายอื่นๆ สกรีนช็อตต่อไปนี้แสดงขั้นตอนด้วยตัวแทนข้อมูลเดียว:

สกรีนช็อตที่แสดงปุ่มและปุ่ม Copilot เพื่อเพิ่มรายการเช่นตัวแทนข้อมูล

ตอนนี้ คุณได้เพิ่มตัวแทนข้อมูลไปยัง Copilot ใน Power BI แล้ว คุณสามารถถามคําถามใด ๆ ที่เกี่ยวข้องกับตัวแทนข้อมูล Fabric ของคุณ ดังที่แสดงในภาพหน้าจอต่อไปนี้:

สกรีนช็อตที่แสดง Copilot ที่ตอบคําถาม

ใช้ตัวแทนข้อมูล Fabric ทางโปรแกรม

คุณสามารถใช้ตัวแทนข้อมูล Fabric ทางโปรแกรมภายในสมุดบันทึก Fabric ได้ เมื่อต้องการตรวจสอบว่าตัวแทนข้อมูล Fabric มีค่า URL ที่เผยแพร่หรือไม่ ให้เลือก การตั้งค่า ดังที่แสดงในภาพหน้าจอต่อไปนี้:

สกรีนช็อตที่แสดงการเลือกการตั้งค่าตัวแทนข้อมูล Fabric

ก่อนที่คุณจะเผยแพร่ตัวแทนข้อมูล Fabric จะไม่มีค่า URL ที่เผยแพร่ ตามที่แสดงในภาพหน้าจอต่อไปนี้:

สกรีนช็อตที่แสดงว่าตัวแทนข้อมูล Fabric ไม่มีค่า URL ที่เผยแพร่ก่อนการเผยแพร่

ถ้าคุณยังไม่เคยเผยแพร่ตัวแทนข้อมูล Fabric มาก่อน คุณสามารถเผยแพร่ตามคําแนะนําในขั้นตอนก่อนหน้านี้ จากนั้นคุณสามารถคัดลอก URL ที่เผยแพร่และใช้งานได้ในสมุดบันทึกสําหรับ Fabric ด้วยวิธีนี้ คุณสามารถคิวรีตัวแทนข้อมูล Fabric โดยการเรียกใช้ API ของตัวแทนข้อมูล Fabric ใน Fabric วาง URL ที่คัดลอกในส่วนย่อยของโค้ดนี้ จากนั้นแทนที่คําถามด้วยคิวรีใด ๆ ที่เกี่ยวข้องกับตัวแทนข้อมูล Fabric ของคุณ ตัวอย่างนี้ใช้ \<generic published URL value\> เป็น URL

Important

เมื่อเรียกใช้ตัวแทนข้อมูลโดยทางโปรแกรม ให้ใช้:

  1. การหมดเวลาการสํารวจ (ดูตัวอย่างด้านล่าง) เพื่อหลีกเลี่ยงการวนซ้ําแบบไม่มีกําหนด
  2. ความถี่ในการสํารวจน้อยที่สุด (เริ่มต้นที่ 2-5 วินาที เพิ่มเฉพาะเมื่อจําเป็น)
  3. การล้างข้อมูลของเธรดหรือรีซอร์สที่สร้างขึ้นหลังจากเสร็จสิ้น
  4. การปิดเซสชันโน้ตบุ๊กเมื่อเสร็จสิ้นเพื่อปล่อยความจุ Fabric

Note

ปรับพินเวอร์ชัน (openai, , synapsemlpandas, ) tqdmเป็นเวอร์ชันที่ตรวจสอบแล้วล่าสุดสําหรับรันไทม์ Fabric ของคุณหากเวอร์ชันที่แน่นอนเหล่านี้ล้าสมัย

%pip install "openai==1.70.0"
%pip install "synapseml==1.0.5"  # Required for synapse.ml.mlflow (update version as needed)
%pip install pandas tqdm  # Skip if already available in the Fabric runtime
import typing as t
import time
import uuid

# OpenAI SDK internals
from openai import OpenAI
from openai._models import FinalRequestOptions
from openai._types import Omit
from openai._utils import is_given

# SynapseML helper for env config
from synapse.ml.mlflow import get_mlflow_env_config

# Removed unused imports: requests, json, pprint, APIStatusError, SynapseTokenProvider
 
base_url = "https://<generic published base URL value>"
question = "What data sources do you have access to?"

configs = get_mlflow_env_config()

# Create OpenAI Client
class FabricOpenAI(OpenAI):
    def __init__(
        self,
        api_version: str ="2024-05-01-preview",
        **kwargs: t.Any,
    ) -> None:
        self.api_version = api_version
        default_query = kwargs.pop("default_query", {})
        default_query["api-version"] = self.api_version
        super().__init__(
            api_key="",
            base_url=base_url,
            default_query=default_query,
            **kwargs,
        )
    
    def _prepare_options(self, options: FinalRequestOptions) -> None:
        headers: dict[str, str | Omit] = (
            {**options.headers} if is_given(options.headers) else {}
        )
        options.headers = headers
        headers["Authorization"] = f"Bearer {configs.driver_aad_token}"
        if "Accept" not in headers:
            headers["Accept"] = "application/json"
        if "ActivityId" not in headers:
            correlation_id = str(uuid.uuid4())
            headers["ActivityId"] = correlation_id

        return super()._prepare_options(options)

# Pretty printing helper
def pretty_print(messages):
    print("---Conversation---")
    for m in messages:
        print(f"{m.role}: {m.content[0].text.value}")
    print()

fabric_client = FabricOpenAI()
# Create assistant
assistant = fabric_client.beta.assistants.create(model="not used")
# Create thread
thread = fabric_client.beta.threads.create()
# Create message on thread
message = fabric_client.beta.threads.messages.create(thread_id=thread.id, role="user", content=question)
# Create run
run = fabric_client.beta.threads.runs.create(thread_id=thread.id, assistant_id=assistant.id)

# Wait for run to complete (avoid indefinite loop)
terminal_states = {"completed", "failed", "cancelled", "requires_action"}
poll_interval = 2
timeout_seconds = 300  # Adjust based on expected workload
start_time = time.time()

while run.status not in terminal_states:
    if time.time() - start_time > timeout_seconds:
        raise TimeoutError(f"Run polling exceeded {timeout_seconds} seconds (last status={run.status})")
    run = fabric_client.beta.threads.runs.retrieve(
        thread_id=thread.id,
        run_id=run.id,
    )
    print(run.status)
    time.sleep(poll_interval)

if run.status != "completed":
    print(f"Run finished with status: {run.status}")

# Print messages
response = fabric_client.beta.threads.messages.list(thread_id=thread.id, order="asc")
pretty_print(response)

# Delete thread
fabric_client.beta.threads.delete(thread_id=thread.id)
  • แนวคิดตัวแทนข้อมูล Fabric
  • สร้าง ตัวแทนข้อมูล Fabric