Sdílet prostřednictvím


Příklad datového agenta Fabric s datovou sadou AdventureWorks (Preview)

Tento článek ukazuje, jak nastavit agenta dat v Microsoft Fabric pomocí lakehouse jako ukázkového zdroje dat. Nejprve vytvoříme a naplníme lakehouse, pak vytvoříme agenta pro Fabric data a přidáme do něj lakehouse. Pokud už máte sémantický model Power BI (s potřebnými oprávněními ke čtení a zápisu), sklad, databázi KQL nebo ontologii, postupujte podle stejných kroků a vyberte tento zdroj. I když tento návod používá lakehouse, vzor je stejný pro ostatní datové zdroje – liší se pouze výběr zdroje.

Důležité

Tato funkce je ve verzi Preview.

Požadavky

Důležité

Ujistěte se, že je v administračním portálu Power BI povoleno samostatné prostředí Copilot (Nastavení tenanta > Copilot > samostatná zkušenost s Copilot). Pokud není povolená, nebudete moct používat datového agenta ve scénářích Copilotu, i když jsou zapnuté jiné přepínače tenanta Copilot. Podrobnosti najdete v tématu Copilot v nastavení tenanta Power BI.

Vytvořte lakehouse pomocí AdventureWorksLH

Nejprve vytvořte jezerní dům a naplňte ho potřebnými daty.

Pokud už máte instanci AdventureWorksLH v jezeře (nebo skladu), můžete tento krok přeskočit. Pokud ne, můžete pomocí následujících pokynů z poznámkového bloku Fabric naplnit jezero daty.

  1. V pracovním prostoru, ve kterém chcete vytvořit datového agenta Fabric, vytvořte nový poznámkový blok.

  2. Na levé straně podokna Průzkumník vyberte + Zdroje dat. Tato možnost umožňuje přidat existující jezerní dům nebo vytvořit nový jezerní dům. Kvůli přehlednosti vytvořte nový jezerní dům a přiřaďte mu název.

  3. Do horní buňky přidejte následující fragment kódu:

    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. Vyberte Spustit vše.

Snímek obrazovky s poznámkovým blokem s kódem pro nahrání AdventureWorks

Po několika minutách se datové úložiště naplní potřebnými daty.

Upozornění

Poznámkové bloky, které pokračují v běhu (například kvůli nekonečné smyčce nebo konstantnímu dotazování), můžou využívat kapacitu služby Fabric neomezeně dlouhou dobu. Po dokončení načítání dat zastavte všechny aktivní buňky a ukončete relaci poznámkového bloku (panel nástrojů > Poznámkový blok), pokud ji už nepotřebujete. Vyhněte se přidávání dlouhotrvajících smyček bez časového limitu.

Vytvoření datového agenta Fabric

Pokud chcete vytvořit nového datového agenta Fabric, přejděte do pracovního prostoru a vyberte tlačítko + Nová položka, jak je ukázáno na tomto snímku obrazovky.

Snímek obrazovky znázorňující, kde vytvořit datové agenty Fabric

Na kartě Všechny položky vyhledejte agenta dat Fabric, abyste našli příslušné možnosti. Po výběru se zobrazí výzva, abyste zadali název datového agenta Fabric, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky znázorňující, kde zadat název datového agenta Fabric

Po zadání názvu pokračujte následujícími kroky a zarovnejte datového agenta Fabric s vašimi konkrétními požadavky.

Výběr dat

Vyberte lakehouse, který jste vytvořili v předchozím kroku, a pak vyberte Přidat, jak je znázorněno na následujícím snímku obrazovky.

Snímek obrazovky zobrazující krok přidání lakehouse.

Po přidání lakehouse jako zdroje dat se v podokně Explorer na levé straně stránky agenta dat Fabric zobrazí název lakehouse. Výběrem lakehouse zobrazíte všechny dostupné tabulky. Pomocí zaškrtávacích políček vyberte tabulky, které chcete zpřístupnit umělé inteligenci. V tomto scénáři vyberte tyto tabulky:

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

snímek obrazovky znázorňující, kde můžete vybrat tabulky pro AI

Uveďte pokyny

Pokud chcete přidat pokyny, vyberte tlačítko Pokyny agenta dat a otevřete podokno s pokyny vpravo. Můžete přidat následující pokyny.

Zdroj dat AdventureWorksLH obsahuje informace ze tří tabulek:

  • dimcustomer, podrobné demografické údaje o zákaznících a kontaktní údaje
  • dimdate, pro data související s datem – například kalendářní a fiskální informace
  • dimgeography, pro geografické podrobnosti, včetně názvů měst a kódů oblastí zemí.

Tento zdroj dat použijte pro dotazy a analýzy, které zahrnují podrobnosti o zákaznících, události založené na čase a zeměpisná umístění.

snímek obrazovky ukazující, kde můžete poskytnout pokyny umělé inteligenci.

Uveďte příklady

Pokud chcete přidat ukázkové dotazy, vyberte tlačítko Ukázkové dotazy a otevřete napravo podokno ukázkových dotazů. Toto podokno poskytuje možnosti pro přidání nebo úpravu ukázkových dotazů pro všechny podporované zdroje dat. Pro každý zdroj dat můžete vybrat Přidat nebo upravit ukázkové dotazy a zadat relevantní příklady, jak je znázorněno na následujícím snímku obrazovky:

