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:
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.
Navigieren Sie in Echtzeitsintelligenz zur Homepage Ihres Arbeitsbereichs.
Wählen Sie das Eventhouse aus, das Sie in den Voraussetzungen erstellt haben.
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.
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)
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
- Laden Sie das Beispiel-Notebook aus dem GitHub-Repository herunter.
- Navigieren Sie zu Ihrer Fabric-Umgebung. Wählen Sie im Umschalter für die Benutzeroberfläche Entwickeln und dann Ihren Arbeitsbereich aus.
- Wählen Sie Import>Notebook>Auf diesem Computer>Hochladen und dann das Notebook aus, das Sie in einem vorherigen Schritt heruntergeladen haben.
- Öffnen Sie nach Abschluss des Imports dieses Notebook in Ihrem Arbeitsbereich.
Schreiben von Daten in das Eventhouse
Führen Sie die Zellen aus, um Ihre Umgebung einzurichten.
%%configure -f {"conf": { "spark.rpc.message.maxSize": "1024" } }
%pip install wget
%pip install openai
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()
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"
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.
- Navigieren Sie in Echtzeitsintelligenz zur Homepage Ihres Arbeitsbereichs.
- 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()
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:
- Navigieren Sie zu Ihrer Arbeitsbereichs-Homepage.
- Löschen Sie den Notebook, den Sie in diesem Tutorial erstellt haben.
- Löschen Sie das in diesem Tutorial verwendete Eventhouse oder Datenbank.