Exemple d'agent de données Fabric avec le jeu de données AdventureWorks (aperçu)

Cet article explique comment configurer un agent de données dans Microsoft Fabric à l’aide d’un lakehouse comme exemple de source de données. Nous créons d'abord et remplissons un lakehouse, puis créons un agent de données Fabric et y ajoutons le lakehouse. Si vous disposez déjà d’un modèle sémantique Power BI, assurez-vous que vous disposez d’une autorisation de lecture pour interagir avec celui-ci via un agent de données (l’autorisation d’écriture est nécessaire uniquement pour modifier le modèle sémantique ou utiliser des fonctionnalités telles que la préparation pour l’IA). Pour un entrepôt, une base de données KQL ou une ontologie, suivez les mêmes étapes et sélectionnez cette source à la place. Bien que ce guide utilise un lakehouse, le modèle est le même pour d'autres sources ; seule la sélection de la source de données diffère.

Important

Cette fonctionnalité est en version préliminaire.

Conditions préalables

Important

Vérifiez que la fonctionnalité autonome de Copilot est activée dans le portail d’administration Power BI (Paramètres du client > Copilot > fonctionnalité autonome de Copilot). S'il n'est pas activé, vous ne pourrez pas utiliser l'agent de données dans les scénarios Copilot même si d'autres commutateurs Copilot du locataire sont activés. Pour plus d’informations, consultez Copilot dans les paramètres du tenant de Power BI.

Créez un lakehouse avec AdventureWorksLH

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'AdventureWorksLH dans un lakehouse (ou un entrepôt), vous pouvez ignorer cette étape. Si ce n’est pas le cas, vous pouvez utiliser les instructions suivantes depuis un bloc-notes Fabric pour remplir le "lakehouse" de données.

  1. Créez un bloc-notes dans l’espace de travail dans lequel vous souhaitez créer votre agent de données Fabric.

  2. Sur le côté gauche du volet Explorateur, sélectionnez + Sources de données. Cette option vous permet d'ajouter un lakehouse existant ou de créer un nouveau lakehouse. Par souci de clarté, créez un nouveau lakehouse et attribuez-lui un nom.

  3. Ajoutez l’extrait de code suivant dans la cellule au sommet :

    import pandas as pd
    from tqdm.auto import tqdm
    base = "https://synapseaisolutionsa.z13.web.core.windows.net/data/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 se remplit avec les données nécessaires.

Caution

Les blocs-notes en cours d'exécution, par exemple, à cause de boucles infinies accidentelles ou d'interrogations constantes, peuvent consommer indéfiniment la capacité de Fabric. Une fois les données chargées, arrêtez toutes les cellules actives et terminez la session du bloc-notes (session d’arrêt de la barre d’outils > Notebook) si vous n’en avez plus besoin. Évitez d’ajouter des boucles longues sans délai d’expiration.

Créer un agent de données Fabric

Pour créer un nouvel agent de données Fabric, accédez à votre espace de travail et sélectionnez le bouton + Nouvel élément, comme illustré dans cette capture d’écran :

Screenshot montrant où créer Fabric agents de données.

Sous l’onglet Tous les éléments, recherchez Fabric agent de données pour rechercher l’option appropriée. Une fois sélectionné, une invite vous demande de fournir un nom pour votre agent de données Fabric, comme illustré dans cette capture d’écran :

Screenshot indiquant où fournir le nom de l’agent de données Fabric.

Après avoir entré le nom, procédez comme suit pour aligner l’agent de données Fabric avec vos exigences spécifiques.

Sélectionner les données

Sélectionnez le lakehouse que vous avez créée à l'étape précédente, puis sélectionnez Ajouter, comme indiqué dans la capture d'écran suivante :

Capture d’écran montrant l’étape d’ajout d’un lakehouse.

Une fois que le lakehouse est ajouté en tant que source de données, le volet Explorer situé à gauche de la page de l’agent de données Fabric affiche le nom de lakehouse. Sélectionnez le lakehouse pour voir toutes les tables disponibles. Utilisez les cases à cocher pour sélectionner les tables que vous souhaitez mettre à disposition de l'IA. Pour ce scénario, sélectionnez ces tables :

  • dimcustomer
  • dimdate
  • dimgeography
  • dimproduct
  • dimproductcategory
  • dimpromotion
  • dimreseller
  • dimsalesterritory
  • factinternetsales
  • factresellersales

