Dela via


Exempel på Fabric-dataagent med AdventureWorks-datasetet (förhandsversionen)

Den här artikeln visar hur du konfigurerar en dataagent i Microsoft Fabric med hjälp av ett lakehouse som exempeldatakälla. Först skapar och fyller vi i ett sjöhus, sedan skapar vi en Fabric-dataagent och lägger till lakehouse i den. Om du redan har en Power BI-semantisk modell (med nödvändiga läs-/skrivbehörigheter), ett lager eller en KQL-databas följer du samma steg och väljer den källan i stället. Även om den här genomgången använder ett sjöhus är mönstret detsamma för andra källor – endast valet av datakälla skiljer sig åt.

Viktigt!

Den här funktionen är i förhandsversion.

Förutsättningar

Viktigt!

Se till att den fristående Copilot-upplevelsen är aktiverad i Power BI-administratörsportalen (Klientinställningar > Copilot > Fristående Copilot-upplevelse). Om den inte är aktiverad kan du inte använda dataagenten i Copilot-scenarier även om andra Copilot-klientväxlar är på. Mer information finns i Copilot i Power BI-klientinställningar.

Skapa ett sjöhus med AdventureWorksLH

Först skapar du ett sjöhus och fyller det med nödvändiga data.

Om du redan har en instans av AdventureWorksLH i ett datahus (eller ett lager) kan du hoppa över det här steget. Annars kan du använda följande instruktioner från en Fabric-notebook för att fylla lakehouse med datan.

  1. Skapa en ny notebook-fil på arbetsytan där du vill skapa din Fabric-dataagent.

  2. Till vänster i fönstret Utforskaren väljer du + Datakällor. Med det här alternativet kan du lägga till ett befintligt sjöhus eller skapa ett nytt sjöhus. Skapa ett nytt sjöhus för tydlighetens skull och tilldela det ett namn.

  3. Lägg till följande kodfragment i den översta cellen:

    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. Välj Kör alla.

Skärmbild som visar en notebook med AdventureWorks uppladdningskod.

Efter några minuter fylls sjöstugan med den nödvändiga datan.

Försiktighet

Notebook-filer som fortsätter att köras (till exempel på grund av oavsiktliga oändliga loopar eller konstant avfrågning) kan förbruka Fabric-kapacitet på obestämd tid. När data har lästs in stoppar du alla aktiva celler och avslutar notebook-sessionen (anteckningsbokens verktygsfält > Stoppa session) om du inte längre behöver dem. Undvik att lägga till långvariga loopar utan tidsgräns.

Skapa en Fabric-dataagent

Om du vill skapa en ny Fabric-dataagent går du till din arbetsyta och väljer knappen + Nytt objekt , som du ser i den här skärmbilden:

Skärmbild som visar var du skapar Fabric-dataagenter.

På fliken Alla objekt söker du efter Fabric data agent för att hitta lämpligt alternativ. När du har gjort ditt val uppmanas du att ange ett namn för din Fabric-dataagent, vilket visas i denna skärmbild:

Skärmbild som visar var du anger namnet på fabric-dataagenten.

När du har angett namnet fortsätter du med följande steg för att justera Fabric-dataagenten efter dina specifika krav.

Välj datamängd

Välj det lakehouse som du skapade i föregående steg och välj sedan Lägg till, som visas i följande skärmbild:

Skärmbild som visar steget Lägg till ett sjöhus.

När lakehouse har lagts till som datakälla, visar Explorer-fönstret till vänster på Fabric-dataagentens sida lakehouse-namnet. Välj lakehouse för att visa alla tillgängliga tabeller. Använd kryssrutorna för att markera de tabeller som du vill göra tillgängliga för AI:n. I det här scenariot väljer du följande tabeller:

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

Skärmbild som visar var du kan välja tabeller för AI.

Ge instruktioner

Om du vill lägga till instruktioner väljer du knappen Dataagentinstruktioner för att öppna anvisningarna till höger. Du kan lägga till följande instruktioner.

Den AdventureWorksLH datakällan innehåller information från tre tabeller:

  • dimcustomer, för detaljerad kunddemografi och kontaktinformation
  • dimdate, för datumrelaterade data – till exempel kalender- och räkenskapsinformation
  • dimgeographyför geografisk information, inklusive ortnamn och landsregionkoder.

Använd den här datakällan för frågor och analyser som omfattar kundinformation, tidsbaserade händelser och geografiska platser.

Skärmbild som visar var du kan ge anvisningarna till AI:n.

Ange exempel

Om du vill lägga till exempelfrågor väljer du knappen Exempelfrågor för att öppna fönstret exempelfrågor till höger. Det här fönstret innehåller alternativ för att lägga till eller redigera exempelfrågor för alla datakällor som stöds. För varje datakälla kan du välja Lägg till eller redigera exempelfrågor för att ange relevanta exempel, enligt följande skärmbild:

