L’esempio relativo alla competenza IA con il set di dati (anteprima) AdventureWorks

Questo articolo illustra come configurare una competenza di intelligenza artificiale nel set di dati AdventureWorks.

Importante

Questa funzionalità si trova in anteprima.

Prerequisiti

Creare una lakehouse con AdventureWorksDW

Prima di tutto, creare una lakehouse e popolarla con i dati necessari.

Se si dispone già di un'istanza di AdventureWorksDW in un magazzino o in un lakehouse, è possibile ignorare questo passaggio. In caso contrario, creare una lakehouse da un notebook. Usare il notebook per popolare il lakehouse con i dati.

  1. Creare un nuovo notebook nell'area di lavoro in cui si vuole creare la competenza di intelligenza artificiale.

  2. Sul lato sinistro del riquadro Esplora selezionare + Origini dati. Questa opzione aggiunge una lakehouse esistente o crea una nuova lakehouse.

  3. 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)
    
  4. Selezionare Esegui tutti.

    Screenshot che mostra un notebook con il codice di caricamento AdventureWorks.

Dopo alcuni minuti, il lakehouse viene popolato con i dati necessari.

Creare una competenza di IA

  1. Per creare una nuova competenza di intelligenza artificiale, passare all'esperienza di data science e selezionare Competenza di IA.

    Screenshot che mostra dove creare competenze di IA.

  2. Inserire un nome per creare una competenza di IA.

Selezionare i dati

Selezionare il lakehouse creato e selezionare Connetti. Successivamente, selezionare le tabelle a cui si desidera che la competenza IA abbia libero accesso.

Questo esercizio utilizza queste tabelle:

  • DimCustomer
  • DimDate
  • DimGeography
  • DimProduct
  • DimProductCategory
  • DimPromotion
  • DimReseller
  • DimSalesTerritory
  • FactInternetSales
  • FactResellerSales

Fornire istruzioni

Se per prima cosa si pongono domande alla competenza di IA con le tabelle elencate selezionate, la competenza IA risponde abbastanza bene. Ad esempio, alla domanda Qual è il prodotto più venduto?, la competenza di IA risponde:

  • Long-Sleeve Logo Jersey, L

Tuttavia, la query SQL deve essere migliorata. Prima di tutto, si vede che esamina solo la tabella FactResellerSales. Ignora la tabella FactInternetSales. In secondo luogo, ordina i prodotti in base alla quantità d'ordine, laddove la voce più importante è il ricavo totale delle vendite associate al prodotto, come mostrato in questa schermata:

Screenshot che mostra il primo esempio di competenza di IA con la domanda sul prodotto maggiormente venduto.

Per migliorare la generazione di query, fornire alcune istruzioni, come illustrato nei seguenti esempi:

  • Ogni volta che si chiede quali sono i prodotti o gli articoli "più venduti", la metrica di interesse è il fatturato totale e non la quantità di ordini.
  • La tabella primaria da usare è FactInternetSales. Usare FactResellerSales solo se viene esplicitamente chiesto delle rivendite o delle vendite totali.

Riponendo la domanda si ottiene una risposta diversa, Mountain-200 Black, 46, come mostrato in questo screenshot:

Screenshot che mostra il secondo esempio di competenza di IA con la domanda sul prodotto maggiormente venduto.

Il codice SQL corrispondente viene estratto dalla tabella FactInternetSales e ordinato in base alla somma dell'importo delle vendite. L’IA segue le istruzioni.

Man mano che si sperimenta con le query, è necessario aggiungere altre istruzioni.

