Delen via


Voorbeeld van AI-vaardigheden met de AdventureWorks-gegevensset (preview)

In dit artikel wordt beschreven hoe u een AI-vaardigheid instelt met behulp van een lakehouse als gegevensbron. Ter illustratie van het proces maken we eerst een lakehouse en voegen er vervolgens gegevens aan toe. Vervolgens maken we een AI-vaardigheid en configureren we het lakehouse als gegevensbron. Als u al een semantisch Power BI-model (met de benodigde lees-/schrijfmachtigingen), een magazijn of een KQL-database hebt, kunt u dezelfde stappen volgen nadat u de AI-vaardigheid hebt gemaakt om uw gegevensbronnen toe te voegen. Hoewel de stappen die hier worden weergegeven zich richten op het lakehouse, is het proces vergelijkbaar voor andere gegevensbronnen. U hoeft alleen aanpassingen aan te brengen op basis van uw specifieke selectie.

Belangrijk

Deze functie is beschikbaar als preview-versie.

Vereisten

Een lakehouse maken met AdventureWorksLH

Maak eerst een lakehouse en vul deze met de benodigde gegevens.

Als u al een exemplaar van AdventureWorksLH in een lakehouse (of een magazijn) hebt, kunt u deze stap overslaan. Zo niet, dan kunt u de volgende instructies uit een Fabric-notebook gebruiken om het lakehouse te vullen met de gegevens.

  1. Maak een nieuw notitieblok in de werkruimte waar u uw AI-vaardigheid wilt maken.

  2. Selecteer + gegevensbronnen aan de linkerkant van het deelvenster Explorer. Met deze optie kunt u een bestaand lakehouse toevoegen of een nieuw lakehouse maken. Maak voor de duidelijkheid een nieuw lakehouse en wijs er een naam aan toe.

  3. Voeg in de bovenste cel het volgende codefragment toe:

    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. Selecteer Alles uitvoeren.

    Schermopname van een notebook met de AdventureWorks-uploadcode.

Binnen enkele minuten wordt het lakehouse gevuld met de benodigde gegevens.

Een AI-vaardigheid maken

Als u een nieuwe AI-vaardigheid wilt maken, gaat u naar uw werkruimte en selecteert u de knop + Nieuw item, zoals wordt weergegeven in deze schermopname:

Schermopname die laat zien waar AI-vaardigheden te maken zijn.

Zoek op het tabblad Alle items naar AI-vaardigheid om de juiste optie te vinden. Zodra deze optie is geselecteerd, wordt u gevraagd een naam op te geven voor uw AI-vaardigheid, zoals wordt weergegeven in deze schermopname:

schermopname die laat zien waar u een naam voor AI-vaardigheden kunt opgeven.

Nadat u de naam hebt ingevoerd, gaat u verder met de volgende stappen om de AI-vaardigheid af te stemmen op uw specifieke vereisten.

Selecteer de gegevens

Selecteer het lakehouse dat u in de vorige stap hebt gemaakt en selecteer vervolgens Toevoegen. Zodra het lakehouse is toegevoegd als gegevensbron, toont het deelvenster Explorer aan de linkerkant van de AI-vaardighedenpagina de naam van het lakehouse. Selecteer het lakehouse om alle beschikbare tabellen weer te geven. Gebruik de selectievakjes om de tabellen te selecteren die u beschikbaar wilt maken voor de AI. Selecteer voor dit scenario de volgende tabellen:

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

schermopname die laat zien waar u tabellen voor AI kunt selecteren.

Instructies opgeven

Als u AI-instructies wilt toevoegen, selecteert u de knop AI-instructies om het deelvenster AI-instructies aan de rechterkant te openen. U kunt de volgende instructies toevoegen.

De AdventureWorksLH gegevensbron bevat informatie uit drie tabellen:

  • dimcustomer, voor gedetailleerde demografische gegevens van klanten en contactgegevens
  • dimdate, voor datumgerelateerde gegevens, bijvoorbeeld kalender- en fiscale gegevens
  • dimgeography, voor geografische details, waaronder stadsnamen en landregiocodes.

Gebruik deze gegevensbron voor query's en analyses die betrekking hebben op klantgegevens, tijdgebeurtenissen en geografische locaties.

schermopname die laat zien waar u de instructies voor de AI kunt opgeven.

Voorbeelden opgeven

Als u voorbeeldquery's wilt toevoegen, selecteert u de knop Voorbeeldquery's om het deelvenster voorbeeldquery's rechts te openen. Dit deelvenster bevat opties voor het toevoegen of bewerken van voorbeeldquery's voor alle ondersteunde gegevensbronnen. Voor elke gegevensbron kunt u Voorbeeldquery's toevoegen of bewerken selecteren om de relevante voorbeelden in te voeren, zoals wordt weergegeven in de volgende schermopname:

schermopname die laat zien waar u de voorbeelden kunt toevoegen die u aan de AI verstrekt.

Hier moet u voorbeeldquery's toevoegen voor de lakehouse-gegevensbron die u hebt gemaakt.

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

Schermopname van het toevoegen van SQL-voorbeelden.

Notitie

Het toevoegen van voorbeeldquery-/vraagparen wordt momenteel niet ondersteund voor gegevensbronnen van het semantische Power BI-model.

De AI-vaardigheid testen en herzien

Nu u de AI-vaardigheid hebt geconfigureerd, AI-instructies hebt toegevoegd en voorbeeldquery's voor het lakehouse hebt opgegeven, kunt u hiermee communiceren door vragen te stellen en antwoorden te ontvangen. Wanneer u doorgaat met testen, kunt u meer voorbeelden toevoegen en de instructies verfijnen om de prestaties van de AI-vaardigheid verder te verbeteren. Werk samen met uw collega's om feedback te verzamelen en zorg ervoor dat de opgegeven voorbeeldquery's en instructies overeenkomen met de typen vragen die ze willen stellen.

De AI-vaardigheid programmatisch gebruiken

U kunt de AI-vaardigheid programmatisch gebruiken in een Fabric-notebook. Als u wilt bepalen of de AI-vaardigheid een gepubliceerde URL-waarde heeft, selecteert u Instellingen, zoals wordt weergegeven in deze schermopname:

Schermopname van de selectie van instellingen voor AI-vaardigheden.

Voordat u de AI-vaardigheid publiceert, heeft deze geen gepubliceerde URL-waarde, zoals wordt weergegeven in deze schermopname:

Schermopname die laat zien dat een AI-vaardigheid geen gepubliceerde URL-waarde heeft voordat deze wordt gepubliceerd.

Nadat u de prestaties van de AI-vaardigheid hebt gevalideerd, kunt u besluiten deze te publiceren, zodat u deze vervolgens kunt delen met uw collega's die Q&A over gegevens willen uitvoeren. In dit geval selecteert u Publiceren, zoals wordt weergegeven in deze schermopname:

Schermopname van de selectie van de optie Publiceren.

De gepubliceerde URL voor de AI-vaardigheid wordt weergegeven, zoals wordt weergegeven in deze schermopname:

Schermopname van de gepubliceerde URL.

Vervolgens kunt u de gepubliceerde URL kopiƫren en gebruiken in het Fabric-notebook. Op deze manier kunt u een query uitvoeren op de AI-vaardigheid door aanroepen uit te voeren naar de API voor AI-vaardigheden in een Fabric-notebook. Plak de gekopieerde URL in dit codefragment. Vervang vervolgens de vraag door een query die relevant is voor uw AI-vaardigheid. In dit voorbeeld wordt de URL gebruikt \<generic published URL value\> .

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