Capture d'écran montrant où vous pouvez sélectionner des tables pour l'IA.

Autorisations pour les modèles sémantiques dans les agents de données

Les utilisateurs ont uniquement besoin d’une autorisation de lecture sur un modèle sémantique Power BI pour l’ajouter à un agent de données et poser des questions via l’agent. L’accès à l’espace de travail (rôle membre) et l’autorisation Build ne sont pas nécessaires pour l’interaction via des agents de données. L’autorisation d’écriture est nécessaire uniquement pour modifier le modèle sémantique ou utiliser des fonctionnalités telles que la préparation de l’IA.

Cette modification des autorisations s’applique uniquement aux interactions par le biais d’agents de données. D’autres modèles d’accès (par exemple, Analyser dans Excel ou créer des rapports directs) suivent les autorisations standard Power BI.

Fournir des instructions

Pour ajouter des instructions, sélectionnez le bouton Instructions de l’agent de données pour ouvrir le volet d’instructions à droite. Vous pouvez ajouter les instructions suivantes.

La source de données AdventureWorksLH contient des informations provenant de trois tables :

  • dimcustomer, pour des informations démographiques détaillées sur les clients et des informations de contact
  • dimdate, pour les données liées aux dates, par exemple les informations calendaires et fiscales
  • dimgeography, pour les détails géographiques, y compris les noms de villes et les codes de région des pays.

Utilisez cette source de données pour les requêtes et les analyses impliquant les détails des clients, les événements temporels et les emplacements géographiques.

Capture d'écran montrant où vous pouvez fournir les instructions à l'IA.

Fournir des exemples

Pour ajouter des exemples de requêtes, sélectionnez le bouton Exemples de requêtes pour ouvrir le volet Exemples de requêtes sur la droite. Ce volet fournit des options permettant d'ajouter ou de modifier des exemples de requêtes pour toutes les sources de données prises en charge. Pour chaque source de données, vous pouvez sélectionner Ajouter ou modifier des exemples de requêtes pour entrer les exemples pertinents, comme illustré dans la capture d’écran suivante :

Capture d'écran montrant où vous pouvez ajouter les exemples que vous fournissez à l'IA.

Ici, vous devez ajouter des exemples de requêtes pour la source de données Lakehouse que vous avez créée.

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

Capture d'écran montrant l'ajout d'exemples SQL.

Remarque

L'ajout d'exemples de paires de requêtes/questions n'est pas pris en charge actuellement pour les sources de données de modèle sémantique Power BI.

Tester et réviser l’agent de données Fabric

Maintenant que vous avez configuré l’agent de données Fabric, ajouté les instructions de l'agent de données Fabric et fourni des exemples de requêtes pour le lac de données, vous pouvez interagir avec ce système en posant des questions et en obtenant des réponses. Au fur et à mesure que vous continuez à tester, vous pouvez ajouter d’autres exemples et affiner les instructions pour améliorer les performances de l’agent de données Fabric. Collaborez avec vos collègues pour recueillir des commentaires et, en fonction de leurs contributions, assurez-vous que les exemples de requêtes et d’instructions fournis correspondent aux types de questions qu’ils souhaitent poser.

Publier l’agent de données Fabric

Après avoir validé les performances de l’agent de données Fabric, vous pouvez décider de le publier afin de pouvoir le partager avec vos collègues qui souhaitent effectuer des questions et réponses (Q&R) à propos des données. Dans ce cas, sélectionnez Publier, comme indiqué dans cette capture d’écran :

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

La zone Publier l’agent de données s’ouvre, comme illustré dans cette capture d’écran :

Capture d'écran montrant la fonctionnalité d'agent de publication de données.

Dans cette zone, sélectionnez Publish pour publier l’agent de données Fabric. L’URL publiée de l’agent de données Fabric s’affiche, comme illustré dans cette capture d’écran :

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

Utiliser l’agent de données Fabric dans Copilot dans Power BI

Vous pouvez utiliser le Copilot dans Power BI pour interagir avec l’agent de données Fabric après sa publication. Avec Copilot dans Power BI, vous pouvez utiliser directement l’agent de données et d’autres éléments (par exemple, des rapports ou des modèles sémantiques) sans avoir à basculer entre eux.

