Freigeben über


Retrieval Augmented Generation (RAG) in Azure KI Search

Retrieval Augmented Generation (RAG) ist eine Architektur, welche die Funktionen eines Large Language Model (LLM) wie ChatGPT erweitert, indem ein Informationsempfangssystem hinzugefügt wird, das die Grunddaten bereitstellt. Durch das Hinzufügen eines Informationsempfangssystems können Sie die von einem LLM verwendeten Grunddaten steuern, wenn es eine Antwort formuliert. Für eine Unternehmenslösung bedeutet die RAG-Architektur, dass Sie die generative KI auf Ihre Unternehmensinhalte beschränken können, die aus vektorisierten Dokumenten und Bildern stammen, und andere Datenformate, wenn Sie Einbettungsmodelle für diese Inhalte haben.

Die Entscheidung darüber, welches Informationsempfangssystem verwendet werden soll, ist entscheidend, da sie die Eingaben für das LLM bestimmt. Das Informationsempfangssystem sollte Folgendes bereitstellen:

  • Indizierungsstrategien, die skaliert geladen und aktualisiert werden, für alle Ihre Inhalte in der von Ihnen benötigten Häufigkeit.

  • Abfragefunktionen und Relevanzoptimierung. Das System sollte relevante Ergebnisse in Kurzformaten zurückgeben, die für die Erfüllung der Tokenlängenanforderungen von LLM-Eingaben erforderlich sind.

  • Sicherheit, globale Reichweite und Zuverlässigkeit sowohl für Daten als auch für Vorgänge.

  • Integration in Einbettungsmodelle für die Indizierung und Chatmodelle oder Language Understanding-Modelle zum Abrufen.

Azure KI Search ist eine bewährte Lösung zum Abrufen von Informationen in einer RAG-Architektur. Es bietet Indizierungs- und Abfragefunktionen mit der Infrastruktur und Sicherheit der Azure-Cloud. Mithilfe von Code und anderen Komponenten können Sie eine umfassende RAG-Lösung entwerfen, die alle Elemente für generative KI über Ihre proprietären Inhalte enthält.

Hinweis

Sie sind neu bei Copilot und RAG-Konzepten? Sehen Sie sich Vektorsuche und modernstes Abrufen für Apps mit generativer KI an.

Microsoft verfügt über mehrere integrierte Implementierungen für die Verwendung von Azure KI Search in einer RAG-Lösung.

Kuratierte Ansätze erleichtern den Einstieg, aber für mehr Kontrolle über die Architektur benötigen Sie eine benutzerdefinierte Lösung. Diese Vorlagen erstellen End-to-End-Lösungen in:

Wenn Tools und Vorlagen Ihre Anwendungsanforderungen nicht erfüllen, können Sie eine benutzerdefinierte RAG-Lösung mithilfe der Azure KI-Suche-APIs erstellen. Im restlichen Teil dieses Artikels wird erläutert, wie Azure KI Search in eine benutzerdefinierte RAG-Lösung passt.

Eine allgemeine Zusammenfassung des Musters sieht wie folgt aus:

  • Beginnen Sie mit einer Benutzerfrage oder Anfrage (Prompt).
  • Senden Sie sie an Azure KI Search, um relevante Informationen zu finden.
  • Geben Sie die am höchsten bewerteten Suchergebnisse an ein LLM zurück.
  • Verwenden Sie die Funktionen für natürliches Sprachverständnis und natürliche Sprachfolgerung des LLM, um eine Antwort auf den ersten Prompt zu generieren.

Azure KI Search stellt Eingaben für den LLM-Prompt bereit, trainiert das Modell jedoch nicht. In der RAG-Architektur gibt es kein eigenes Training. Das LLM wird mit öffentlichen Daten vorab trainiert, generiert jedoch Antworten, die durch Informationen vom Abrufer erweitert werden, in diesem Fall Azure KI-Suche.

RAG-Muster, die Azure KI Search enthalten, weisen die in der folgenden Abbildung angegebenen Elemente auf.

Architekturdiagramm des Informationsabrufs mit Suche und ChatGPT.

  • App-UX (Web-App) für die Benutzererfahrung
  • App-Server oder Orchestrator (Integrations- und Koordinationsebene)
  • Azure KI Search (Information Retrieval System)
  • Azure OpenAI (LLM für generative KI)