Skärmbild som visar var du kan lägga till de exempel som du anger i AI:n.

Här bör du lägga till Exempelfrågor för den lakehouse-datakälla som du skapade.

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

Skärmbild som visar hur du lägger till SQL-exempel.

Anmärkning

För närvarande går det inte att lägga till exempel på fråge-/frågepar för datakällor för semantiska modeller i Power BI.

Testa och revidera fabric-dataagenten

Nu när du har konfigurerat fabric-dataagenten, lagt till instruktioner för Fabric-dataagenten och tillhandahållit exempelfrågor för lakehouse kan du interagera med den genom att ställa frågor och få svar. När du fortsätter att testa kan du lägga till fler exempel och förfina instruktionerna för att ytterligare förbättra prestanda för Fabric-dataagenten. Samarbeta med dina kollegor för att samla in feedback och se till att de exempelfrågor och instruktioner som tillhandahålls överensstämmer med de typer av frågor som de vill ställa.

Publicera Fabric-dataagenten

När du har verifierat prestandan för Fabric-dataagenten kan du välja att publicera den, så att du sedan kan dela den med dina kollegor som vill göra frågor och svar kring data. I det här fallet väljer du Publicera, som du ser i den här skärmbilden:

Skärmbild som visar val av alternativet Publicera.

Rutan Publicera dataagent öppnas, vilket visas i skärmbilden:

Skärmbild som visar funktionen publicera dataagent.

I den här rutan väljer du Publicera för att publicera Fabric-dataagenten. Den publicerade URL:en för fabric-dataagenten visas, som du ser i den här skärmbilden:

Skärmbild som visar den publicerade URL:en.

Använda Fabric-dataagenten i Copilot i Power BI

Du kan använda Copilot i Power BI för att interagera med fabric-dataagenten när du har publicerat den. Med Copilot i Power BI kan du direkt använda dataagenten och andra objekt (till exempel rapporter eller semantiska modeller) utan att behöva växla mellan dem.

Välj knappen Copilot i det vänstra navigeringsfönstret för att öppna Copilot i Power BI. Välj sedan Lägg till objekt för bättre resultat i textrutan längst ned för att lägga till dataagenten. Välj Dataagenter i fönstret som öppnas. Du kan bara se de dataagenter som du har behörighet att komma åt. Välj den dataagent som du vill använda och välj Bekräfta. Det här exemplet visar hur du arbetar med en enda dataagent, men du kan lägga till fler objekt – till exempel andra dataagenter, rapporter eller semantiska modeller. Följande skärmbild visar stegen med en enda dataagent:

Skärmbild som visar Copilot-knappen och en knapp för att lägga till objekt, till exempel dataagenter.

Nu när du har lagt till dataagenten i Copilot i Power BI kan du ställa frågor som rör din Fabric-dataagent, enligt följande skärmbild:

Skärmbild som visar copiloten som svarar på en fråga.

Använda Fabric-dataagenten programmatiskt

Du kan använda dataagenten Fabric programmatiskt i en Fabric-notebook-fil. Om du vill avgöra om Fabric-dataagenten har ett publicerat URL-värde väljer du Inställningar, enligt följande skärmbild:

Skärmbild som visar val av inställningar för Fabric-dataagent.

Innan du publicerar Fabric-dataagenten har den inget publicerat URL-värde, som du ser i följande skärmbild:

Skärmbild som visar att en dataagent för Fabric inte har ett publicerat URL-värde före publicering.

Om du inte har publicerat Fabric-dataagenten tidigare kan du publicera den enligt anvisningarna i föregående steg. Du kan sedan kopiera den publicerade URL:en och använda den i Fabric-anteckningsboken. På så sätt kan du fråga Fabric-dataagenten genom att göra anrop till FABRIC-dataagent-API:et i en Fabric-notebook-fil. Klistra in den kopierade URL:en i det här kodfragmentet. Ersätt sedan frågan med alla frågor som är relevanta för din Fabric-dataagent. Det här exemplet används \<generic published URL value\> som URL.

Viktigt!

När du anropar en dataagent programmatiskt implementerar du:

  1. En tidsgräns för pollning (se exemplet nedan) för att undvika oändliga loopar.
  2. Minimal avsökningsfrekvens (starta vid 2–5 sekunder, öka endast om det behövs).
  3. Rensning av skapade trådar eller resurser efter slutförande.
  4. Avstängning av anteckningsbokssession när den är klar för att frigöra Fabric-kapacitet.

Anmärkning

Justera versionstags (openai, synapseml, pandas, tqdm) till de senaste validerade versionerna för Fabric runtime om dessa versioner blir inaktuella.

%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)