Partager via


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

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.

  1. Créez un notebook dans l’espace de travail où vous souhaitez créer votre compétence IA.

  2. 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.

  3. 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)
    
  4. Sélectionnez Exécuter tout.

    Capture d’écran montrant un notebook avec le code de chargement AdventureWorks.

Après quelques minutes, le lakehouse est rempli avec les données nécessaires.

Créer une compétence IA

  1. Pour créer une compétence IA, accédez à l’expérience Science des données, puis sélectionnez Compétence IA.

    Capture d'écran montrant où créer des compétences IA.

  2. 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 :

Capture d’écran montrant le premier exemple de compétence IA avec la question sur le produit générant le plus de ventes.

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. Utilisez FactResellerSales 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 :

Capture d’écran montrant le deuxième exemple de compétence IA avec la question sur le produit générant le plus de ventes.

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. Utilisez FactResellerSales 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 dans DimProduct est le prix de vente suggéré, tandis que UnitPrice dans FactInternetSales et FactResellerSales 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 :

Capture d’écran montrant le premier exemple de question concernant le nombre de clients actifs pour la compétence IA.

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.

Capture d’écran montrant où modifier les exemples que vous fournissez à l’IA.

Vous pouvez alors charger un exemple.

Capture d’écran montrant un exemple de requête SQL de la compétence IA.

Une répétition de la question renvoie une réponse améliorée.

Capture d’écran montrant le deuxième exemple de question concernant le nombre de clients actifs pour la compétence IA.

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 :

Capture d’écran montrant la sélection des paramètres de la compétence IA.

Avant de publier la compétence IA, elle n’a pas de valeur d’URL publiée, comme illustré dans cette capture d’écran :

Capture d’écran montrant qu’une compétence IA n’a pas de valeur d’URL publiée avant sa publication.

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 :

Capture d’écran de la sélection de l’option Publier.

L’URL publiée pour la compétence IA s’affiche, comme illustré dans cette capture d’écran :

Capture d'écran montrant l'URL publiée.

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"])