Die Web-App stellt die Benutzererfahrung, Präsentation, den Kontext und die Benutzerinteraktion bereit. Fragen oder Prompts von einem Benutzer beginnen hier. Eingaben durchlaufen die Integrationsebene, gehen zuerst zum Informationsabruf, um die Suchergebnisse zu erhalten, werden allerdings auch zum LLM übertragen, um den Kontext und die Absicht festzulegen.

Der App-Server oder Orchestrator ist der Integrationscode, der die Übergaben zwischen dem Abrufen von Informationen und dem LLM koordiniert. Zu den verbreiteten Lösungen gehört LangChain zum Koordinieren des Workflows. LangChain ist in Azure KI Searchintegriert und erleichtert die Einbindung von Azure KI Search als Retriever in Ihren Workflow. LlamaIndex und Semantic Kernel sind weitere Optionen.

Das Informationsabrufsystem stellt den durchsuchbaren Index, die Abfragelogik und die Nutzlast (Abfrageantwort) bereit. Der Suchindex kann Inhalte mit oder ohne Vektoren enthalten. Obwohl die meisten Beispiele und Demos Vektorfelder enthalten, ist das keine Notwendigkeit. Die Abfrage wird mithilfe der vorhandenen Suchmaschine in Azure KI Search ausgeführt, welches Schlüsselwort- (oder Ausdrucks-) und Vektorabfragen verarbeiten kann. Der Index wird im Voraus basierend auf einem von Ihnen definierten Schema erstellt und mit Ihren Inhalten geladen, die aus Dateien, Datenbanken oder Speicher stammen.

Das LLM erhält den ursprünglichen Prompt sowie die Ergebnisse von Azure KI Search. Das LLM analysiert die Ergebnisse und formuliert eine Antwort. Wenn es sich bei dem LLM um ChatGPT handelt, kann es sich bei der Benutzerinteraktion um ein Hin-und-Her-Gespräch handeln. Wenn Sie Davinci verwenden, ist der Prompt möglicherweise eine vollständig zusammengesetzte Antwort. Eine Azure-Lösung verwendet höchstwahrscheinlich Azure OpenAI, aber es gibt keine feste Abhängigkeit von diesem spezifischen Dienst.

Azure KI-Suche bietet keine native LLM-Integration für prompt flows oder Chaterhaltung, daher müssen Sie Code für die Orchestrierung und den Zustand schreiben. Sie können die Demoquelle (Azure-Samples/azure-search-openai-demo) als Vorlage betrachten, mit dem eine vollständige Lösung verbunden ist. Außerdem wird Azure KI Studio empfohlen, um RAG-basierte Azure KI-Suche-Lösungen zu erstellen, die in LLMs integriert werden.

In der Azure KI-Suche werden alle durchsuchbaren Inhalte in einem Suchindex gespeichert, der in Ihrem Suchdienst gehostet wird. Ein Suchindex ist für schnelle Abfragen mit Millisekunden Antwortzeiten konzipiert, sodass die internen Datenstrukturen entworfen wurden, um dieses Ziel zu ermöglichen. Zu diesem Zweck speichert ein Suchindex indizierte Inhalteund nicht ganze Inhaltsdateien wie ganze PDFs oder Bilder. Intern enthalten die Datenstrukturen invertierte Indizes von tokenisiertem Text, Vektorindizes für Einbettungen und unveränderten Text für Fälle, in denen ein wortwörtlicher Abgleich erforderlich ist (z. B. in Filtern, Fuzzy-Suche, RegEx-Abfragen).

Wenn Sie die Daten für Ihre RAG-Lösung einrichten, verwenden Sie die Features, die einen Index in Azure KI Search erstellen und laden. Ein Index enthält Felder, die Ihre Quellinhalte duplizieren oder darstellen. Ein Indexfeld kann eine einfache Übertragung sein (ein Titel oder eine Beschreibung in einem Quelldokument wird zu einem Titel oder einer Beschreibung in einem Suchindex), oder ein Feld kann die Ausgabe eines externen Prozesses enthalten, z. B. Vektorisierung oder Skill-Verarbeitung, die eine Darstellung oder Textbeschreibung eines Bilds generiert.

Da Sie wahrscheinlich wissen, welche Art von Inhalt Sie durchsuchen möchten, bedenken Sie die Indizierungsfeatures, die für jeden Inhaltstyp gelten:

