Dela via


EXEMPEL på AI-kunskaper med AdventureWorks-datamängden (förhandsversion)

Den här artikeln beskriver hur du konfigurerar en AI-kompetens med hjälp av ett lakehouse som datakälla. För att illustrera processen skapar vi först ett lakehouse och lägger sedan till data i den. Sedan skapar vi en AI-färdighet och konfigurerar lakehouse som datakälla. Om du redan har en Power BI-semantisk modell (med nödvändiga läs-/skrivbehörigheter), ett lager eller en KQL-databas kan du följa samma steg när du har skapat AI-färdigheten för att lägga till dina datakällor. Även om stegen som visas här fokuserar på lakehouse är processen liknande för andra datakällor – du behöver bara göra justeringar baserat på ditt specifika val.

Viktigt!

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

Förutsättningar

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 lakehouse (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 AI-kompetens.

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

    Skärmbild som visar en notebook-fil med uppladdningskoden AdventureWorks.

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

Skapa en AI-färdighet

Om du vill skapa en ny AI-färdighet 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 kan skapa AI-kunskaper.

På fliken Alla objekt söker du efter AI-kompetens för att hitta rätt alternativ. När du har valt det uppmanas du att ange ett namn för din AI-kompetens, som du ser i den här skärmbilden:

Skärmbild som visar var du anger namnet på AI-kompetensen.

När du har angett namnet fortsätter du med följande steg för att anpassa AI-kompetensen till dina specifika krav.

Välj data

Välj det lakehouse som du skapade i föregående steg och välj sedan Lägg till. När lakehouse har lagts till som datakälla visar fönstret Explorer till vänster på AI-färdighetssidan 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
  • cactresellersales

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

Ge instruktioner

Om du vill lägga till AI-instruktioner väljer du knappen AI-instruktioner för att öppna fönstret AI-instruktioner 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 datakällor för Power BI-semantikmodeller.

Testa och revidera AI-kompetensen

Nu när du har konfigurerat AI-färdigheten, lagt till AI-instruktioner 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 AI-kompetensens prestanda. 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.

Använda AI-färdigheten programmatiskt

Du kan använda AI-färdigheten programmatiskt i en Fabric-notebook-fil. Om du vill avgöra om AI-färdigheten har ett publicerat URL-värde eller inte väljer du Inställningar, som du ser i den här skärmbilden:

Skärmbild som visar val av AI-kompetensinställningar.

Innan du publicerar AI-färdigheten har den inget publicerat URL-värde, som du ser i den här skärmbilden:

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

När du har verifierat AI-kompetensens prestanda kan du välja att publicera den så att du sedan kan dela den med dina kollegor som vill gö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.

Den publicerade URL:en för AI-färdigheten visas, som du ser i den här skärmbilden:

Skärmbild som visar den publicerade URL:en.

Du kan sedan kopiera den publicerade URL:en och använda den i notebook-filen Infrastruktur. På så sätt kan du fråga AI-färdigheten genom att göra anrop till AI-kunskaps-API:et 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 AI-kompetens. Det här exemplet används \<generic published URL value\> som 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)