Sélectionnez le bouton Copilot dans le volet de navigation gauche pour ouvrir le Copilot dans Power BI. Ensuite, sélectionnez Ajouter des éléments pour obtenir de meilleurs résultats dans la zone de texte en bas, pour ajouter l’agent de données. Sélectionnez Agents de données dans la fenêtre qui s’ouvre. Vous ne pouvez voir que les agents de données auxquels vous êtes autorisé à accéder. Choisissez l’agent de données souhaité, puis sélectionnez Confirmer. Cet exemple montre comment utiliser un seul agent de données, mais vous pouvez ajouter d’autres éléments, par exemple d’autres agents de données, rapports ou modèles sémantiques. La capture d’écran suivante illustre les étapes avec un seul agent de données :

Screenshot affichant le bouton Copilot et le bouton pour ajouter des éléments tels que Data Agents.

Lorsqu'un agent de données inclut un modèle sémantique Power BI, les utilisateurs n'ont besoin que d'une autorisation de lecture sur ce modèle sémantique pour interagir avec celui-ci via Copilot ; l'accès à l'espace de travail n'est pas obligatoire. L’autorisation d’écriture est toujours nécessaire pour les modifications de modèle sémantique et la préparation de l’IA.

Maintenant que vous avez ajouté l’agent de données au Copilot dans Power BI, vous pouvez poser toutes les questions relatives à votre agent de données Fabric, comme illustré dans la capture d’écran suivante :

Screenshot montrant le Copilot répondant à une question.

Utiliser l’agent de données Fabric par programmation

Vous pouvez utiliser l’agent de données Fabric par programmation dans un notebook Fabric. Pour déterminer si l’agent de données Fabric a une valeur d’URL publiée, sélectionnez Settings, comme illustré dans la capture d’écran suivante :

Screenshot affichant la sélection des paramètres de l’agent de données Fabric.

Avant de publier l'agent de données Fabric, il n'a pas de valeur d'URL publiée, comme illustré dans la capture d'écran suivante :

Screenshot montrant qu'un agent de données Fabric n'a pas de valeur d'URL publiée avant publication.

Si vous n'avez pas publié l'agent de données Fabric avant, vous pouvez le publier en suivant les instructions des étapes précédentes. Vous pouvez ensuite copier l’URL publiée et l’utiliser dans le bloc-notes Fabric. De cette façon, vous pouvez interroger l’agent de données Fabric en effectuant des appels à l’API de l’agent de données Fabric 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 agent de données Fabric. L’exemple suivant utilise \<generic published URL value\> en tant que URL.

Important

Lors de l’appel d’un agent de données par programmation, implémentez :

  1. Délai de sondage (voir l’exemple ci-dessous) pour éviter les boucles indéfinies.
  2. Fréquence d’interrogation minimale (commencez à 2 à 5 secondes ; augmentez uniquement si nécessaire).
  3. Nettoyage des threads ou ressources créés après l’achèvement.
  4. Fermeture de session du notebook une fois terminée pour libérer la capacité Fabric.

Remarque

Ajustez les broches de version (openai, synapseml, pandas, tqdm) aux dernières versions validées pour votre runtime de Fabric si ces versions exactes deviennent obsolètes.

%pip install "openai==1.70.0"
%pip install "synapseml==1.0.5"  # Required for synapse.ml.mlflow (update version as needed)
%pip install pandas tqdm  # Skip if already available in the Fabric runtime
import typing as t
import time
import uuid

# OpenAI SDK internals
from openai import OpenAI
from openai._models import FinalRequestOptions
from openai._types import Omit
from openai._utils import is_given

# SynapseML helper for env config
from synapse.ml.mlflow import get_mlflow_env_config

# Removed unused imports: requests, json, pprint, APIStatusError, SynapseTokenProvider
 
base_url = "https://<generic published base URL value>"
question = "What data sources 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 (avoid indefinite loop)
terminal_states = {"completed", "failed", "cancelled", "requires_action"}
poll_interval = 2
timeout_seconds = 300  # Adjust based on expected workload
start_time = time.time()

while run.status not in terminal_states:
    if time.time() - start_time > timeout_seconds:
        raise TimeoutError(f"Run polling exceeded {timeout_seconds} seconds (last status={run.status})")
    run = fabric_client.beta.threads.runs.retrieve(
        thread_id=thread.id,
        run_id=run.id,
    )
    print(run.status)
    time.sleep(poll_interval)

if run.status != "completed":
    print(f"Run finished with status: {run.status}")

# 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)