Freigeben über


Tutorial: Durchsuchen Ihrer Daten mit einem Chatmodell (RAG in Azure KI-Suche)

Eine RAG-Lösung (Reality Augmented Generation) in Azure KI-Suche zeichnet sich dadurch aus, dass sie Abfragen an ein LLM (Large Language Model) sendet, um eine unterhaltungsbezogene Sucherfahrung für Ihre indizierten Inhalte bereitzustellen. Es kann überraschend einfach sein, wenn Sie nur die Grundlagen umsetzen.

In diesem Tutorial:

  • Einrichten von Clients
  • Schreiben von Anweisungen für das LLM
  • Bereitstellen einer Abfrage für LLM-Eingaben
  • Überprüfen der Ergebnisse und Erkunden der nächsten Schritte

Dieses Tutorial baut auf den vorherigen Tutorials auf. Es wird davon ausgegangen, dass Sie über einen Suchindex verfügen, der von der Indizierungspipelineerstellt wurde.

Voraussetzungen

Herunterladen des Beispiels

Sie verwenden dasselbe Notebook wie im vorherigen Tutorial zur Indizierungspipeline. Skripts zum Abfragen des LLM finden Sie Anschluss an die Schritte zur Pipelineerstellung. Falls Sie noch nicht über das Notebook verfügen, laden Sie es von GitHub herunter.

Konfigurieren von Clients zum Senden von Abfragen

Bei dem RAG-Muster in Azure KI-Suche handelt es sich um eine synchronisierte Reihe von Verbindungen mit einem Suchindex zum Abrufen der Groundingdaten gefolgt von einer Verbindung mit einem LLM, um eine Antwort auf die Frage des Benutzers zu formulieren. Von beiden Clients wird die gleiche Abfragezeichenfolge verwendet.

Sie richten zwei Clients ein und benötigen daher Endpunkte und Berechtigungen für beide Ressourcen. In diesem Tutorial wird davon ausgegangen, dass Sie Rollenzuweisungen für autorisierte Verbindungen einrichten, Sie sollten die Endpunkte aber in Ihrem Beispielnotebook bereitstellen:

# Set endpoints and API keys for Azure services
AZURE_SEARCH_SERVICE: str = "PUT YOUR SEARCH SERVICE ENDPOINT HERE"
# AZURE_SEARCH_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR SEARCH SERVICE ADMIN KEY HERE"
AZURE_OPENAI_ACCOUNT: str = "PUR YOUR AZURE OPENAI ENDPOINT HERE"
# AZURE_OPENAI_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR AZURE OPENAI KEY HERE"

Beispielskript für Prompt und Abfrage

Hier sehen Sie das Python-Skript, das die Clients instanziiert, den Prompt definiert und die Abfrage einrichtet. Sie können dieses Skript im Notebook ausführen, um anhand Ihrer Chatmodellimplementierung eine Antwort zu generieren.

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

# Import libraries
from azure.search.documents import SearchClient
from openai import AzureOpenAI

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
 )

deployment_name = "gpt-4o"

search_client = SearchClient(
     endpoint=AZURE_SEARCH_SERVICE,
     index_name=index_name,
     credential=credential
 )

# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps users learn from the information found in the source material.
Answer the query using only the sources provided below.
Use bullets if the answer has multiple points.
If the answer is longer than 3 sentences, provide a summary.
Answer ONLY with the facts listed in the list of sources below. Cite your source when you answer the question
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}
"""

# Provide the search query. 
# It's hybrid: a keyword search on "query", with text-to-vector conversion for "vector_query".
# The vector query finds 50 nearest neighbor matches in the search index
query="What's the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

# Set up the search results and the chat thread.
# Retrieve the selected fields from the search index related to the question.
# Search results are limited to the top 5 matches. Limiting top can help you stay under LLM quotas.
search_results = search_client.search(
    search_text=query,
    vector_queries= [vector_query],
    select=["title", "chunk", "locations"],
    top=5,
)

# Newlines could be in the OCR'd content or in PDFs, as is the case for the sample PDFs used for this tutorial.
# Use a unique separator to make the sources distinct. 
# We chose repeated equal signs (=) followed by a newline because it's unlikely the source documents contain this sequence.
sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])

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

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

Überprüfen der Ergebnisse

In dieser Antwort basiert die Antwort auf fünf Eingaben (top=5), die aus Blöcken bestehen, die von der Suchmaschine als die relevantesten Blöcke ermittelt wurde. Anweisungen im Prompt weisen das LLM an, nur die Informationen in den sources oder formatierte Suchergebnisse zu verwenden.

Die Ergebnisse der ersten Abfrage "What's the NASA earth book about?" sollten in etwa wie im folgenden Beispiel aussehen.

The NASA Earth book is about the intricate and captivating science of our planet, studied 
through NASA's unique perspective and tools. It presents Earth as a dynamic and complex 
system, observed through various cycles and processes such as the water cycle and ocean 
circulation. The book combines stunning satellite images with detailed scientific insights, 
portraying Earth’s beauty and the continuous interaction of land, wind, water, ice, and 
air seen from above. It aims to inspire and demonstrate that the truth of our planet is 
as compelling as any fiction.

Source: page-8.pdf

Es wird erwartet, dass LLMs unterschiedliche Antworten zurückgeben, auch wenn der Prompt und die Abfragen unverändert sind. Ihr Ergebnis kann ganz anders aussehen als das in diesem Beispiel. Weitere Informationen finden Sie unter Verwenden reproduzierbarer Ausgaben.

Hinweis

Beim Testen dieses Tutorials wurde eine Vielzahl von Antworten mit unterschiedlicher Relevanz zurückgegeben. In einigen Fällen führte die Wiederholung derselben Anforderung zu einer Verschlechterung der Antwort, was höchstwahrscheinlich auf eine Verwechslung im Chatverlauf zurückzuführen war. Die wiederholten Anforderungen wurden dabei möglicherweise vom Modell als Unzufriedenheit mit der generierten Antwort registriert. Die Verwaltung des Chatverlaufs wird in diesem Tutorial nicht behandelt. Das oben beschriebene Verhalten sollte sich jedoch minimieren oder sogar beseitigen lassen, indem Sie die Chatverlaufsverwaltung in Ihren Anwendungscode einschließen.

Hinzufügen eines Filters

Zur Erinnerung: Sie haben ein Feld locations mit angewendeter KI (künstlicher Intelligenz) erstellt, das mit Orten aufgefüllt ist, die vom Entitätserkennungsskill erkannt werden. Die Felddefinition für „locations“ enthält das Attribut filterable. Wiederholen Sie die vorherige Anforderung, fügen Sie diesmal jedoch einen Filter hinzu, der den Begriff ice im Feld „locations“ auswählt.

Ein Filter führt Ein- oder Ausschlusskriterien ein. Die Suchmaschine führt weiterhin eine Vektorsuche auf "What's the NASA earth book about?" durch, aber sie schließt jetzt Übereinstimmungen aus, die nicht den Begriff ice enthalten. Weitere Informationen zum Filtern nach Zeichenfolgensammlungen und Vektorabfragen finden Sie unter Grundlegendes zu Textfiltern, Grundlegendes zu Sammlungsfiltern und Hinzufügen von Filtern zu einer Vektorabfrage.

Ersetzen Sie die search_results-Definition durch das folgende Beispiel, das einen Filter enthält:

query="what is the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

# Add a filter that selects documents based on whether locations includes the term "ice".
search_results = search_client.search(
    search_text=query,
    vector_queries= [vector_query],
    filter="search.ismatch('ice*', 'locations', 'full', 'any')",
    select=["title", "chunk", "locations"],
    top=5,
)

sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])

search_results = search_client.search(
    search_text=query,
    top=10,
    filter="search.ismatch('ice*', 'locations', 'full', 'any')",
    select="title, chunk, locations"

Die Ergebnisse der gefilterten Abfrage sollten in etwa wie die folgende Antwort aussehen. Beachten Sie die Betonung auf die Abdeckung von ice.

The NASA Earth book showcases various geographic and environmental features of Earth through 
satellite imagery, highlighting remarkable landscapes and natural phenomena. 

- It features extraordinary views like the Holuhraun Lava Field in Iceland, captured by 
Landsat 8 during an eruption in 2014, with false-color images illustrating different elements 
such as ice, steam, sulfur dioxide, and fresh lava ([source](page-43.pdf)).
- Other examples include the North Patagonian Icefield in South America, depicted through 
clear satellite images showing glaciers and their changes over time ([source](page-147.pdf)).
- It documents melt ponds in the Arctic, exploring their effects on ice melting and 
- heat absorption ([source](page-153.pdf)).
  
Overall, the book uses satellite imagery to give insights into Earth's dynamic systems 
and natural changes.

Ändern der Eingaben

Das Erhöhen oder Verringern der Anzahl von Eingaben für das LLM kann sich erheblich auf die Antwort auswirken. Versuchen Sie, dieselbe Abfrage erneut auszuführen, nachdem Sie top=8 festgelegt haben. Wenn Sie die Anzahl von Eingaben erhöhen, gibt das Modell jedes Mal unterschiedliche Ergebnisse zurück, auch wenn sich die Abfrage nicht ändert.

Hier sehen Sie ein Beispiel für die Rückgabe des Modells, nachdem die Anzahl der Eingaben auf acht erhöht wurde.

The NASA Earth book features a range of satellite images capturing various natural phenomena 
across the globe. These include:

- The Holuhraun Lava Field in Iceland documented by Landsat 8 during a 2014 volcanic 
eruption (Source: page-43.pdf).
- The North Patagonian Icefield in South America, highlighting glacial landscapes 
captured in a rare cloud-free view in 2017 (Source: page-147.pdf).
- The impact of melt ponds on ice sheets and sea ice in the Arctic, with images from 
an airborne research campaign in Alaska during July 2014 (Source: page-153.pdf).
- Sea ice formations at Shikotan, Japan, and other notable geographic features in various 
locations recorded by different Landsat missions (Source: page-168.pdf).

Summary: The book showcases satellite images of diverse Earth phenomena, such as volcanic 
eruptions, icefields, and sea ice, to provide insights into natural processes and landscapes.

Da das Modell nur an die Groundingdaten gebunden ist, wird die Antwort umfangreicher, wenn Sie die Größe der Eingabe erhöhen. Sie können die Relevanzoptimierung verwenden, um potenziell relevantere Antworten zu generieren.

Ändern des Prompts

Sie können auch den Prompt ändern, um das Format der Ausgabe und den Ton zu steuern und zu bestimmen, ob das Modell die Antwort mit eigenen Trainingsdaten ergänzen soll.

Hier sehen Sie ein weiteres Beispiel für die LLM-Ausgabe, wenn der Prompt zum Ermitteln von Standorten für wissenschaftliche Studien geändert wird.

# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps scientists identify locations for future study.
Answer the query cocisely, using bulleted points.
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.
Do not exceed 5 bullets.
Query: {query}
Sources:\n{sources}
"""

