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 betaalde F64- of hogere capaciteitsresource
- Tenantswitch voor AI-vaardigheden is ingeschakeld.
- Copilot-tenantswitch is ingeschakeld.
- Cross-geo processing voor AI is ingeschakeld.
- Cross-geo-opslag voor AI is ingeschakeld.
- Een magazijn, lakehouse, semantische Power BI-modellen en KQL-databases met gegevens.
- Power BI-semantische modellen via XMLA-eindpunt-tenantwissel is ingeschakeld voor Power BI-semantische modelgegevensbronnen.
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.
Maak een nieuw notitieblok in de werkruimte waar u uw AI-vaardigheid wilt maken.
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.
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)
Selecteer Alles uitvoeren.
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:
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:
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
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.
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:
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
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:
Voordat u de AI-vaardigheid publiceert, heeft deze geen gepubliceerde URL-waarde, zoals wordt weergegeven in deze schermopname:
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:
De gepubliceerde URL voor de AI-vaardigheid wordt weergegeven, zoals wordt weergegeven in deze schermopname:
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)