L’esempio relativo alla competenza IA con il set di dati (anteprima) AdventureWorks
Questo articolo descrive come configurare un'abilità di intelligenza artificiale utilizzando un lakehouse come fonte di dati. Per illustrare il processo, creiamo prima una lakehouse e quindi aggiungiamo dati. Quindi, creiamo una skill di intelligenza artificiale e configuriamo la lakehouse come origine dati. Se si dispone già di un modello semantico di Power BI (con le autorizzazioni di lettura/scrittura necessarie), un warehouse o un database KQL, è possibile seguire la stessa procedura dopo aver creato la competenza di intelligenza artificiale per aggiungere le origini dati. Mentre i passaggi illustrati qui si concentrano sul lakehouse, il processo è simile per altre origini dati; sarà sufficiente apportare modifiche in base alla selezione specifica.
Importante
Questa funzionalità si trova in anteprima.
Prerequisiti
- Una risorsa di capacità Fabric a pagamento F64 o superiore
- L'opzione del tenant competenze di IA è abilitata.
- L'opzione del tenant di Copilot è abilitata.
- l'elaborazione tra aree geografiche per di intelligenza artificiale è abilitata.
- L'archiviazione tra aree geografiche per l'intelligenza artificiale è abilitata.
- Un magazzino, un lakehouse, modelli semantici di Power BI e database KQL con dati.
- La commutazione del tenant per i modelli semantici di Power BI tramite gli endpoint XMLA è abilitata per le origini dati dei modelli semantici di Power BI.
Creare una lakehouse con AdventureWorksLH
Prima di tutto, creare una lakehouse e popolarla con i dati necessari.
Se hai già un'istanza di AdventureWorksLH in una lakehouse (o in un magazzino), puoi saltare questo passaggio. In caso contrario, è possibile usare le istruzioni seguenti da un notebook di Fabric per popolare il lakehouse con i dati.
Creare un nuovo notebook nell'area di lavoro in cui si vuole creare la competenza di intelligenza artificiale.
Sul lato sinistro del riquadro Esplora selezionare + Origini dati. Questa opzione consente di aggiungere una lakehouse esistente o di creare un nuovo lakehouse. Per maggiore chiarezza, creare una nuova lakehouse e assegnarvi un nome.
Nella cella superiore, aggiungere il seguente frammento di codice:
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)
Selezionare Esegui tutti.
Dopo alcuni minuti, il lakehouse si popola con i dati necessari.
Creare una competenza di IA
Per creare una nuova competenza di intelligenza artificiale, passare all'area di lavoro e selezionare il pulsante + Nuovo elemento, come illustrato in questo screenshot:
Nella scheda Tutti gli elementi, cercare abilità di intelligenza artificiale per individuare l'opzione appropriata. Una volta selezionato, viene richiesto di fornire un nome per la skill di intelligenza artificiale, come illustrato in questo screenshot:
Dopo aver immesso il nome, procedere con i passaggi seguenti per allineare la competenza di intelligenza artificiale ai requisiti specifici.
Selezionare i dati
Seleziona il lakehouse che hai creato nel passaggio precedente e poi seleziona Aggiungi. Dopo aver aggiunto il lakehouse come origine dati, il riquadro Explorer sul lato sinistro della pagina della competenza di intelligenza artificiale mostra il nome del lakehouse. Selezionare il lakehouse per visualizzare tutte le tabelle disponibili. Usare le caselle di controllo per selezionare le tabelle da rendere disponibili per l'intelligenza artificiale. Per questo scenario, selezionare queste tabelle:
dimcustomer
dimdate
dimgeography
dimproduct
dimproductcategory
dimpromotion
dimreseller
dimsalesterritory
factinternetsales
cactresellersales
Fornire istruzioni
Per aggiungere istruzioni per l'intelligenza artificiale, selezionare il pulsante istruzioni per intelligenza artificiale per aprire il riquadro Istruzioni per intelligenza artificiale a destra. È possibile aggiungere le istruzioni seguenti.
L'origine dati AdventureWorksLH
contiene informazioni di tre tabelle:
-
dimcustomer
, per informazioni dettagliate sui dati demografici e sui contatti dei clienti -
dimdate
, per i dati relativi alla data, ad esempio calendario e informazioni fiscali -
dimgeography
, per i dettagli geografici, inclusi i nomi delle città e i codici dell'area geografica.
Usare questa origine dati per query e analisi che coinvolgono i dettagli dei clienti, gli eventi basati sul tempo e le posizioni geografiche.
Fornire esempi
Per aggiungere query di esempio, selezionare il pulsante Query di esempio per aprire il riquadro di esempio delle query a destra. Questo riquadro offre opzioni per aggiungere o modificare query di esempio per tutte le origini dati supportate. Per ogni origine dati, è possibile selezionare Aggiungi o Modifica query di esempio per immettere gli esempi pertinenti, come illustrato nello screenshot seguente:
In questo caso è necessario aggiungere query di esempio per l'origine dati lakehouse creata.
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
Nota
L'aggiunta di coppie di query/domande di esempio non è attualmente supportata per le origini dati del modello semantico di Power BI.
Testare e rivedere la competenza IA
Ora che è stata configurata la competenza di intelligenza artificiale, sono state aggiunte istruzioni di intelligenza artificiale e sono state fornite query di esempio per il lakehouse, è possibile interagire con essa ponendo domande e ricevendo risposte. Man mano che si continua a testare, è possibile aggiungere altri esempi e perfezionare le istruzioni per migliorare ulteriormente le prestazioni della competenza di intelligenza artificiale. Collaborare con i colleghi per raccogliere commenti e suggerimenti e, in base all'input, assicurarsi che le query di esempio e le istruzioni fornite siano allineate ai tipi di domande che vogliono porre.
Utilizzare la competenza IA a livello di codice
È possibile usare la competenza a livello di codice all'interno di un notebook di Fabric. Per determinare se la competenza IA ha un valore URL pubblicato, selezionare Impostazioni, come illustrato in questo screenshot:
Prima di pubblicare la competenza IA, non c’è un valore URL pubblicato, come illustrato in questo screenshot:
Dopo aver convalidato le prestazioni della competenza di intelligenza artificiale, è possibile decidere di pubblicarlo in modo da poterlo condividere con i colleghi che vogliono eseguire Q&A sui dati. In tal caso, selezionare Pubblica, come illustrato in questo screenshot:
Viene visualizzato l'URL pubblicato per la competenza IA, come illustrato in questo screenshot:
Successivamente, è possibile copiare l'URL pubblicato e usarlo nel notebook di Fabric. In questo modo, è possibile eseguire query sulla competenza IA effettuando chiamate all'API delle competenze IA in un notebook di Fabric. Incollare l'URL copiato in questo frammento di codice. Quindi, sostituisci la domanda con una qualsiasi query pertinente alle tue abilità di intelligenza artificiale. Questo esempio usa \<generic published URL value\>
come 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)