Inhaltstyp Indiziert als Features
text Token, unveränderter Text Indexer können Klartext aus anderen Azure-Ressourcen wie Azure Storage und Cosmos DB abrufen. Sie können auch jeden JSON-Inhalt an einen Index übertragen. Verwenden Sie zum spontanen Ändern von Text Analysetools und Normalizer, um während der Indizierung lexikalische Verarbeitung hinzuzufügen. Synonymzuordnungen sind nützlich, wenn Quelldokumente keine Terminologie enthalten, die in einer Abfrage verwendet werden kann.
text Vektoren 1 Text kann in einer Indexerpipeline segmentiert und vektorisiert oder extern verarbeitet und dann als Vektorfelder in Ihrem Index indiziert werden.
image Token, unveränderter Text 2 Skills für OCR und Bildanalyse können Bilder für die Texterkennung oder Bildmerkmale verarbeiten. Bildinformationen werden in durchsuchbaren Text konvertiert und dem Index hinzugefügt. Skills haben eine Indexeranforderung.
image Vektoren 1 Bilder können in einer Indexerpipeline vektorisiert oder extern für eine mathematische Darstellung von Bildinhalten verarbeitet und dann als Vektorfelder in Ihrem Index indiziert werden. Sie können Azure KI Vision multimodal oder ein Open Source-Modell wie OpenAI CLIP verwenden, um Text und Bilder im gleichen Einbettungsbereich zu vektorisieren.

1 Azure KI-Suche bietet integrierte Datensegmentierung und -vektorisierung, aber Sie müssen eine Abhängigkeit von Indexern und Skillsets akzeptieren. Wenn Sie keinen Indexer verwenden können, können der semantische Kernel von Microsoft oder andere Communityangebote Sie bei einer vollständigen Stapellösung unterstützen. Codebeispiele mit beiden Ansätzen finden Sie unter azure-suche-vektoren repo.

2 Skills sind die integrierte Unterstützung für angewandte KI. Für OCR- und Bildanalyse führt die Indizierungspipeline einen internen Aufruf der Azure KI Vision-APIs durch. Diese Skills übergeben ein extrahiertes Bild zur Verarbeitung an Azure KI und erhalten die Ausgabe als Text, der von Azure KI Search indiziert wird. Skills werden auch für die integrierte Datensegmentierung (Skill „Textaufteilung“) und die integrierte Einbettung verwendet (Skills, die Azure KI Vision multimodal, Azure OpenAI und Modelle im Azure KI Studio-Modellkatalog aufrufen).

Vektoren bieten die beste Möglichkeit für unterschiedliche Inhalte (mehrere Dateiformate und Sprachen), da Inhalte universell in mathematischen Darstellungen ausgedrückt werden. Vektoren unterstützen auch die Ähnlichkeitssuche: Übereinstimmung mit den Koordinaten, die der Vektorabfrage am ehesten ähneln. Im Vergleich zur Stichwortsuche (oder Begriffssuche), die mit tokenisierten Ausdrücken übereinstimmt, ist die Ähnlichkeitssuche differenzierter. Es ist eine bessere Wahl, wenn im Inhalt oder in Abfragen Mehrdeutigkeit oder Interpretationsanforderungen vorliegen.

Sobald sich Ihre Daten in einem Suchindex befindet, verwenden Sie die Abfragefunktionen von Azure KI Search, um Inhalte abzurufen.

In einem Nicht-RAG-Muster erstellen Abfragen einen Roundtrip von einem Suchclient. Die Abfrage wird übermittelt und in einer Suchmaschine ausgeführt. Die Antwort wird daraufhin an die Clientanwendung zurückgegeben. Die Antwort oder Suchergebnisse bestehen ausschließlich aus den im Index gefundenen wortwörtlichen Inhalten.

In einem RAG-Muster werden Abfragen und Antworten zwischen der Suchmaschine und dem LLM koordiniert. Die Frage oder Abfrage eines Benutzers wird sowohl an die Suchmaschine als auch an das LLM als Prompt weitergeleitet. Die Suchergebnisse kommen von der Suchmaschine zurück und werden zu einem LLM umgeleitet. Die Antwort, die sie an den Benutzer zurückgibt, ist generative KI, entweder eine Summierung oder Antwort von dem LLM.