snímek obrazovky ukazující, kde můžete přidat příklady, které zadáte do AI.

Tady byste měli přidat ukázkové dotazy pro zdroj dat lakehouse, který jste vytvořili.

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

Snímek obrazovky znázorňující přidání příkladů SQL

Poznámka:

Přidání ukázkových párů dotazů/otázek není v současné době podporováno pro zdroje dat sémantických modelů Power BI.

Testování a revize datového agenta Fabric

Teď, když jste nakonfigurovali datového agenta Fabric, přidali pokyny pro agenta pro data Fabric a zadali ukázkové dotazy pro lakehouse, můžete s ním pracovat tak, že položíte otázky a dostanete odpovědi. Při dalším testování můžete přidat další příklady a upřesnit pokyny, abyste dále zlepšili výkon datového agenta Fabric. Spolupracujte s kolegy a shromážděte zpětnou vazbu a na základě jejich vstupu zajistěte, aby zadané ukázkové dotazy a pokyny odpovídaly typům otázek, které chtějí položit.

Publikování datového agenta Fabric

Po ověření výkonu datového agenta Fabric se můžete rozhodnout ho publikovat, abyste ho mohli sdílet s kolegy, kteří chtějí provádět otázky a odpovědi na data. V tomto případě vyberte Publikovat, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky znázorňující výběr možnosti Publikovat

Otevře se okno Agent pro publikování dat, jak je znázorněno na tomto snímku obrazovky.

Snímek obrazovky znázorňující funkci publikování datového agenta

V této sekci vyberte Publikovat, abyste publikovali agenta Fabric pro data. Zobrazí se publikovaná adresa URL datového agenta Fabric, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky zobrazující publikovanou adresu URL

Použití datového agenta Fabric v Copilotu v Power BI

Poté, co ho publikujete, můžete pomocí Copilotu v Power BI pracovat s datovým agentem Fabric. Pomocí copilotu v Power BI můžete přímo využívat datového agenta a další položky (například sestavy nebo sémantické modely), aniž byste mezi nimi museli přepínat.

Výběrem tlačítka Copilot v levém navigačním podokně otevřete Copilot v Power BI. V dalším kroku vyberte Přidat položky pro lepší výsledky v textovém poli v dolní části a přidejte datového agenta. V okně, které se otevře, vyberte datové agenty . Uvidíte jenom datové agenty, ke kterým máte oprávnění. Zvolte požadovaného datového agenta a vyberte Potvrdit. Tento příklad ukazuje, jak pracovat s jedním datovým agentem, ale můžete přidat další položky – například další datové agenty, sestavy nebo sémantické modely. Následující snímek obrazovky znázorňuje kroky s jedním datovým agentem:

Snímek obrazovky s tlačítkem Copilot a tlačítkem pro přidání položek, jako jsou datoví agenti

Teď, když jste do Copilotu v Power BI přidali datového agenta, můžete pokládat jakékoli otázky související s vaším datovým agentem Fabric, jak je znázorněno na následujícím snímku obrazovky:

Snímek obrazovky znázorňující odpověď na otázku Copilot

Programové použití datového agenta Fabric

Datového agenta Fabric můžete použít programově v poznámkovém bloku Fabric. Pokud chcete zjistit, jestli má datový agent fabric publikovanou hodnotu adresy URL, vyberte Nastavení, jak je znázorněno na následujícím snímku obrazovky:

Snímek obrazovky znázorňující výběr nastavení datového agenta Fabric

Před publikováním datového agenta Fabric nemá publikovanou hodnotu adresy URL, jak je znázorněno na následujícím snímku obrazovky:

Snímek obrazovky znázorňující, že datový agent fabric nemá před publikováním publikovanou hodnotu adresy URL

Pokud jste ještě nepublikovali agenta dat Fabric, můžete ho publikovat podle pokynů v předchozích krocích. Pak můžete zkopírovat publikovanou adresu URL a použít ji v poznámkovém bloku Fabric. Tímto způsobem můžete dotazovat datového agenta Fabric tím, že v poznámkovém bloku Fabric provedete volání rozhraní API datového agenta Fabric. Vložte zkopírovanou adresu URL do tohoto fragmentu kódu. Pak tuto otázku nahraďte libovolným dotazem, který je relevantní pro vašeho datového agenta Fabric. Tento příklad používá \<generic published URL value\> jako adresu URL.

Důležité

Při programovém volání datového agenta implementujte:

  1. Časový limit dotazování (viz příklad níže), abyste se vyhnuli nekonečným smyčkám.
  2. Minimální frekvence dotazování (začíná na 2–5 sekundách, zvýší se pouze v případě potřeby).
  3. Vyčištění vytvořených vláken či prostředků po jejich dokončení.
  4. Ukončení relace poznámkového bloku po dokončení, aby se uvolnila kapacita Fabric.

Poznámka:

Pokud budou tyto přesné verze zastaralé, upravte připnutí verzí (openai, synapseml, pandas, tqdm) na nejnovější ověřené verze modulu runtime 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)