Partager via


Tutoriel : Utiliser un Eventhouse comme base de données vectorielle

Dans ce tutoriel, vous allez apprendre à utiliser un Eventhouse en tant que base de données vectorielle pour stocker et interroger des données vectorielles dans Real-Time Intelligence. Pour obtenir des informations générales sur les bases de données vectorielles, voir Bases de données vectorielles

Le scénario donné implique l’utilisation de recherches sémantiques sur les pages Wikipédia pour rechercher des pages avec des thèmes courants. Vous utilisez un exemple de jeu de données disponible, qui inclut des vecteurs pour des dizaines de milliers de pages Wikipédia. Ces pages ont été incorporées à un modèle OpenAI pour produire des vecteurs pour chaque page. Les vecteurs, ainsi que certaines métadonnées pertinentes relatives à la page, sont ensuite stockés dans un Eventhouse. Vous pouvez utiliser ce jeu de données pour rechercher des pages similaires les unes aux autres ou pour rechercher des pages similaires à certains thèmes que vous souhaitez trouver. Par exemple, disons que vous voulez rechercher « scientifiques féminines célèbres du 19ème siècle ». Vous encodez cette expression à l’aide du même modèle OpenAI, puis exécutez une recherche de similarité vectorielle sur les données de page Wikipédia stockées pour trouver les pages avec la similarité sémantique la plus élevée.

Plus précisément, dans ce tutoriel, vous allez effectuer les actions suivantes :

  • Préparer une table dans Eventhouse avec encodage Vector16 pour les colonnes vectorielles.
  • Stocker des données vectorielles d’un jeu de données préalablement incorporé dans un Eventhouse.
  • Incorporer une requête en langage naturel à l’aide du modèle Open AI.
  • Utiliser la fonction KQL series_cosine_similarity pour calculer les similitudes entre le vecteur d’incorporation de requête et celles des pages wiki.
  • Afficher les lignes de la similarité la plus élevée pour obtenir les pages wiki les plus pertinentes pour votre requête de recherche.

Ce flux peut être visualisé comme suit :

Schématique d’Eventhouse en tant que flux de travail de base de données vectorielle.

Prérequis

  • Un espace de travail avec une capacité compatible Microsoft Fabric
  • Un eventhouse dans votre espace de travail
  • Une ressource Azure OpenAI avec le modèle text-embedding-ada-002 (version 2) déployé. Ce modèle n’est actuellement disponible que dans certaines régions. Pour plus d’informations, consultez Create an Application Insights resource (Création d’une ressource Application Insights).
    • Vérifiez que l’authentification locale est activée sur votre ressource Azure OpenAI.
  • Téléchargez l’exemple de notebook à partir du référentiel GitHub.

Remarque

Bien que ce tutoriel utilise Azure OpenAI, vous pouvez utiliser n’importe quel fournisseur de modèles d’incorporation pour générer des vecteurs pour les données de texte.

Préparer votre environnement Eventhouse

Dans cette étape de configuration, vous créez une table dans un Eventhouse avec les colonnes et stratégies d’encodage nécessaires pour stocker les données vectorielles.

  1. Accédez à la page d’accueil de votre espace de travail dans Real-Time Intelligence.

  2. Sélectionnez l’Eventhouse que vous avez créé dans les composants requis.

  3. Sélectionnez la base de données cible dans laquelle vous souhaitez stocker les données vectorielles. Si vous ne disposez pas d’une base de données, vous pouvez en créer une en sélectionnant Ajouter une base de données.

  4. Sélectionnez Explorer mes données. Copiez/collez la requête KQL suivante pour créer une table avec les colonnes nécessaires :

    .create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)
    
  5. Copiez/collez les commandes suivantes pour définir la stratégie d’encodage des colonnes vectorielles. Exécutez ces commandes de manière séquentielle.

    .alter column Wiki.title_vector policy encoding type='Vector16'
    
    .alter column Wiki.content_vector policy encoding type='Vector16'
    

Écrire des données vectorielles dans un Eventhouse

Les étapes suivantes permettent d’importer les données Wikipédia incorporées et de les écrire dans un Eventhouse :

Importer un notebook

  1. Téléchargez l’exemple de notebook à partir du référentiel GitHub.
  2. Accédez à votre environnement Fabric. Dans le sélecteur d’expérience, choisissez Développer, puis votre espace de travail.
  3. Sélectionnez Importer>Bloc-notes>Depuis cet ordinateur>Télécharger,puis choisissez le bloc-notes que vous avez téléchargé à une étape précédente.
  4. Une fois l’importation terminée, ouvrez le bloc-notes importé depuis votre espace de travail.

