Exemple de compétence IA avec le jeu de données AdventureWorks (préversion)
Cet article explique comment configurer une compétence IA sur le jeu de données AdventureWorks.
Important
Cette fonctionnalité est en préversion.
Prérequis
- Ressource de capacité Fabric payante F64 ou supérieur.
- Le commutateur de locataire de compétence IA est activé.
- Commutateur de locataire Copilot activé.
- Partage entre zones géographiques pour l’IA activé, le cas échéant.
Créer un lakehouse avec AdventureWorksDW
Tout d’abord, créez un lakehouse et remplissez-le avec les données nécessaires.
Si vous disposez déjà d’une instance d’AdventureWorksDW dans un entrepôt ou lakehouse, vous pouvez ignorer cette étape. Si ce n’est pas le cas, créez un lakehouse à partir d’un notebook. Utilisez le notebook pour remplir le lakehouse avec les données.
Créez un notebook dans l’espace de travail où vous souhaitez créer votre compétence IA.
Sur le côté gauche du volet Explorateur, sélectionnez + Sources de données. Cette option permet d'ajouter un lakehouse existant ou de créer un nouveau lakehouse.
Ajoutez l’extrait de code suivant dans la cellule au sommet :
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)
Sélectionnez Exécuter tout.
Après quelques minutes, le lakehouse est rempli avec les données nécessaires.
Créer une compétence IA
Pour créer une compétence IA, accédez à l’expérience Science des données, puis sélectionnez Compétence IA.
Saisissez un nom pour créer une compétence IA.
Sélectionner les données
Sélectionnez le lakehouse que vous venez de créer, puis sélectionnez Connecter. Vous devez ensuite sélectionner les tables pour lesquelles vous souhaitez que la compétence IA dispose d’un accès disponible.
Cet exercice utilise les tables suivantes :
DimCustomer
DimDate
DimGeography
DimProduct
DimProductCategory
DimPromotion
DimReseller
DimSalesTerritory
FactInternetSales
FactResellerSales
Fournir des instructions
Lorsque vous posez d’abord les questions de compétence IA avec les tables répertoriées sélectionnées, la compétence IA y répond assez bien. Par exemple, pour la question Quel est le produit le plus vendu ?, la compétence IA retourne :
Long-Sleeve Logo Jersey, L
Toutefois, la requête SQL nécessite une amélioration. Tout d’abord, il examine uniquement la table FactResellerSales
. Il ignore la table FactInternetSales
. Ensuite, elle trie les produits par quantité de commandes, alors que le chiffre d’affaires total associé au produit est la considération la plus importante, comme illustré dans cette capture d’écran :
Pour améliorer la génération de requêtes, fournissez des instructions, comme indiqué dans ces exemples :
- Chaque fois que je demande quels sont les produits ou articles « les plus vendus », la métrique d’intérêt est le chiffre d’affaires total et non la quantité de commandes.
- La table primaire à utiliser est
FactInternetSales
. UtilisezFactResellerSales
uniquement si vous avez explicitement posé une question sur les reventes ou sur le total des ventes.
Poser à nouveau la question génère une réponse différente, Mountain-200 Black, 46
, comme illustré dans cette capture d’écran :
Le SQL correspondant extrait des données de la table FactInternetSales
, et les trie par somme du montant des ventes. L’IA a suivi les instructions.
Lorsque vous continuez à expérimenter avec les requêtes, vous devez ajouter d’autres instructions.
Ce scénario utilise l’ensemble d’instructions suivant :
- Chaque fois que je demande quels sont les produits ou articles « les plus vendus », la métrique d’intérêt est le chiffre d’affaires et non la quantité de commandes.
- La table primaire à utiliser est
FactInternetSales
. UtilisezFactResellerSales
uniquement si vous avez explicitement posé une question sur les reventes ou sur le total des ventes. - Lorsque vous souhaitez connaître l’impact des promotions, faites-le sur l’augmentation du chiffre d’affaires, pas seulement sur le nombre d’unités vendues.
- Pour obtenir des informations sur le client, concentrez-vous sur le montant total des ventes par client, plutôt que sur le nombre de commandes.
- Utilisez
DimDate
pour extraire des périodes spécifiques (p. ex. année, mois) lors de l’analyse basée sur le temps. - Lors de l’analyse des données géographiques, donnez priorité au chiffre d’affaires total et au chiffre d’affaires moyen par commande pour chaque région.
- Pour obtenir des insights sur les catégories de produits, utilisez toujours
DimProductCategory
pour regrouper les produits par catégorie. - Lorsque vous comparez les ventes entre régions, utilisez
DimSalesTerritory
pour obtenir des détails précis sur le territoire. - Utilisez
DimCurrency
pour normaliser les données de ventes si vous analysez le chiffre d’affaires dans différentes devises. - Pour obtenir des informations détaillées sur le produit, joignez
FactInternetSales
àDimProduct
. - Utilisez
DimPromotion
pour analyser l’efficacité des différentes campagnes promotionnelles. - Pour les performances des revendeurs, concentrez-vous sur le chiffre d’affaires total, et pas seulement sur le nombre de produits vendus.
- Lors de l’analyse des tendances au fil du temps, utilisez la table
FactInternetSales
et joignez-la àDimDate
pour regrouper les données par mois, trimestre ou année. - Vérifiez toujours la cohérence des données en joignant
FactInternetSales
aux tables de dimension correspondantes. - Utilisez SUM pour agréger les données de chiffre d’affaires pour vous assurer de capturer les valeurs totales avec précision.
- Donnez la priorité aux métriques de chiffre d’affaires par rapport à la quantité de commandes pour évaluer avec précision l’impact financier.
- Regroupez toujours en fonction des dimensions pertinentes (p. ex. produit, client, date) pour obtenir des insights détaillés.
- Lorsque vous souhaitez connaître les données démographiques des clients, joignez
DimCustomer
aux tables de faits pertinentes. - Pour les ventes par promotion, joignez
FactInternetSales
àDimPromotion
et regroupez par nom de promotion. - Normalisez les chiffres de vente avec
DimCurrency
pour les comparaisons impliquant différentes devises. - Utilisez des clauses
ORDER BY
pour trier les résultats selon la métrique d’intérêt (p. ex. chiffre d’affaires, commandes totales). ListPrice
dansDimProduct
est le prix de vente suggéré, tandis queUnitPrice
dansFactInternetSales
etFactResellerSales
est le prix réel auquel chaque unité a été vendue. Pour la plupart des cas d’usage liés au chiffre d’affaires, le prix unitaire doit être utilisé.- Classez les meilleurs revendeurs par montant des ventes.
Si vous copiez ce texte dans la zone de texte notes pour le modèle, l’IA fait référence à ces instructions lorsqu’elle génère ses requêtes SQL.
Fournir des exemples
En plus des instructions, les exemples sont un moyen efficace de guider l’IA. Si vous avez des questions que votre compétence IA reçoit souvent, ou qui nécessitent des jointures complexes, envisagez d’ajouter des exemples.
Par exemple, la question Combien de clients actifs avons-nous eu le 1er juin 2013 génère un SQL valide, comme illustré dans cette capture d’écran :
Cependant, ce n’est pas une bonne réponse.
Une partie du problème est que la notion de « client actif » n’a pas de définition formelle. Des instructions supplémentaires dans les notes de la boîte de texte du modèle pourraient aider, mais les utilisateurs peuvent souvent poser cette question. Vous devez vous assurer que l’IA la gère correctement. La requête pertinente est modérément complexe. Fournissez donc un exemple en sélectionnant sur le bouton Modifier.
Vous pouvez alors charger un exemple.
Une répétition de la question renvoie une réponse améliorée.
Vous pouvez ajouter manuellement des exemples, mais vous pouvez également les charger avec un fichier JSON. Il est utile de fournir des exemples avec un fichier lorsque vous avez de nombreuses requêtes SQL que vous souhaitez charger en même temps, au lieu de les charger manuellement une par une. Pour cet exercice, utilisez ces exemples :
{
"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, 0, 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;"
}
Tester et réviser la compétence IA
Des instructions et exemples ont été ajoutés à la compétence IA. À mesure que le test se poursuit, l’ajout d’autres exemples et instructions peut améliorer encore la compétence IA. Travaillez avec vos collègues pour voir si vous avez fourni des exemples et des instructions qui couvrent les types de questions qu’ils ont l’intention de poser.
Utiliser la compétence IA par programmation
Vous pouvez utiliser la compétence IA par programmation dans un notebook Fabric. Pour déterminer si la compétence IA a ou non une valeur d’URL publiée, sélectionnez Paramètres, comme illustré dans cette capture d’écran :
Avant de publier la compétence IA, elle n’a pas de valeur d’URL publiée, comme illustré dans cette capture d’écran :
Une fois que vous avez validé les performances de la compétence IA, vous pouvez décider de la publier. Dans ce cas, sélectionnez Publier, comme indiqué dans cette capture d’écran :
L’URL publiée pour la compétence IA s’affiche, comme illustré dans cette capture d’écran :
Vous pouvez ensuite copier l’URL publiée et l’utiliser dans le notebook Fabric. Ainsi, vous pouvez interroger la compétence IA en effectuant des appels à l’API de la compétence IA dans un notebook Fabric. Collez l’URL copiée dans cet extrait de code. Remplacez ensuite la question par toute requête pertinente pour votre compétence IA. L’exemple suivant utilise \<generic published URL value\>
en tant que 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"])