Implementieren der Generierung von Abruferweiterungen mithilfe von Vektorindizes in vCore-basierten Azure Cosmos DB für MongoDB

Abgeschlossen

Mit Azure OpenAI und vCore-basierten Azure Cosmos DB für MongoDB können Sie ein RAG-System (Retrieval Augmented Generation) implementieren. Dieses System kombiniert Vektorsuchfunktionen von vCore-basierten Azure Cosmos DB für MongoDB mit den erweiterten KI-Modellen von Azure OpenAI, um detaillierte Antworten basierend auf den Suchergebnissen bereitzustellen. Dieser Ansatz verbessert die Qualität und Relevanz von KI-generierten Antworten mit Ihren eigenen Daten erheblich.

Der erste Teil eines RAG-Systems (Retrieval Augmented Generation) umfasst das Stellen einer Frage und das Durchsuchen Ihrer Daten nach ähnlichen Elementen basierend auf der Vektorähnlichkeit. Dies bedeutet, dass Ihre Frage in einen numerischen Vektor konvertiert wird und das System Ihre Daten nach Elementen durchsucht, die diesem Vektor am ehesten ähneln.

Dieser Prozess erfordert zuerst die Konfiguration Ihrer vCore-basierten Azure Cosmos DB für MongoDB zur Unterstützung der Vektorsuche. Diese Konfiguration umfasst drei Hauptschritte:

  1. Fügen Sie Ihren Dokumenten Vektorfelder hinzu, um ihre Textdateneinbettungen zu speichern.
  2. Generieren Sie Einbettungen aus den Textdaten Ihres Dokuments, und speichern Sie sie in den Vektorfeldern.
  3. Erstellen Sie Vektorindizes für diese Vektorfelder.

Untersuchen wir die einzelnen Schritte ausführlicher.

Hinzufügen von Vektorfeldern zu Ihren Dokumenten

Beginnen Sie mit dem Hinzufügen von Vektorfeldern zu Ihren vCore-basierten Azure Cosmos DB für MongoDB-Dokumente. Diese Felder sind entscheidend, da sie hochdimensionale Vektordaten speichern. Sie füllen diese Vektorfelder mithilfe von Einbettungen aus den Textdaten Ihres Dokuments auf. Nach dem Auffüllen werden die Vektorindizes dann aus diesen Vektorfeldern erstellt.

Generieren von Einbettungen

Bevor Sie Vektorindizes nutzen können, müssen Sie Einbettungen für einige der Textfelder generieren, die in den Dokumenten Ihrer Datenbank gespeichert sind. Vektoreinbettungen sind numerische Darstellungen der Textdaten, sodass KI-Systeme einen effizienten Ähnlichkeitsvergleich zwischen Dokumenten durchführen können. Ein Einbettungsvektor, der für ein Textfeld generiert wird, kann z. B. wie folgt aussehen:

[0.123, 0.234, 0.345, ...]

Angenommen, Sie haben die Produktsammlung in der Verkaufsdatenbank "Adventure Works Bike Shop". Sie können Einbettungen für die Kategorie - und Beschreibungsfelder des Sammlungsdokuments generieren. Azure OpenAI kann Ihnen dabei helfen, diese Einbettungen aus den Textdaten der Felder zu generieren. Nach der Erstellung können Sie diese Einbettungen in die Vektorfelder Ihres Dokuments speichern.

Um Ihre Vektorfeldereinbettungen zu erstellen, können Sie unter anderem das Python- oder Node.js-SDK von Azure OpenAI verwenden. Sie können z. B. die folgenden Codeausschnitte verwenden, um Einbettungen für den Text im Kategoriefeld mithilfe der Azure OpenAI-API zu generieren:

Python

response = AzureOpenAIClient.embeddings.create(
    input=categoryText,
    model=embeddings_deployment)

Node.js

const response = await AzureOpenAIClient.getEmbeddings(embeddingsDeployment, categoryText);

Diese Befehle rufen die Azure OpenAI-API auf, um numerische Einbettungen für die categoryText-Variable mithilfe eines angegebenen Modells (z. B. GPT4) zu generieren. Nachdem Sie die Einbettungen des Dokuments generiert haben, können Sie es mithilfe des Einfüge - oder Aktualisierungsbefehls einer MongoDB-Auflistung in Ihren Vektorfeldern speichern.

Erstellen von Vektorindizes

Bevor wir Vektorsuchen durchführen können, um die Ergebnisse zu erhalten, die wir für unser RAG-System benötigen, müssen wir Vektorindizes für diese Vektorfelder erstellen. Mit diesen Indizes können Sie effiziente Vektorsuchen durchführen, um ähnliche Elemente basierend auf der Vektorähnlichkeit abzurufen. Es gibt zwei Arten von Vektorindizes in Azure Cosmos DB für MongoDB: HNSW (Hierarchische Navigable Small World) und IVF (Inverted File) Indizes. Sie können den Indextyp basierend auf Ihren Anwendungsanforderungen auswählen.

