Dela via


Självstudie: Söka efter dina data med hjälp av en chattmodell (RAG i Azure AI Search)

Den definierande egenskapen för en RAG-lösning i Azure AI Search är att skicka frågor till en stor språkmodell (LLM) för en konversationssökningsupplevelse över ditt indexerade innehåll. Det kan vara förvånansvärt enkelt om du bara implementerar grunderna.

I den här kursen får du:

  • Konfigurera klienter
  • Skriv instruktioner för LLM
  • Ange en fråga som är utformad för LLM-indata
  • Granska resultaten och utforska nästa steg

Den här självstudien bygger på de tidigare självstudierna. Det förutsätter att du har ett sökindex som skapats av indexeringspipelinen.

Förutsättningar

Hämta exemplet

Du använder samma notebook-fil från den tidigare självstudiekursen för indexeringspipelinen. Skript för att köra frågor mot LLM följer stegen för att skapa pipelinen. Om du inte redan har notebook-filen laddar du ned den från GitHub.

Konfigurera klienter för att skicka frågor

RAG-mönstret i Azure AI Search är en synkroniserad serie anslutningar till ett sökindex för att hämta grunddata, följt av en anslutning till en LLM för att formulera ett svar på användarens fråga. Samma frågesträng används av båda klienterna.

Du konfigurerar två klienter, så du behöver slutpunkter och behörigheter för båda resurserna. Den här självstudien förutsätter att du konfigurerar rolltilldelningar för auktoriserade anslutningar, men du bör ange slutpunkterna i exempelanteckningsboken:

# 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"

Exempelskript för fråga och fråga

Här är Python-skriptet som instansierar klienterna, definierar prompten och konfigurerar frågan. Du kan köra det här skriptet i notebook-filen för att generera ett svar från din chattmodelldistribution.

För Azure Government-molnet ändrar du API-slutpunkten på tokenprovidern till "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)

Granska resultat

I det här svaret baseras svaret på fem indata (top=5) som består av segment som bestäms av sökmotorn som mest relevanta. Instruktioner i prompten uppmanar LLM att endast använda informationen i , sourceseller formaterade sökresultat.

Resultaten från den första frågan "What's the NASA earth book about?" bör se ut ungefär som i följande exempel.

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

Det förväntas att LLM:er returnerar olika svar, även om prompten och frågorna är oförändrade. Resultatet kan se mycket annorlunda ut än exemplet. Mer information finns i Lär dig hur du använder reproducerbara utdata.

Kommentar

När vi testade den här självstudien såg vi en mängd olika svar, vissa mer relevanta än andra. Några gånger orsakade upprepande av samma begäran en försämring av svaret, troligen på grund av förvirring i chatthistoriken, eventuellt med modellen som registrerar upprepade begäranden som missnöje med det genererade svaret. Att hantera chatthistorik ligger utanför omfånget för den här självstudien, men att inkludera den i programkoden bör minimera eller till och med eliminera det här beteendet.

Lägg till ett filter

Kom ihåg att du skapade ett locations fält med tillämpad AI, fyllt med platser som identifieras av entitetsigenkänningsfärdigheten. Fältdefinitionen för platser innehåller attributet filterable . Nu ska vi upprepa föregående begäran, men den här gången lägger vi till ett filter som väljer på termen is i fältet platser.

Ett filter introducerar inkluderings- eller exkluderingsvillkor. Sökmotorn gör fortfarande en vektorsökning på "What's the NASA earth book about?", men nu exkluderas matchningar som inte innehåller is. Mer information om filtrering på strängsamlingar och vektorfrågor finns i grunderna för textfilter, Förstå samlingsfilter och Lägg till filter i en vektorfråga.

Ersätt search_results definition med följande exempel som innehåller ett filter:

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

Resultatet från den filtrerade frågan bör nu se ut ungefär som följande svar. Observera betoningen på istäcke.

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.

Ändra indata

Att öka eller minska antalet indata till LLM kan ha stor effekt på svaret. Försök att köra samma fråga igen efter att du har angett top=8. När du ökar indata returnerar modellen olika resultat varje gång, även om frågan inte ändras.

Här är ett exempel på vad modellen returnerar efter att ha ökat indata till 8.

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.

Eftersom modellen är bunden till grunddata blir svaret mer expansivt när du ökar storleken på indata. Du kan använda relevansjustering för att potentiellt generera mer fokuserade svar.

Ändra kommandotolken

Du kan också ändra kommandotolken för att styra formatet för utdata, ton och om du vill att modellen ska komplettera svaret med sina egna träningsdata genom att ändra prompten.

Här är ett annat exempel på LLM-utdata om vi fokuserar frågan på att identifiera platser för vetenskapliga studier.

# 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}
"""

Utdata från att bara ändra prompten, annars behålla alla aspekter av föregående fråga, kan se ut som i det här exemplet.

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)

Dricks

Om du fortsätter med självstudien måste du komma ihåg att återställa kommandotolken till dess tidigare värde (You are an AI assistant that helps users learn from the information found in the source material).

Om du ändrar parametrar och frågor påverkas svaret från LLM. När du utforskar på egen hand bör du ha följande tips i åtanke:

  • Om värdet höjs top kan den tillgängliga kvoten för modellen överskridas. Om det inte finns någon kvot returneras ett felmeddelande eller så returnerar modellen "Jag vet inte".

  • top Att höja värdet förbättrar inte nödvändigtvis resultatet. När vi testar med topp ser vi ibland att svaren inte är dramatiskt bättre.

  • Så vad kan hjälpa? Vanligtvis är svaret relevansjustering. Att förbättra relevansen för sökresultaten från Azure AI Search är vanligtvis den mest effektiva metoden för att maximera verktyget för din LLM.

I nästa serie självstudier övergår fokus till att maximera relevans och optimera frågeprestanda för hastighet och koncision. Vi går tillbaka till schemadefinitionen och frågelogik för att implementera relevansfunktioner, men resten av pipelinen och modellerna förblir intakta.

Gå vidare