Sdílet prostřednictvím


Příklad dovednosti AI s datovou sadou AdventureWorks (Preview)

Tento článek popisuje, jak nastavit dovednost AI s použitím lakehouse jako zdroje dat. Abychom mohli tento proces ilustrovat, nejprve vytvoříme jezero a pak do něj přidáme data. Pak vytvoříme dovednost umělé inteligence a nakonfigurujeme jezero jako zdroj dat. Pokud už máte sémantický model Power BI (s potřebnými oprávněními ke čtení a zápisu), sklad nebo databázi KQL, můžete po vytvoření dovednosti AI přidat zdroje dat stejným postupem. I když se zde uvedené kroky zaměřují na jezero, proces je podobný pro ostatní zdroje dat – stačí provést úpravy na základě vašeho konkrétního výběru.

Důležité

Tato funkce je ve verzi Preview.

Požadavky

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. Vytvořte nový poznámkový blok v pracovním prostoru, ve kterém chcete vytvořit dovednosti umělé inteligence.

  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.blob.core.windows.net/public/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.

Vytvoření dovednosti umělé inteligence

Pokud chcete vytvořit novou dovednost umělé inteligence, přejděte do svého pracovního prostoru a vyberte tlačítko + Nová položka, jak je znázorněno na tomto snímku obrazovky:

snímek obrazovky ukazující, kde můžete vytvářet dovednosti umělé inteligence.

Na kartě Všechny položky vyhledejte dovednost umělé inteligence pro nalezení příslušné možnosti. Po výběru se zobrazí výzva, abyste zadali název dovednosti AI, jak je znázorněno na tomto snímku obrazovky:

snímek obrazovky ukazující, kde zadat název dovednosti AI

Po zadání jména pokračujte následujícími kroky, abyste sladili dovednost AI s vašimi konkrétními požadavky.

Výběr dat

Vyberte lakehouse, který jste vytvořili v předchozím kroku, a potom vyberte Přidat. Po přidání objektu lakehouse jako zdroje dat se v podokně Explorer na levé straně stránky dovedností AI zobrazí název jezera. 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
  • cactresellersales

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

Uveďte pokyny

Pokud chcete přidat pokyny pro AI, vyberte tlačítko pokyny pro AI a vpravo otevřete podokno s pokyny pro AI. 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 pro zadání relevantních příkladů, 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 dovednosti AI

Teď, když jste nakonfigurovali dovednost AI, přidali instrukce AI a poskytli ukázkové dotazy na jezeře, můžete s ní pracovat tak, že položíte otázky a dostanete odpovědi. Když budete pokračovat v testování, můžete přidat další příklady a upřesnit pokyny, abyste dále zlepšili výkon dovednosti AI. 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.

Použití dovednosti AI prostřednictvím kódu programu

Dovednosti AI můžete použít programově v poznámkovém bloku Fabric. Pokud chcete zjistit, jestli má dovednost AI publikovanou hodnotu adresy URL, vyberte Nastavení, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky s výběrem nastavení dovedností AI

Před publikováním dovednosti AI nemá publikovanou hodnotu adresy URL, jak je znázorněno na tomto snímku obrazovky:

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

Po ověření výkonu dovednosti AI se můžete rozhodnout ji publikovat, abyste ji mohli sdílet s kolegy, kteří chtějí provádět Q&A přes 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

Zobrazí se publikovaná adresa URL dovednosti AI, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky zobrazující publikovanou adresu URL

Pak můžete zkopírovat publikovanou adresu URL a použít ji v poznámkovém bloku Infrastruktury. Tímto způsobem můžete dotazovat dovednosti AI voláním rozhraní API pro dovednosti AI v poznámkovém bloku 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ši dovednost umělé inteligence. Tento příklad se používá \<generic published URL value\> jako adresa URL.

%pip install "openai==1.14.1"
%pip install httpx==0.27.2
import requests
import json
import pprint
import typing as t
import time
import uuid

from openai import OpenAI
from openai._exceptions import APIStatusError
from openai._models import FinalRequestOptions
from openai._types import Omit
from openai._utils import is_given
from synapse.ml.mlflow import get_mlflow_env_config
from sempy.fabric._token_provider import SynapseTokenProvider
 
base_url = "https://<generic published base URL value>"
question = "What datasources 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
while run.status == "queued" or run.status == "in_progress":
    run = fabric_client.beta.threads.runs.retrieve(
        thread_id=thread.id,
        run_id=run.id,
    )
    print(run.status)
    time.sleep(2)

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