Questo scenario usa il seguente set di istruzioni:

  • Ogni volta che si chiede quali sono i prodotti o gli articoli "più venduti", la metrica di interesse è il fatturato e non la quantità di ordini.
  • La tabella primaria da usare è FactInternetSales. Usare FactResellerSales solo se viene esplicitamente chiesto delle rivendite o delle vendite totali.
  • Quando viene chiesto l'impatto delle promozioni, considerare l'aumento dei ricavi delle vendite, non solo il numero di unità vendute.
  • Per gli approfondimenti relativi ai clienti, concentrarsi sull'importo totale delle vendite per cliente anziché sul numero di ordini.
  • Quando si esegue un'analisi temporale, usare DimDate per estrarre intervalli di tempo specifici (ad esempio anno, mese).
  • Quando si analizzano i dati geografici, dare priorità al fatturato totale e al fatturato medio per ordine per ogni area considerata.
  • Per informazioni dettagliate sulle categorie di prodotti, usare sempre DimProductCategory per raggruppare correttamente i prodotti.
  • Quando si confrontano le vendite tra aree geografiche, usare DimSalesTerritory per ottenere informazioni dettagliate e accurate sul territorio.
  • Usare DimCurrency per uniformare i dati di vendita se si analizzano le vendite in valute diverse.
  • Per informazioni dettagliate sul prodotto, unire sempre FactInternetSales con DimProduct.
  • Usare DimPromotion per analizzare l'efficacia delle diverse campagne promozionali.
  • Per quanto riguarda le prestazioni dei rivenditori, concentrarsi sull'importo totale delle vendite e non solo sul numero di prodotti venduti.
  • Quando si analizzano le tendenze nel tempo, usare FactInternetSales e unire i dati con DimDate per raggruppare i dati per mese, trimestre o anno.
  • Verificare sempre la coerenza dei dati unendo FactInternetSales con le corrispondenti tabelle delle dimensioni.
  • Usare SUM per aggregare i dati di vendita e assicurarsi che i valori totali vengano acquisiti con precisione.
  • Classificare in ordine di priorità le metriche dei ricavi delle vendite rispetto alla quantità di ordini per misurare accuratamente l'impatto economico.
  • Raggruppare sempre in base alle dimensioni pertinenti (ad esempio, prodotto, cliente, data) in modo da ottenere informazioni dettagliate.
  • Quando viene chiesto di conoscere i dati demografici dei clienti, unire DimCustomer con le relative tabelle dei fatti.
  • Per le vendite per promozione, unire FactInternetSales a DimPromotion e raggruppare in base al nome della promozione.
  • Standardizzare i dati sulle vendite utilizzando DimCurrency per i confronti che riguardano valute diverse.
  • Usare le clausole ORDER BY per ordinare i risultati in base alla metrica di interesse (ad esempio, ricavi delle vendite, ordini totali).
  • ListPrice in DimProduct è il prezzo di vendita suggerito, mentre UnitPrice in FactInternetSales e FactResellerSales è il prezzo effettivo a cui ogni unità è stata venduta. Per la maggior parte dei casi relativi ai ricavi, si dovrebbe utilizzare il prezzo unitario.
  • Classificare i principali rivenditori in base all'importo delle vendite.

Se si copia questo testo nella casella di testo Note per il modello, l'IA farà riferimento a queste istruzioni quando genererà le query SQL.

Fornire esempi

Oltre alle istruzioni, un altro modo efficace per guidare l'IA sono gli esempi. Se ci sono domande che la competenza IA riceve spesso, o domande che richiedono unioni complesse, considerare l'aggiunta di esempi per queste domande.

Ad esempio, la domanda Quanti clienti attivi ci sono stati il 1° giugno 2013 genera alcuni SQL validi, come illustrato in questo screenshot:

Screenshot che mostra la prima domanda di esempio sul conteggio di clienti attivi per le competenze IA.

Ma questa non è una buona risposta.

Parte del problema è che non esiste una definizione formale di "cliente attivo". Ulteriori istruzioni nella casella di testo delle note al modello potrebbero essere utili, ma gli utenti potrebbero porre spesso questa domanda. È necessario assicurarsi che l'IA gestisca correttamente la domanda. La query in questione è moderatamente complessa, quindi è necessario fornire un esempio selezionando il pulsante di modifica.

