Freigeben über


Tutorial: Verwenden eines Eventhouse als Vektordatenbank

In diesem Tutorial erfahren Sie, wie Sie ein Eventhouse als Vektordatenbank zum Speichern und Abfragen von Vektordaten in Echtzeitintelligenz verwenden. Allgemeine Informationen zu Vektordatenbanken finden Sie unter Vektor-Datenbanken

Das gegebene Szenario umfasst die Verwendung semantischer Suchvorgänge auf Wikipedia-Seiten, um Seiten mit gemeinsamen Themen zu finden. Sie verwenden ein verfügbares Beispiel-Dataset, das Vektoren für Zehntausende von Wikipedia-Seiten enthält. In diese Seiten wurde bereits ein OpenAI-Modell eingebettet, um Vektoren für jede Seite zu erzeugen. Die Vektoren werden dann zusammen mit einigen relevanten Metadaten zu der Seite in einem Eventhouse gespeichert. Sie können dieses Dataset verwenden, um Seiten zu finden, die einander ähneln, oder um Seiten zu finden, die einem Design ähneln, das Sie suchen möchten. Angenommen, Sie möchten nach dem Begriff „berühmte weibliche Wissenschaftler des 19. Jahrhunderts“ suchen. Sie kodieren diesen Begriff mit demselben OpenAI-Modell und führen dann eine Vektorähnlichkeitssuche über die gespeicherten Wikipedia-Seitendaten durch, um die Seiten mit der höchsten semantischen Ähnlichkeit zu finden.

In diesem Tutorial werden Sie insbesondere Folgendes lernen:

  • Bereiten Sie eine Tabelle im Eventhouse mit Vector16-Codierung für die Vektorspalten vor.
  • Speichern Sie Vektordaten aus einem vordefinierten Dataset in einem Eventhouse.
  • Betten Sie eine natürliche Sprachabfrage mithilfe des offenen KI-Modells ein.
  • Verwenden Sie die series_cosine_similarity KQL-Funktion, um die Ähnlichkeiten zwischen dem Abfrageeinbettungsvektor und denen der Wiki-Seiten zu berechnen.
  • Zeigen Sie Zeilen der höchsten Ähnlichkeit an, um die Wiki-Seiten abzurufen, die für Ihre Suchabfrage am relevantesten sind.

Dieser Flow kann wie folgt visualisiert werden:

Schematischer Workflow von Eventhouse als Vektordatenbank.

Voraussetzungen

  • Ein Arbeitsbereich mit einer Microsoft Fabric-fähigen Kapazität
  • Ein Eventhouse in Ihrem Arbeitsbereich
  • Eine Azure OpenAI-Ressource mit dem implementierten Modell text-embedding-ada-002 (Version 2). Dieses Modell ist derzeit nur in bestimmten Regionen verfügbar. Weitere Informationen finden Sie unter Erstellen einer Ressource.
    • Stellen Sie sicher, dass die lokale Authentifizierung in Ihrer Azure OpenAI-Ressource aktiviert ist.
  • Laden Sie das Beispiel-Notebook aus dem GitHub-Repository herunter

Hinweis

Während dieses Tutorial Azure OpenAI verwendet, können Sie jeden Einbettungsmodellanbieter verwenden, um Vektoren für Textdaten zu generieren.

Vorbereiten Ihrer Eventhouse-Umgebung

In diesem Setupschritt erstellen Sie eine Tabelle in einem Eventhouse mit den erforderlichen Spalten und Codierungsrichtlinien, um die Vektordaten zu speichern.

  1. Navigieren Sie in Echtzeitsintelligenz zur Homepage Ihres Arbeitsbereichs.

  2. Wählen Sie das Eventhouse aus, das Sie in den Voraussetzungen erstellt haben.

  3. Wählen Sie die Zieldatenbank aus, in der Sie die Vektordaten speichern möchten. Wenn Sie nicht über eine Datenbank verfügen, können Sie diese jetzt über Neue Datenbank erstellen.

  4. Wählen Sie Meine Daten durchsuchen aus. Kopieren Sie die folgende KQL-Abfrage und fügen Sie sie ein, um eine Tabelle mit den erforderlichen Spalten zu erstellen:

    .create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)
    
  5. Kopieren Sie die folgenden Befehle und fügen Sie sie ein, um die Kodierungsregeln für die Vektorspalten festzulegen. Führen Sie diese Befehle sequenziell aus.

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

Schreiben von Vektordaten in ein Eventhouse

Die folgenden Schritte werden verwendet, um die eingebetteten Wikipedia-Daten zu importieren und in ein Eventhouse zu schreiben:

Notebook importieren

  1. Laden Sie das Beispiel-Notebook aus dem GitHub-Repository herunter.
  2. Navigieren Sie zu Ihrer Fabric-Umgebung. Wählen Sie im Umschalter für die Benutzeroberfläche Entwickeln und dann Ihren Arbeitsbereich aus.
  3. Wählen Sie Import>Notebook>Auf diesem Computer>Hochladen und dann das Notebook aus, das Sie in einem vorherigen Schritt heruntergeladen haben.
  4. Öffnen Sie nach Abschluss des Imports dieses Notebook in Ihrem Arbeitsbereich.

