Del via


Eksempel på stoffdataagent med AdventureWorks-datasettet (forhåndsversjon)

Denne artikkelen viser hvordan du konfigurerer en dataagent i Microsoft Fabric ved hjelp av et innsjøhus som eksempeldatakilde. Vi oppretter og fyller først ut et innsjøhus, deretter oppretter vi en Fabric-dataagent og legger til innsjøhuset i det. Hvis du allerede har en Power BI semantisk modell (med nødvendige lese-/skrivetillatelser), et lager, en KQL-database eller en ontologi, følg de samme stegene og velg den kilden i stedet. Selv om denne gjennomgangen bruker et innsjøhus, er mønsteret det samme for andre kilder – bare datakildevalget er forskjellig.

Important

Denne funksjonen er i forhåndsvisning.

Prerequisites

Important

Kontroller at den frittstående Copilot-opplevelsen er aktivert i administrasjonsportalen for Power BI (leierinnstillinger > Copilot > frittstående Copilot-opplevelse). Hvis den ikke er aktivert, kan du ikke bruke dataagenten i Copilot-scenarioer selv om andre Copilot-leierbrytere er på. Hvis du vil ha mer informasjon, kan du se Copilot i Power BI-leierinnstillinger.

Opprett et lakehouse med AdventureWorksLH

Først oppretter du et lakehouse og fyller det ut med de nødvendige dataene.

Hvis du allerede har en forekomst av AdventureWorksLH i et lakehouse (eller et lager), kan du hoppe over dette trinnet. Hvis ikke, kan du bruke følgende instruksjoner fra en Fabric-notatblokk til å fylle ut lakehouse med dataene.

  1. Opprett en ny notatblokk i arbeidsområdet der du vil opprette fabric-dataagenten.

  2. På venstre side av Utforsker-ruten velger du + Datakilder. Med dette alternativet kan du legge til et eksisterende lakehouse eller opprette et nytt lakehouse. For klarhet, opprett et nytt innsjøhus og tilordne et navn til det.

  3. Legg til følgende kodesnutt i den øverste 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. Velg Kjør alle.

Skjermbilde som viser en notatblokk med opplastingskoden AdventureWorks.

Etter noen minutter fylles lakehouse med de nødvendige dataene.

Caution

Notatblokker som fortsetter å kjøre (for eksempel på grunn av utilsiktede uendelige løkker eller konstant avspørring), kan bruke Fabric-kapasitet på ubestemt tid. Når dataene er lastet inn, stopper du alle aktive celler og avslutter notatblokkøkten (Stopp økten på verktøylinjen > for notatblokk) hvis du ikke lenger trenger den. Unngå å legge til langvarige løkker uten tidsavbrudd.

Opprette en fabric-dataagent

Hvis du vil opprette en ny fabric-dataagent, går du til arbeidsområdet og velger knappen + Nytt element, som vist i dette skjermbildet:

Skjermbilde som viser hvor du oppretter Fabric-dataagenter.

Søk etter Fabric-dataagenten på Fanen Alle elementer for å finne det riktige alternativet. Når dette er valgt, blir du bedt om å oppgi et navn for fabric-dataagenten, som vist i dette skjermbildet:

Skjermbilde som viser hvor du skal angi navn for Fabric-dataagenten.

Når du har skrevet inn navnet, fortsetter du med følgende trinn for å justere fabric-dataagenten med dine spesifikke krav.

Velg dataene

Velg innsjøhuset du opprettet i forrige trinn, og velg deretter Legg til, som vist i følgende skjermbilde:

Skjermbilde som viser trinnet Legg til et lakehouse.

Når innsjøen er lagt til som en datakilde, viser Utforsker-ruten på venstre side av Strukturdataagent-siden navnet på innsjøen. Velg lakehouse for å vise alle tilgjengelige tabeller. Bruk avmerkingsboksene til å velge tabellene du vil gjøre tilgjengelig for kunstig intelligens. Velg disse tabellene for dette scenarioet:

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

Skjermbilde som viser hvor du kan velge tabeller for kunstig intelligens.

Gi instruksjoner

Hvis du vil legge til instruksjoner, velger du Instruksjoner for dataagent for å åpne instruksjonsruten til høyre. Du kan legge til følgende instruksjoner.

Datakilden AdventureWorksLH inneholder informasjon fra tre tabeller:

  • dimcustomer, for detaljert kundedemografi og kontaktinformasjon
  • dimdate, for datorelaterte data – for eksempel kalender- og regnskapsinformasjon
  • dimgeographyfor geografiske detaljer, inkludert bynavn og landsområdekoder.

Bruk denne datakilden for spørringer og analyser som involverer kundedetaljer, tidsbaserte hendelser og geografiske plasseringer.

Skjermbilde som viser hvor du kan gi instruksjonene til KUNSTIG INTELLIGENS.

Gi eksempler