Es gibt keinen Abfragetyp in Azure KI Search – nicht einmal semantische oder Vektorsuche – welche neue Antworten erstellt. Nur das LLM stellt generative KI bereit. Hier sind die Funktionen in Azure KI Search, die zum Formulieren von Abfragen verwendet werden:

Abfragefeature Zweck Argumente für die Verwendung
Einfache oder vollständige Lucene-Syntax Abfrageausführung für Text und numerische Inhalte ohne Vektoren Die Volltextsuche eignet sich am besten für genaue Übereinstimmungen und nicht für ähnliche Übereinstimmungen. Volltextsuchabfragen werden mithilfe des BM25-Algorithmus bewertet und unterstützen die Relevanzoptimierung durch Bewertungsprofile. Sie unterstützt auch Filter und Facetten.
Filter und Facetten Gilt nur für Textfelder oder numerische Felder (ohne Vektoren). Reduziert den Suchumfang basierend auf Einschluss- oder Ausschlusskriterien. Fügt Präzision zu Ihren Abfragen hinzu.
Semantischer Sortierer Bewertet ein BM25-Resultset mit semantischen Modellen neu. Erzeugt Beschriftungen und Antworten im Kurzformat, die als LLM-Eingaben nützlich sind. Einfacher als Bewertungsprofile und je nach Inhalt eine zuverlässigere Technik für die Relevanzoptimierung.
Vektorsuche Abfrageausführung über Vektorfelder für die Ähnlichkeitssuche, wobei die Abfragezeichenfolge ein oder mehrere Vektoren ist. Vektoren können alle Inhaltstypen in jeder Sprache darstellen.
Hybridsuche Kombiniert jegliche oder sämtliche oben genannte Abfragetechniken. Abfragen mit und ohne Vektoren werden parallel ausgeführt und in einem einzelnen Resultset zurückgegeben. Die wichtigsten Gewinne bei Genauigkeit und Rückruf kommen von hybride Abfragen.

Die Abfrageantwort strukturieren

Die Antwort einer Abfrage liefert die Eingabe an das LLM, sodass die Qualität Ihrer Suchergebnisse für den Erfolg von entscheidender Bedeutung ist. Die Ergebnisse sind ein tabellarischer Zeilensatz. Die Zusammensetzung oder Struktur der Ergebnisse hängt ab von:

  • Feldern, die bestimmen, welche Teile des Indexes in der Antwort enthalten sind.
  • Zeilen, die eine Übereinstimmung aus dem Index darstellen.

Felder werden in Suchergebnissen angezeigt, wenn das Attribut „abrufbar“ ist. Eine Felddefinition im Indexschema weist Attribute auf, und diese bestimmen, ob ein Feld in einer Antwort verwendet wird. Nur „abrufbare“ Felder werden in Volltext- oder Vektorabfrageergebnissen zurückgegeben. Standardmäßig werden alle „abrufbaren“ Felder zurückgegeben, aber Sie können „select“ verwenden, um eine Teilmenge anzugeben. Neben „abrufbar“ gibt es keine Einschränkungen für das Feld. Felder können eine beliebige Länge oder einen beliebigen Typen aufweisen. Hinsichtlich der Länge gibt es in Azure KI Search keine maximale Feldlängenbeschränkung, aber es gibt Grenzwerte für die Größe einer API-Anforderung.

Zeilen sind Übereinstimmungen mit der Abfrage, priorisiert nach Relevanz, Ähnlichkeit oder beidem. Standardmäßig werden die Ergebnisse für die Volltextsuche oder k-nearest-neighbour Übereinstimmungen für die Vektorsuche auf die obersten 50 Übereinstimmungen begrenzt. Sie können die Standardwerte ändern, um den Grenzwert bis zum Maximum von 1.000 Dokumenten zu erhöhen oder zu reduzieren. Sie können auch die „top“ verwenden und Paging-Parameter überspringen, um Ergebnisse als eine Reihe von in Seiten eingeteilten Ergebnissen abzurufen.

Maximieren von Relevanz und Abruf

Wenn Sie mit komplexen Prozessen, einer großen Menge an Daten und Erwartungen von Antworten in Millisekunden arbeiten, ist es wichtig, dass jeder Schritt etwas beiträgt und die Qualität des Endergebnisses verbessert. Auf der Informationsabrufseite gibt es die Relevanzoptimierung, eine Aktivität, welche die Qualität der an das LLM gesendeten Ergebnisse verbessert. Nur die relevantesten oder am meisten übereinstimmenden Dokumente sollten in Ergebnisse einbezogen werden.

