Fabric dataagentexempel med AdventureWorks-datauppsättningen (förhandsversion)

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 det. Om du redan har en Power BI semantisk modell kontrollerar du att du har läsbehörighet för att interagera med den via en dataagent (skrivbehörighet krävs endast för att ändra den semantiska modellen eller använda funktioner som Förberedelse för AI). För ett lager, en KQL-databas eller en ontologi följer du samma steg och väljer 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

  • En betald F2 eller högre Fabric Kapacitet, eller en Power BI Premium kapacitet per kapacitet (P1 eller högre) med Microsoft Fabric Aktiverat.
  • Aktivera kors-geo-bearbetning och kors-geo-lagring för AI baserat på krav som beskrivs i Fabric data agent tenant inställningar.
  • Minst en av dessa datakällor, med data: Ett lager, ett sjöhus, en Power BI-semantisk modell, en KQL-databas, en speglad databas eller en ontologi. Du måste ha läsbehörighet till datakällan.

Viktigt!

Kontrollera att den fristående Copilot-upplevelsen är aktiverad i Power BI-administratörsportalen (klientinställningar > Copilot > Den fristående Copilot-upplevelsen). 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-fil för att fylla lakehouse med data.

  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 ständig avsökning) kan förbruka Fabric-kapacitet utan tidsbegränsning. 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 dataagent för att hitta lämpligt alternativ. När du har valt det uppmanas du att ange ett namn på din Fabric dataagent, som du ser i den här skärmbilden:

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 ett lakehouse har lagts till som en datakälla, visar fönstret Explorer till vänster på sidan för dataagenten namnet på lakehouse. 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.

Behörigheter för semantiska modeller i dataagenter

Användarna behöver bara läsbehörighet för en Power BI semantisk modell för att lägga till den i en dataagent och ställa frågor via agenten. Åtkomst till arbetsyta (medlemsroll) och skapa-behörighet krävs inte för interaktion via dataagenter. Skrivbehörighet krävs endast för att ändra semantikmodellen eller använda funktioner som Förberedelse för AI.

Den här behörighetsändringen gäller endast interaktioner via dataagenter. Andra åtkomstmönster (till exempel Analysera i Excel eller direkt rapportredigering) följer standardbehörigheter för Power BI.

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

Det går för närvarande inte att lägga till exempel på fråge-/frågepar för Power BI semantiska modelldatakällor.

Testa och revidera Fabric-dataagenten

Nu när du har konfigurerat Fabric dataagenten, lagt till Fabric dataagentinstruktioner 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 prestandan 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 genomföra Q&A över 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änd 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 knappen för att lägga till objekt, såsom Data Agents.

När en dataagent innehåller en Power BI semantisk modell behöver användarna bara läsbehörighet för den semantiska modellen för att interagera med den via Copilot. Åtkomst till arbetsytor krävs inte. Skrivbehörighet krävs fortfarande för ändringar av semantiska modeller och förberedelse för AI.

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:

Screenshot som visar Copilot besvara en fråga.

Använda Fabric-dataagenten programmatiskt

Du kan använda Fabric-dataagenten programmatiskt i en Fabric notebook-fil. Om du vill avgöra om Fabric-dataagenten har ett publicerat URL-värde väljer du Settings 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:

Screenshot som visar att en Fabric dataagent inte har ett publicerat URL-värde före publikation.

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 den Fabric notebook-filen. På så sätt kan du fråga Fabric dataagenten genom att anropa api:et för Fabric-dataagenten i en Fabric notebook-fil. Klistra in den kopierade URL:en i det här kodfragmentet. Ersätt sedan frågan med 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 notebook-session när den är klar för att frigöra Fabric-kapacitet.

Anmärkning

Justera versionslås (openai, synapseml, pandas, tqdm) till de senaste verifierade versionerna för din Fabric-körning om de aktuella versionerna blir föråldrade.

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