Écrire des données dans l’Eventhouse

  1. Exécutez les cellules pour configurer votre environnement.

    %%configure -f
    {"conf":
        {
            "spark.rpc.message.maxSize": "1024"
        }
    }
    
    %pip install wget
    
    %pip install openai
    
  2. Exécutez les cellules pour télécharger les incorporations précalculées.

    import wget
    
    embeddings_url = "https://cdn.openai.com/API/examples/data/vector_database_wikipedia_articles_embedded.zip"
    
    # The file is ~700 MB so it might take some time
    wget.download(embeddings_url)
    
    import zipfile
    
    with zipfile.ZipFile("vector_database_wikipedia_articles_embedded.zip","r") as zip_ref:
        zip_ref.extractall("/lakehouse/default/Files/data")
    
    import pandas as pd
    
    from ast import literal_eval
    
    article_df = pd.read_csv('/lakehouse/default/Files/data/vector_database_wikipedia_articles_embedded.csv')
    # Read vectors from strings back into a list
    article_df["title_vector"] = article_df.title_vector.apply(literal_eval)
    article_df["content_vector"] = article_df.content_vector.apply(literal_eval)
    article_df.head()
    
  3. Pour écrire dans l’Eventhouse, entrez l’URI de votre cluster, qui se trouve sur la page de présentation du système et le nom de la base de données. La table est créée dans le notebook et référencée ultérieurement dans la requête.

    # replace with your Eventhouse Cluster URI, Database name, and Table name
    KUSTO_CLUSTER =  "Eventhouse Cluster URI"
    KUSTO_DATABASE = "Database name"
    KUSTO_TABLE = "Wiki"
    
  4. Exécutez les cellules restantes pour écrire les données dans l’Eventhouse. Cette opération peut prendre un certain temps à s’exécuter.

    kustoOptions = {"kustoCluster": KUSTO_CLUSTER, "kustoDatabase" :KUSTO_DATABASE, "kustoTable" : KUSTO_TABLE }
    
    access_token=mssparkutils.credentials.getToken(kustoOptions["kustoCluster"])
    
    #Pandas data frame to spark dataframe
    sparkDF=spark.createDataFrame(article_df)
    
    # Write data to a table in Eventhouse
    sparkDF.write. \
    format("com.microsoft.kusto.spark.synapse.datasource"). \
    option("kustoCluster",kustoOptions["kustoCluster"]). \
    option("kustoDatabase",kustoOptions["kustoDatabase"]). \
    option("kustoTable", kustoOptions["kustoTable"]). \
    option("accessToken", access_token). \
    option("tableCreateOptions", "CreateIfNotExist").\
    mode("Append"). \
    save()
    

Voir les données dans l’Eventhouse

À ce stade, vous pouvez vérifier que les données ont été écrites dans l’Eventhouse en accédant à la page de détails de la base de données.

  1. Accédez à la page d’accueil de votre espace de travail dans Real-Time Intelligence.
  2. Sélectionnez l’élément de base de données fourni dans la section précédente. Vous devez voir un résumé des données écrites dans la table « Wiki ».

Générer l’incorporation pour le critère de recherche

Maintenant que vous avez stocké les données wiki incorporées dans votre Eventhouse, vous pouvez les utiliser comme référence pour rechercher des pages sur un article particulier. Pour effectuer la comparaison, vous incorporez le critère de recherche, puis effectuez une comparaison entre le terme de recherche et les pages Wikipédia.

Pour effectuer correctement un appel sur Azure OpenAI, vous avez besoin d’un point de terminaison, d’une clé et d’un ID de déploiement.

Nom de la variable Valeur
endpoint Cette valeur se trouve dans la section Clés et point de terminaison quand vous examinez votre ressource à partir du portail Azure. Vous pouvez également trouver la valeur dans l’affichage Azure OpenAI Studio> Playground > mode Code. Voici un exemple de point de terminaison : https://docs-test-001.openai.azure.com/.
Clé API Cette valeur se trouve dans la section Clés et point de terminaison quand vous examinez votre ressource à partir du portail Azure. Vous pouvez utiliser KEY1 ou KEY2.
ID de déploiement Cette valeur se trouve sous la section Déploiements dans Azure OpenAI Studio.

Utilisez les informations contenues dans la table lors de l’exécution des cellules Azure OpenAI.

Important

L’authentification locale doit être activée sur votre ressource Azure OpenAI pour utiliser la clé API.

import openai
openai.api_version = '2022-12-01'
openai.api_base = 'endpoint' # Add your endpoint here
openai.api_type = 'azure'
openai.api_key = 'api key'  # Add your api key here

def embed(query):
  # Creates embedding vector from user query
  embedded_query = openai.Embedding.create(
          input=query,
          deployment_id="deployment id", # Add your deployment id here
          chunk_size=1
  )["data"][0]["embedding"]
  return embedded_query
searchedEmbedding = embed("most difficult gymnastics moves in the olympics")
#print(searchedEmbedding)

Interroger la similarité

La requête est exécutée directement à partir du notebook et utilise l’incorporation renvoyée de l’étape précédente dans une comparaison avec les pages Wikipédia incorporées stockées dans votre Eventhouse. Cette requête utilise la fonction de similarité cosinus et renvoie les 10 premiers vecteurs les plus similaires.

Exécutez les cellules du notebook pour afficher les résultats de la requête. Vous pouvez modifier le critère de recherche et réexécuter la requête pour afficher différents résultats. Vous pouvez également comparer une entrée existante dans la base de données Wiki pour rechercher des entrées similaires.

kustoQuery = "Wiki | extend similarity = series_cosine_similarity(dynamic("+str(searchedEmbedding)+"), content_vector) | top 10 by similarity desc" 
accessToken = mssparkutils.credentials.getToken(KUSTO_CLUSTER)
kustoDf  = spark.read\
    .format("com.microsoft.kusto.spark.synapse.datasource")\
    .option("accessToken", accessToken)\
    .option("kustoCluster", KUSTO_CLUSTER)\
    .option("kustoDatabase", KUSTO_DATABASE)\
    .option("kustoQuery", kustoQuery).load()

# Example that uses the result data frame.
kustoDf.show()

Capture d’écran de l’exécution d’une cellule de résultats de similarité.

Nettoyer les ressources

Lorsque vous avez terminé le tutoriel, vous pouvez supprimer les ressources que vous avez créées pour éviter les coûts supplémentaires. Pour supprimer les ressources, suivez ces étapes :

  1. Accédez à la page d’accueil de votre espace de travail.
  2. Supprimez le notebook que vous avez créé dans ce tutoriel.
  3. Supprimez l’Eventhouse ou la base de données utilisée dans ce tutoriel.