Schreiben von Daten in das Eventhouse

  1. Führen Sie die Zellen aus, um Ihre Umgebung einzurichten.

    %%configure -f
    {"conf":
        {
            "spark.rpc.message.maxSize": "1024"
        }
    }
    
    %pip install wget
    
    %pip install openai
    
  2. Führen Sie die Zellen aus, um die vorkompilierten Einbettungen herunterzuladen.

    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. Wenn Sie in das Eventhouse schreiben möchten, geben Sie Ihren Cluster-URI ein, der auf der Systemübersichtsseite und dem Namen der Datenbank zu finden ist. Die Tabelle wird im Notebook erstellt und später in der Abfrage referenziert.

    # replace with your Eventhouse Cluster URI, Database name, and Table name
    KUSTO_CLUSTER =  "Eventhouse Cluster URI"
    KUSTO_DATABASE = "Database name"
    KUSTO_TABLE = "Wiki"
    
  4. Führen Sie die verbleibenden Zellen aus, um die Daten in das Eventhouse zu schreiben. Die Ausführung dieses Vorgangs kann einige Zeit in Anspruch nehmen.

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

Ansicht der Daten im Eventhouse

An diesem Punkt können Sie überprüfen, ob die Daten in das Eventhouse geschrieben wurden, indem Sie zur Seite mit den Datenbankdetails navigieren.

  1. Navigieren Sie in Echtzeitsintelligenz zur Homepage Ihres Arbeitsbereichs.
  2. Wählen Sie den Datenbankartikel aus, der im vorherigen Abschnitt bereitgestellt wurde. Sie sollten eine Zusammenfassung der Daten sehen, die in die Tabelle „Wiki“ geschrieben wurden.

Generieren der Einbettung für den Suchbegriff

Da Sie nun die eingebetteten Wiki-Daten in Ihrem Eventhouse gespeichert haben, können Sie diese Daten als Referenz verwenden, um Seiten zu einem bestimmten Artikel zu finden. Um den Vergleich durchzuführen, betten Sie den Suchbegriff ein und führen dann einen Vergleich zwischen dem Suchbegriff und den Wikipedia-Seiten durch.

Für einen erfolgreichen Aufruf von Azure OpenAI benötigen Sie einen Endpunkt, einen Schlüssel und eine Bereitstellungs-ID.

Variablenname Wert
endpoint Diesen Wert finden Sie im Abschnitt Schlüssel und Endpunkt, wenn Sie die Ressource über das Azure-Portal untersuchen. Alternativ dazu finden Sie den Wert auch unter Azure OpenAI Studio>Playground > Codeansicht. Ein Beispielendpunkt ist https://docs-test-001.openai.azure.com/.
API-Schlüssel Diesen Wert finden Sie im Abschnitt Schlüssel und Endpunkt, wenn Sie die Ressource über das Azure-Portal untersuchen. Sie können entweder „SCHLÜSSEL1“ oder „SCHLÜSSEL2“ verwenden.
Bereitstellungs-ID Dieser Wert finden Sie im Abschnitt Bereitstellungen im Azure OpenAI Studio.

Verwenden Sie die Informationen in der Tabelle beim Ausführen der Azure OpenAI-Zellen.

Wichtig

Die lokale Authentifizierung muss für Ihre Azure Open AI-Ressource aktiviert sein, um den API-Schlüssel zu verwenden.

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)

Abfragen der Ähnlichkeit

Die Abfrage wird direkt aus dem Notebook ausgeführt und verwendet die zurückgegebene Einbettung aus dem vorherigen Schritt für einen Vergleich mit den eingebetteten Wikipedia-Seiten, die in Ihrem Eventhouse gespeichert sind. Diese Abfrage verwendet die Kosinus-Ähnlichkeitsfunktion und gibt die obersten zehn ähnlichsten Vektoren zurück.

Führen Sie die Zellen im Notebook aus, um die Ergebnisse der Abfrage anzuzeigen. Sie können den Suchbegriff ändern und die Abfrage erneut ausführen, um unterschiedliche Ergebnisse anzuzeigen. Sie können auch einen vorhandenen Eintrag in der Wiki-Datenbank vergleichen, um ähnliche Einträge zu finden.

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

Screenshot der ausgeführten Zelle mit Ähnlichkeitsergebnissen.

Bereinigen von Ressourcen

Wenn Sie das Löschen abgeschlossen haben, können Sie die Ressourcen löschen, die Sie erstellt haben, um andere Kosten zu vermeiden. Um die Ressourcen zu löschen, gehen Sie wie folgt vor:

  1. Navigieren Sie zu Ihrer Arbeitsbereichs-Homepage.
  2. Löschen Sie den Notebook, den Sie in diesem Tutorial erstellt haben.
  3. Löschen Sie das in diesem Tutorial verwendete Eventhouse oder Datenbank.