Hvis du vil legge til eksempelspørringer, velger du Eksempelspørringer-knappen for å åpne eksempelspørringsruten til høyre. Denne ruten inneholder alternativer for å legge til eller redigere eksempelspørringer for alle støttede datakilder. For hver datakilde kan du velge Legg til eller rediger eksempelspørringer for å legge inn de relevante eksemplene, som vist i følgende skjermbilde:

Skjermbilde som viser hvor du kan legge til eksemplene du oppgir i AI-en.

Her bør du legge til eksempelspørringer for datakilden for lakehouse som du opprettet.

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

Skjermbilde som viser hvordan du legger til SQL-eksempler.

Note

Å legge til eksempelspørrings-/spørsmålspar støttes for øyeblikket ikke for datakilder for semantisk modell for Power BI.

Teste og revidere fabric-dataagenten

Nå som du har konfigurert Fabric-dataagenten, lagt til fabric-dataagentinstruksjoner og gitt eksempelspørringer for lakehouse, kan du samhandle med det ved å stille spørsmål og motta svar. Etter hvert som du fortsetter testingen, kan du legge til flere eksempler og finjustere instruksjonene for å forbedre ytelsen til Fabric-dataagenten ytterligere. Samarbeid med kollegene dine for å samle inn tilbakemeldinger, og kontroller at de angitte eksempelspørringene og instruksjonene samsvarer med spørsmålstypene de vil stille.

Publiser fabric-dataagenten

Når du har validert ytelsen til Fabric-dataagenten, kan du bestemme deg for å publisere den slik at du kan dele den med kollegene dine som ønsker å gjøre Q&A over data. I dette tilfellet velger du Publiser, som vist i dette skjermbildet:

Skjermbilde som viser valg av alternativet Publiser.

Boksen Publiser dataagent åpnes, som vist i dette skjermbildet:

Skjermbilde som viser funksjonen publiser dataagent.

I denne boksen velger du Publiser for å publisere Fabric-dataagenten. Den publiserte nettadressen for Fabric-dataagenten vises, som vist i dette skjermbildet:

Skjermbilde som viser den publiserte URL-adressen.

Bruke Fabric-dataagenten i Copilot i Power BI

Du kan bruke Copilot i Power BI til å samhandle med fabric-dataagenten etter at du har publisert den. Med Copilot i Power BI kan du bruke dataagenten og andre elementer direkte (for eksempel rapporter eller semantiske modeller) uten å måtte bytte mellom dem.

Velg Copilot-knappen i den venstre navigasjonsruten for å åpne Copilot i Power BI. Deretter velger du Legg til elementer for bedre resultater i tekstboksen nederst for å legge til dataagenten. Velg Dataagenter i vinduet som åpnes. Du kan bare se dataagentene du har tilgang til. Velg dataagenten du vil bruke, og velg Bekreft. Dette eksemplet viser hvordan du arbeider med én enkelt dataagent, men du kan legge til flere elementer – for eksempel andre dataagenter, rapporter eller semantiske modeller. Følgende skjermbilde illustrerer trinnene med én enkelt dataagent:

Skjermbilde som viser Copilot-knappen og -knappen for å legge til elementer som dataagenter.

Nå som du har lagt til dataagenten i Copilot i Power BI, kan du stille spørsmål relatert til fabric-dataagenten, som vist i følgende skjermbilde:

Skjermbilde som viser Copilot som svarer på et spørsmål.

Bruke Fabric-dataagenten programmatisk

Du kan bruke Fabric-dataagenten programmatisk i en Fabric-notatblokk. Hvis du vil finne ut om Fabric-dataagenten har en publisert URL-verdi, velger du Innstillinger, som vist i følgende skjermbilde:

Skjermbilde som viser utvalget av dataagentinnstillinger for Fabric.

Før du publiserer fabric-dataagenten, har den ikke en publisert nettadresseverdi, som vist i følgende skjermbilde:

Skjermbilde som viser at dataagenten Fabric ikke har en publisert nettadresseverdi før publisering.

Hvis du ikke har publisert fabric-dataagenten før, kan du publisere den ved å følge instruksjonene i de forrige trinnene. Deretter kan du kopiere den publiserte nettadressen og bruke den i Fabric-notatblokken. På denne måten kan du spørre fabric-dataagenten ved å ringe til Fabric-dataagent-API-en i en Fabric-notatblokk. Lim inn den kopierte URL-adressen i kodesnutten. Deretter erstatter du spørsmålet med alle spørringer som er relevante for fabric-dataagenten. Dette eksemplet brukes \<generic published URL value\> som URL-adresse.

Important

Når du kaller en dataagent programmatisk, implementerer:

  1. Et tidsavbrudd for avstemning (se eksempel nedenfor) for å unngå ubestemte løkker.
  2. Minimal avstemningsfrekvens (start på 2–5 sekunder; øk bare om nødvendig).
  3. Opprydding av opprettede tråder eller ressurser etter fullføring.
  4. Avstengning av notebook-økten når du er ferdig for å frigjøre Fabric-kapasitet.

Note

Juster versjonspinner (openai, synapseml, pandas, tqdm) til de siste validerte versjonene for Fabric-kjøretiden hvis disse eksakte versjonene blir utdaterte.

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