Um beispielsweise einen Vektorindex mit dem HNSW-Algorithmus zu erstellen, können Sie den folgenden MongoDB-Befehl verwenden:

db.command({ 
    "createIndexes": "exampleCollection",
    "indexes": [
        {
            "name": "VectorSearchIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-hnsw", 
                "m": 16, 
                "efConstruction": 64, 
                "similarity": "COS", 
                "dimensions": 3
            } 
        } 
    ] 
});

Dieser MongoDB-Befehl erstellt einen Vektorindex namens VectorSearchIndex in der exampleCollection-Auflistung aus dem ContentVector-Vektorfeld . Sie können einen ähnlichen Befehl verwenden, um einen Vektorindex mithilfe des IVF-Algorithmus zu erstellen. Wir besuchen dieses Beispiel in der Übung des Moduls. Nachdem Sie die Vektorindizes erstellt haben, können Sie sie jetzt verwenden, um Ähnlichkeitssuchen in Ihrer vCore-basierten Azure Cosmos DB für MongoDB-Datenbank durchzuführen. Ihre vCore-basierte Azure Cosmos DB für MongoDB-Datenbank ist jetzt bereit, Vektorsuchen durchzuführen.

Nachdem Sie die Vektorindizes erstellt haben, können Sie Vektorsuchen durchführen, um ähnliche Elemente basierend auf der Vektorähnlichkeit abzurufen. Der Suchvorgang umfasst zwei Hauptschritte:

  1. Einbetten einer Abfrage: Konvertieren Sie eine Nur-Sprache-Frage in einen Vektor mit den gleichen Einbettungsfunktionen, die Sie zum Erstellen der Einbettungen des Vektorfelds verwendet haben. Wenn Ihre Eingabe beispielsweise eine Frage wie welche Art von Fahrrädern Sie verkaufen? lautet, würden Sie die Einbettung der Frage mit derselben Azure OpenAI-API-Funktion generieren, die Sie zum Erstellen der Kategorie oder Beschreibung des Dokuments verwendet haben.

  2. Suche: Verwenden Sie die generierte Einbettung (auch als Abfragevektor bezeichnet), um nach ähnlichen Elementen in der Datenbank zu suchen. Der Suchalgorithmus vergleicht den Abfragevektor mit den in der Datenbank gespeicherten Vektordaten, um die ähnlichsten Elemente zu finden. Zum Ausführen einer Vektorsuche können Sie den folgenden Aggregatbefehl mongoDB verwenden:

db.exampleCollection.aggregate([
  {
    "$search": {
        "cosmosSearch": {
            "vector": "queryVector",
            "path": "contentVector",
            "k": 2,
            "efSearch": 40
        },
    }
  }
]);

Das Vektorsuchergebnis gibt die ähnlichsten Elemente basierend auf dem Abfragevektor zurück. In diesem Befehl wäre der contentVector Ihr Vektorfeldname. Diese Ergebnisse sind nur ein Array Ihrer Dokumente mit den höchsten Ähnlichkeitsbewertungen. Sie können die Benutzererfahrung jedoch weiter verbessern, indem Sie Azure OpenAI integrieren, um detaillierte Antworten basierend auf den Suchergebnissen zu generieren. Diese Integration ist der letzte Schritt unseres RAG-Systems (Retrieval Augmented Generation).

Integrieren von Azure OpenAI

Während die Vektorsuchergebnisse relevante Elemente bereitstellen, können Sie die Benutzererfahrung weiter verbessern, indem Sie Azure OpenAI integrieren, um detaillierte Antworten basierend auf den Vektorsuchergebnissen zu generieren. Die erweiterten KI-Modelle von Azure OpenAI können kontextabhängige Antworten bereitstellen, die die Vektorsuchergebnisse ergänzen.