Screenshot che mostra dove è possibile modificare gli esempi forniti all'intelligenza artificiale.

Poi si può caricare un esempio.

Screenshot che mostra una query SQL per la competenza IA di esempio.

Ripetendo la domanda si ottiene una risposta migliorata.

Screenshot che mostra la seconda domanda di esempio sul conteggio di clienti attivi per le competenze IA.

Gli esempi possono essere aggiunti manualmente, ma li si può anche caricare da un file JSON. Fornire esempi contenuti in un file è utile quando si hanno molte query SQL da caricare tutte insieme, evitando di doverle caricare manualmente una per una. Per questo esercizio, usare i seguenti esempi:

{
    "how many active customers did we have June 1st, 2010?": "SELECT COUNT(DISTINCT fis.CustomerKey) AS ActiveCustomerCount FROM factinternetsales fis JOIN dimdate dd ON fis.OrderDateKey = dd.DateKey WHERE dd.FullDateAlternateKey BETWEEN DATEADD(MONTH, -6, '2010-06-01') AND '2010-06-01' GROUP BY fis.CustomerKey HAVING COUNT(fis.SalesOrderNumber) >= 2;",
    "which promotion was the most impactful?": "SELECT dp.EnglishPromotionName, SUM(fis.SalesAmount) AS PromotionRevenue FROM factinternetsales fis JOIN dimpromotion dp ON fis.PromotionKey = dp.PromotionKey GROUP BY dp.EnglishPromotionName ORDER BY PromotionRevenue DESC;",
    "who are the top 5 customers by total sales amount?": "SELECT TOP 5 CONCAT(dc.FirstName, ' ', dc.LastName) AS CustomerName, SUM(fis.SalesAmount) AS TotalSpent FROM factinternetsales fis JOIN dimcustomer dc ON fis.CustomerKey = dc.CustomerKey GROUP BY CONCAT(dc.FirstName, ' ', dc.LastName) ORDER BY TotalSpent DESC;",
    "what is the total sales amount by year?": "SELECT dd.CalendarYear, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimdate dd ON fis.OrderDateKey = dd.DateKey GROUP BY dd.CalendarYear ORDER BY dd.CalendarYear;",
    "which product category generated the highest revenue?": "SELECT dpc.EnglishProductCategoryName, SUM(fis.SalesAmount) AS CategoryRevenue FROM factinternetsales fis JOIN dimproduct dp ON fis.ProductKey = dp.ProductKey JOIN dimproductcategory dpc ON dp.ProductSubcategoryKey = dpc.ProductCategoryKey GROUP BY dpc.EnglishProductCategoryName ORDER BY CategoryRevenue DESC;",
    "what is the average sales amount per order by territory?": "SELECT dst.SalesTerritoryRegion, AVG(fis.SalesAmount) AS AvgOrderValue FROM factinternetsales fis JOIN dimsalesterritory dst ON fis.SalesTerritoryKey = dst.SalesTerritoryKey GROUP BY dst.SalesTerritoryRegion ORDER BY AvgOrderValue DESC;",
    "what is the total sales amount by currency?": "SELECT dc.CurrencyName, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimcurrency dc ON fis.CurrencyKey = dc.CurrencyKey GROUP BY dc.CurrencyName ORDER BY TotalSales DESC;",
    "which product had the highest sales revenue last year?": "SELECT dp.EnglishProductName, SUM(fis.SalesAmount) AS TotalRevenue FROM factinternetsales fis JOIN dimproduct dp ON fis.ProductKey = dp.ProductKey JOIN dimdate dd ON fis.ShipDateKey = dd.DateKey WHERE dd.CalendarYear = YEAR(GETDATE()) - 1 GROUP BY dp.EnglishProductName ORDER BY TotalRevenue DESC;",
    "what are the monthly sales trends for the last year?": "SELECT dd.CalendarYear, dd.MonthNumberOfYear, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimdate dd ON fis.ShipDateKey = dd.DateKey WHERE dd.CalendarYear = YEAR(GETDATE()) - 1 GROUP BY dd.CalendarYear, dd.MonthNumberOfYear ORDER BY dd.CalendarYear, dd.MonthNumberOfYear;",
    "how did the latest promotion affect sales revenue?": "SELECT dp.EnglishPromotionName, SUM(fis.SalesAmount) AS PromotionRevenue FROM factinternetsales fis JOIN dimpromotion dp ON fis.PromotionKey = dp.PromotionKey WHERE dp.StartDate >= DATEADD(MONTH, -1, GETDATE()) GROUP BY dp.EnglishPromotionName ORDER BY PromotionRevenue DESC;",
    "which territory had the highest sales revenue?": "SELECT dst.SalesTerritoryRegion, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimsalesterritory dst ON fis.SalesTerritoryKey = dst.SalesTerritoryKey GROUP BY dst.SalesTerritoryRegion ORDER BY TotalSales DESC;",
    "who are the top 5 resellers by total sales amount?": "SELECT TOP 5 dr.ResellerName, SUM(frs.SalesAmount) AS TotalSales FROM factresellersales frs JOIN dimreseller dr ON frs.ResellerKey = dr.ResellerKey GROUP BY dr.ResellerName ORDER BY TotalSales DESC;",
    "what is the total sales amount by customer region?": "SELECT dg.EnglishCountryRegionName, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimcustomer dc ON fis.CustomerKey = dc.CustomerKey JOIN dimgeography dg ON dc.GeographyKey = dg.GeographyKey GROUP BY dg.EnglishCountryRegionName ORDER BY TotalSales DESC;",
    "which product category had the highest average sales price?": "SELECT dpc.EnglishProductCategoryName, AVG(fis.UnitPrice) AS AvgPrice FROM factinternetsales fis JOIN dimproduct dp ON fis.ProductKey = dp.ProductKey JOIN dimproductcategory dpc ON dp.ProductSubcategoryKey = dpc.ProductCategoryKey GROUP BY dpc.EnglishProductCategoryName ORDER BY AvgPrice DESC;"
}