Die Ausgabe, die zurückgegeben wird, wenn nur der Prompt geändert wird, ansonsten aber alle Aspekte der vorherigen Abfrage beibehalten werden, könnte wie dieses Beispiel aussehen.

The NASA Earth book appears to showcase various locations on Earth captured through satellite imagery, 
highlighting natural phenomena and geographic features. For instance, the book includes:

- The Holuhraun Lava Field in Iceland, detailing volcanic activity and its observation via Landsat 8.
- The North Patagonian Icefield in South America, covering its glaciers and changes over time as seen by Landsat 8.
- Melt ponds in the Arctic and their impacts on the heat balance and ice melting.
- Iceberg A-56 in the South Atlantic Ocean and its interaction with cloud formations.

(Source: page-43.pdf, page-147.pdf, page-153.pdf, page-39.pdf)

Tipp

Denken Sie daran, den Prompt auf den vorherigen Wert (You are an AI assistant that helps users learn from the information found in the source material) zurückzusetzen, wenn Sie mit dem Tutorial fortfahren.

Das Ändern von Parametern und Prompts wirkt sich auf die Antwort des LLM aus. Beachten Sie bei Ihren eigenen Erkundungen die folgenden Tipps:

  • Die Erhöhung des top-Werts kann das verfügbare Kontingent für das Modell erschöpfen. Wenn es kein Kontingent gibt, wird eine Fehlermeldung zurückgegeben, oder die Antwort des Modells könnte „I don't know“ lauten.

  • Durch das Erhöhen des top-Werts wird das Ergebnis nicht zwangsläufig verbessert. Bei Tests mit dem top-Wert sind manchmal deutlich bessere Antworten festzustellen.

  • Was könnte also helfen? In der Regel ist die Relevanzoptimierung die Antwort. Die Verbesserung der Relevanz der Suchergebnisse von Azure KI-Suche ist in der Regel der effektivste Ansatz zum Maximieren des Nutzens Ihres LLM.

In der nächsten Tutorialreihe liegt der Schwerpunkt auf der Maximierung der Relevanz und Optimierung der Abfrageleistung im Hinblick auf Geschwindigkeit und Klarheit. Wir überarbeiten die Schemadefinition und die Abfragelogik, um Relevanzfeatures zu implementieren, die restliche Pipeline und die Modelle bleiben jedoch unverändert.

Nächster Schritt