Was müssen wir also tun, um Azure OpenAI in die Vektorsuchergebnisse zu integrieren? Als Erstes erstellen wir eine strukturierte Eingabeaufforderung, die Azure OpenAI verwenden kann, um detaillierte Antworten basierend auf den Vektorsuchergebnissen zu generieren. Die strukturierte Eingabeaufforderung kombiniert die folgenden Elemente:

  • Die ursprüngliche Abfrage, die Sie in Ihrer Vektorsuche verwendet haben – z. B. welche Art von Fahrrädern verkaufen Sie?
  • Benutzerdefinierte Systemaufforderung – Die Systemaufforderung stellt eine klare Auftragsbeschreibung bereit, wobei die Aufgaben beschrieben werden, die von der KI behandelt werden sollen, z. B. könnte sie ihre Rolle als Helfer im Adventure Works Bike Shop definieren. Es beschreibt, wie die KI auf Fragen reagieren sollte, um sicherzustellen, dass alle Antworten relevant sind und in einem einfach zu befolgenden Format zurückgegeben werden. Die Systemaufforderung könnte die folgenden Komponenten enthalten:
    • Stellenbeschreibung: Wer soll die KI sein, z. B. "als Helfer im Adventure Works Bike Shop, Sie sind dafür verantwortlich, Kundenanfragen zu den von uns verkauften Fahrrädern zu beantworten."
    • Formatieren von KI-Antworten: Die Eingabeaufforderung teilt der KI genau mit, wie sie ihre Antworten formatieren, z. B. die Verwendung von Listen mit einem bestimmten Abstand. Diese Formatierung sorgt dafür, dass die Informationen für Benutzer verständlich und konsistent sind.
    • Einschränken von KI-Interaktionsantworten: Die Eingabeaufforderung könnte eine Liste der Themen enthalten, die die KI diskutieren kann, z. B. Fahrradtypen, Preise und Verfügbarkeit. Diese Listengrundseite und stellt sicher, dass die KI im Thema bleibt und relevante Informationen bereitstellt.
    • Umgang mit Unsicherheit: Die Aufforderung informiert die KI darüber, wie Sie Situationen behandeln können, in denen möglicherweise nicht genügend Informationen vorhanden sind, um eine Antwort bereitzustellen. Die KI könnte Ausdrücke wie "Ich weiß nicht" vorschlagen oder Benutzer ermutigen, ihre eigene Forschung durchzuführen. Dieser Abschnitt kann dazu beitragen, dass die KI Unsicherheitssituationen besser bewältigen kann.
    • Weitere Anweisungen: Die Eingabeaufforderung kann andere Anweisungen enthalten, z. B. wie Sie Benutzern andere Ressourcen bereitstellen oder unangemessene Fragen behandeln können. Daher sollten Sie alles andere, was die KI tun soll, in die Systemaufforderung einschließen. Diese Anweisungen helfen der KI, eine konsistente und hilfreiche Erfahrung für Benutzer bereitzustellen.
  • Die Vektorsuchergebnisse: Die Vektorsuchergebnisse stellen die ähnlichsten Elemente in Ihren Daten basierend auf dem Abfragevektor bereit. Da die zurückgegebenen Vektorsuchergebnisse die gesamten Dokumente selbst sind, sollten Sie die relevantesten Felder auswählen, die in die Eingabeaufforderung eingeschlossen werden sollen, z. B. die Kategorie oder die Beschreibung des Fahrrads. Die KI kann diese Informationen verwenden, um detaillierte Antworten basierend auf den Vektorsuchergebnissen zu generieren. Wenn beispielsweise die Vektorsuchergebnisse Mountainbikes und Road Bikes zurückgeben, kann die KI detaillierte Informationen zu diesen Arten von Fahrrädern bereitstellen.

Es gibt viele programmgesteuerte Möglichkeiten zum Generieren der Eingabeaufforderung. Der Schlüssel besteht darin, sie so zu strukturieren, dass klare Anweisungen für die KI zum Generieren von Antworten basierend auf den Vektorsuchergebnissen bereitgestellt werden. Wir besuchen eine solche Methode in der Übung des Moduls.

Nachdem Sie Ihre strukturierte Eingabeaufforderung definiert haben, können Sie die folgenden Codeausschnitte verwenden, um Antworten mithilfe von Azure OpenAI zu generieren:

Python

response = AzureOpenAICompletionClient.chat.completions.create(
    model=completion_deployment, messages=structuredPrompt)

Node.js

const response = await AzureOpenAICompletionClient.getChatCompletions(completionDeployment, structuredPrompt);

Diese Befehle rufen die Azure OpenAI-API auf, um detaillierte Antworten basierend auf der strukturierten Eingabeaufforderung mithilfe eines angegebenen Modells bereitzustellen, um kontextbezogene Informationen bereitzustellen, die die Vektorsuchergebnisse ergänzen.

Dieses Setup kombiniert vCore-basierte Azure Cosmos DB für Die Kundendaten von MongoDB mit den AI-Modellen von Azure OpenAI, um Ihr RAG-System (Retrieval Augmented Generation) zu bilden. Durch die Integration der Vektorsuche ermöglicht es der KI, präzise, relevante Informationen aus vCore-basierten Azure Cosmos DB für MongoDB für erweiterte Antworten abzurufen. Dieser Ansatz verbessert die Qualität und Relevanz von KI-generierten Antworten mit Ihren eigenen Daten erheblich.