Hier sind einige Tipps für die Maximierung von Relevanz und Abruf:

  • Hybridabfragen, die die Schlüsselwortsuche (keine Vektorsuche) und die Vektorsuche kombinieren, liefern einen maximalen Abruf, wenn die Eingaben identisch sind. Wenn Sie in einer Hybridabfrage eine Eingabe verdoppeln, generieren eine Textzeichenfolge und deren Vektoräquivalent parallele Abfragen für die Schlüsselwort- und die Ähnlichkeitssuche und geben die relevantesten Übereinstimmungen für jeden Abfragetyp in einem einheitlichen Resultset zurück.

  • Hybridabfragen können auch umfangreich sein. Sie können in einer Anforderung eine Ähnlichkeitssuche für ausführliche segmentierte Inhalte und eine Schlüsselwortsuche für Namen ausführen.

  • Die Relevanzoptimierung wird durch Folgendes unterstützt:

Im Vergleichs- und Benchmarktest erzeugen Hybridabfragen mit Text- und Vektorfeldern, ergänzt durch semantische Rangfolge, die relevantesten Ergebnisse.

Beispielcode für einen RAG-Workflow

Der folgende Python-Code veranschaulicht die wesentlichen Komponenten eines RAG-Workflows in Azure KI-Suche. Sie müssen die Clients einrichten, einen Systemprompt definieren und eine Abfrage bereitstellen. Der Prompt weist das LLM an, nur die Ergebnisse aus der Abfrage zu verwenden und wie die Ergebnisse zurückgegeben werden sollen. Weitere Schritte basierend auf diesem Beispiel finden Sie in diesem RAG-Schnellstart.

Ändern Sie für die Azure Government-Cloud den API-Endpunkt des Tokenanbieters in "https://cognitiveservices.azure.us/.default".

# Set up the query for generating responses
from azure.identity import DefaultAzureCredential
from azure.identity import get_bearer_token_provider
from azure.search.documents import SearchClient
from openai import AzureOpenAI

credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
openai_client = AzureOpenAI(
    api_version="2024-06-01",
    azure_endpoint=AZURE_OPENAI_ACCOUNT,
    azure_ad_token_provider=token_provider
)

search_client = SearchClient(
    endpoint=AZURE_SEARCH_SERVICE,
    index_name="hotels-sample-index",
    credential=credential
)

# This prompt provides instructions to the model. 
# The prompt includes the query and the source, which are specified further down in the code.
GROUNDED_PROMPT="""
You are a friendly assistant that recommends hotels based on activities and amenities.
Answer the query using only the sources provided below in a friendly and concise bulleted manner.
Answer ONLY with the facts listed in the list of sources below.
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Query: {query}
Sources:\n{sources}
"""

# The query is sent to the search engine, but it's also passed in the prompt
query="Can you recommend a few hotels near the ocean with beach access and good views"

# Retrieve the selected fields from the search index related to the question
search_results = search_client.search(
    search_text=query,
    top=5,
    select="Description,HotelName,Tags"
)
sources_formatted = "\n".join([f'{document["HotelName"]}:{document["Description"]}:{document["Tags"]}' for document in search_results])

response = openai_client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
        }
    ],
    model="gpt-35"
)

print(response.choices[0].message.content)

Integrationscode und LLMs

Eine RAG-Lösung, die Azure KI-Suche enthält, kann integrierte Funktionen für Datensegmentierung und -vektorisierung nutzen, oder Sie können mit Plattformen wie Semantic Kernel, LangChain oder LlamaIndex eigene erstellen.

Notebooks im Demo-Repository sind ein guter Ausgangspunkt, da sie Muster für die LLM-Integration zeigen. Der Großteil des Codes in einer RAG-Lösung besteht aus Aufrufen des LLM, sodass Sie ein Verständnis dafür entwickeln müssen, wie diese APIs funktionieren, was jenseits des Umfangs dieses Artikels liegt.

Erste Schritte

Hinweis

Einige Azure KI Search-Features sind für die menschliche Interaktion vorgesehen und sind in einem RAG-Muster nicht hilfreich. Insbesondere können Sie Features wie AutoVervollständigen und Vorschläge überspringen. Andere Features wie Facetten und orderby können nützlich sein, wären aber in einem RAG-Szenario ungewöhnlich.

Siehe auch