Del via


Eksempel på AI-færdigheder med datasættet AdventureWorks (prøveversion)

I denne artikel beskrives det, hvordan du konfigurerer en AI-færdighed ved hjælp af et lakehouse som datakilde. For at illustrere processen opretter vi først et lakehouse og derefter føjer data til den. Derefter opretter vi en AI-færdighed og konfigurerer lakehouse som datakilde. Hvis du allerede har en semantisk Power BI-model (med de nødvendige læse-/skrivetilladelser), et lager eller en KQL-database, kan du følge de samme trin, når du har oprettet AI-færdighederne for at tilføje dine datakilder. Mens de trin, der vises her, fokuserer på lakehouse, er processen den samme for andre datakilder – du skal bare foretage justeringer baseret på dit specifikke valg.

Vigtigt

Denne funktion er en prøveversion.

Forudsætninger

Opret et lakehouse med AdventureWorksLH

Først skal du oprette et lakehouse og udfylde det med de nødvendige data.

Hvis du allerede har en forekomst af AdventureWorksLH i et lakehouse (eller et lager), kan du springe dette trin over. Hvis ikke, kan du bruge følgende instruktioner fra en Fabric-notesbog til at udfylde lakehouse'et med dataene.

  1. Opret en ny notesbog i arbejdsområdet, hvor du vil oprette dine AI-færdigheder.

  2. Vælg + Datakilder i venstre side af ruden Stifinder. Denne indstilling giver dig mulighed for at tilføje et eksisterende lakehouse eller oprette et nyt lakehouse. Af hensyn til klarheden skal du oprette et nyt lakehouse og tildele et navn til det.

  3. Tilføj følgende kodestykke i den øverste celle:

    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ælg Kør alle.

    Skærmbillede, der viser en notesbog med uploadkoden til AdventureWorks.

Efter et par minutter udfylder lakehouse med de nødvendige data.

Opret en AI-færdighed

Hvis du vil oprette en ny AI-færdighed, skal du navigere til dit arbejdsområde og vælge knappen + Nyt element, som vist på dette skærmbillede:

Skærmbillede, der viser, hvor du kan oprette AI-færdigheder.

Under fanen Alle elementer skal du søge efter AI-færdigheder for at finde den relevante indstilling. Når du har valgt, bliver du bedt om at angive et navn til dine AI-færdigheder som vist på dette skærmbillede:

Skærmbillede, der viser, hvor du kan angive navn på AI-færdigheder.

Når du har angivet navnet, skal du fortsætte med følgende trin for at tilpasse AI-færdighederne til dine specifikke krav.

Vælg dataene

Vælg det lakehouse, du oprettede i det forrige trin, og vælg derefter Tilføj. Når lakehouse er tilføjet som en datakilde, viser ruden Explorer i venstre side af ai-kompetencesiden lakehouse-navnet. Vælg lakehouse for at få vist alle tilgængelige tabeller. Brug afkrydsningsfelterne til at vælge de tabeller, du vil gøre tilgængelige for AI. I dette scenarie skal du vælge disse tabeller:

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

Skærmbillede, der viser, hvor du kan vælge tabeller til AI.

Angiv instruktioner

Hvis du vil tilføje AI-instruktioner, skal du vælge knappen AI-instruktioner for at åbne ruden MED AI-instruktioner til højre. Du kan tilføje følgende instruktioner.

Den AdventureWorksLH datakilde indeholder oplysninger fra tre tabeller:

  • dimcustomerfor at få detaljerede kundedemografi- og kontaktoplysninger
  • dimdatefor datorelaterede data , f.eks. kalender- og regnskabsoplysninger
  • dimgeographyfor geografiske oplysninger, herunder bynavne og landeområdekoder.

Brug denne datakilde til forespørgsler og analyser, der omfatter kundeoplysninger, tidsbaserede hændelser og geografiske placeringer.

Skærmbillede, der viser, hvor du kan angive instruktionerne til AI.

Angiv eksempler

Hvis du vil tilføje eksempelforespørgsler, skal du vælge knappen Eksempelforespørgsler for at åbne ruden med eksempelforespørgsler til højre. Denne rude indeholder indstillinger til at tilføje eller redigere eksempelforespørgsler for alle understøttede datakilder. For hver datakilde kan du vælge Tilføj eller rediger eksempelforespørgsler for at angive de relevante eksempler, som vist på følgende skærmbillede:

Skærmbillede, der viser, hvor du kan føje de eksempler, du angiver, til AI'en.

Her skal du tilføje eksempelforespørgsler for den datakilde i lakehouse,du har oprettet.

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ærmbillede, der viser tilføjelse af SQL-eksempler.

Bemærk

Tilføjelse af eksempelforespørgsels-/spørgsmålspar understøttes i øjeblikket ikke for power BI-semantiske modeldatakilder.

Test og rediger AI-færdigheden

Nu, hvor du har konfigureret AI-færdighederne, tilføjet AI-instruktioner og angivet eksempelforespørgsler for lakehouse, kan du interagere med den ved at stille spørgsmål og modtage svar. Når du fortsætter med at teste, kan du tilføje flere eksempler og tilpasse instruktionerne for yderligere at forbedre ydeevnen af AI-færdighederne. Samarbejd med dine kolleger om at indsamle feedback, og sørg for, at de angivne eksempelforespørgsler og instruktioner er i overensstemmelse med de typer spørgsmål, de vil stille.

Brug AI-færdighederne programmeringsmæssigt

Du kan bruge AI-færdighederne programmeringsmæssigt i en Fabric-notesbog. Hvis du vil finde ud af, om AI-færdigheden har en publiceret URL-værdi eller ej, skal du vælge Indstillinger som vist på dette skærmbillede:

Skærmbillede, der viser valg af ai-kompetenceindstillinger.

Før du publicerer AI-færdigheden, har den ikke en publiceret URL-værdi, som vist på dette skærmbillede:

Skærmbillede, der viser, at en AI-færdighed ikke har en publiceret URL-værdi før publicering.

Når du har valideret ydeevnen af AI-dygtigheden, kan du beslutte at publicere den, så du derefter kan dele den med dine kolleger, der vil udføre Q&A over data. I dette tilfælde skal du vælge Publicer som vist på dette skærmbillede:

Skærmbillede, der viser valg af indstillingen Publicer.

Den publicerede URL-adresse til AI-færdigheden vises som vist på dette skærmbillede:

Skærmbillede, der viser den publicerede URL-adresse.

Du kan derefter kopiere den publicerede URL-adresse og bruge den i Fabric-notesbogen. På denne måde kan du forespørge ai-færdighederne ved at foretage kald til AI-færdigheds-API'en i en Fabric-notesbog. Indsæt den kopierede URL-adresse i dette kodestykke. Erstat derefter spørgsmålet med en hvilken som helst forespørgsel, der er relevant for dine AI-færdigheder. Dette eksempel bruger \<generic published URL value\> som URL-adresse.

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