Testare e rivedere la competenza IA

Alle competenze di IA sono stati aggiunti esempi e istruzioni. Man mano che i test procedono, altri esempi e istruzioni possono contribuire a migliorare ulteriormente la competenza IA. Collaborate con i colleghi per verificare se sono stati forniti esempi e istruzioni che coprono il tipo di domande che loro 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:

Screenshot che mostra la selezione delle impostazioni delle competenze di IA.

Prima di pubblicare la competenza IA, non c’è un valore URL pubblicato, come illustrato in questo screenshot:

Screenshot che mostra che una competenza IA prima della pubblicazione non ha valori URL pubblicati.

Dopo aver convalidato le prestazioni della competenza IA, è possibile decidere di pubblicarle. In tal caso, selezionare Pubblica, come illustrato in questo screenshot:

Screenshot che mostra la selezione dell’opzione Pubblica.

Viene visualizzato l'URL pubblicato per la competenza IA, come illustrato in questo screenshot:

Screenshot che mostra l’URL pubblicato.

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. Poi, sostituire la domanda con qualsiasi query pertinente alla competenza di IA. Questo esempio usa \<generic published URL value\> come URL.

import requests
import json
import pprint
from synapse.ml.mlflow import get_mlflow_env_config


# the URL could change if the workspace is assigned to a different capacity
url = "https://<generic published URL value>"

configs = get_mlflow_env_config()

headers = {
    "Authorization": f"Bearer {configs.driver_aad_token}",
    "Content-Type": "application/json; charset=utf-8"
}

question = "{userQuestion: \"what is an example product?\"}"

response = requests.post(url, headers=headers, data = question)

print("RESPONSE: ", response)

print("")

response = json.loads(response.content)

print(response["result"])