Självstudie: Maximera relevans (RAG i Azure AI Search)
I den här självstudien lär du dig att förbättra relevansen för sökresultat som används i RAG-lösningar. Relevansjustering kan vara en viktig faktor för att leverera en RAG-lösning som uppfyller användarnas förväntningar. I Azure AI Search innehåller relevansjustering L2-semantisk rangordning och bedömningsprofiler.
Om du vill implementera de här funktionerna går du tillbaka till indexschemat för att lägga till konfigurationer för semantisk rangordning och bedömningsprofiler. Sedan kör du frågorna igen med hjälp av de nya konstruktionerna.
I den här självstudien ändrar du det befintliga sökindexet och frågorna så att de används:
- L2 semantisk rankning
- Bedömningsprofil för dokumentstärkning
I den här självstudien uppdateras sökindexet som skapats av indexeringspipelinen. Uppdateringar påverkar inte det befintliga innehållet, så ingen återskapande krävs och du behöver inte köra indexeraren igen.
Kommentar
Det finns fler relevansfunktioner i förhandsversionen, inklusive viktning av vektorfrågor och minsta tröskelvärden, men vi utelämnar dem från den här självstudien eftersom de är i förhandsversion.
Förutsättningar
Visual Studio Code med Python-tilläggetoch Jupyter-paketet.
Azure AI Search, Basic-nivå eller högre för hanterad identitet och semantisk rangordning, i samma region som Azure OpenAI och Azure AI Services.
Azure OpenAI, med distribution av textinbäddning-002 och gpt-35-turbo, i samma region som Azure AI Search.
Hämta exemplet
Exempelanteckningsboken innehåller ett uppdaterat index och en frågebegäran.
Köra en baslinjefråga för jämförelse
Låt oss börja med en ny fråga: "Finns det några molnformationer som är specifika för hav och stora vattenkroppar?".
Om du vill jämföra resultat efter att ha lagt till relevansfunktioner kör du frågan mot det befintliga indexschemat innan du lägger till semantisk rangordning eller en bedömningsprofil.
För Azure Government-molnet ändrar du API-slutpunkten på tokenprovidern till "https://cognitiveservices.azure.us/.default"
.
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
)
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}
"""
# Focused query on cloud formations and bodies of water
query="Are there any cloud formations specific to oceans and large bodies of water?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")
search_results = search_client.search(
search_text=query,
vector_queries= [vector_query],
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])
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)
Utdata från den här begäran kan se ut som i följande exempel.
Yes, there are cloud formations specific to oceans and large bodies of water.
A notable example is "cloud streets," which are parallel rows of clouds that form over
the Bering Strait in the Arctic Ocean. These cloud streets occur when wind blows from
a cold surface like sea ice over warmer, moister air near the open ocean, leading to
the formation of spinning air cylinders. Clouds form along the upward cycle of these cylinders,
while skies remain clear along the downward cycle (Source: page-21.pdf).
Uppdatera indexet för semantisk rangordning och bedömningsprofiler
I en tidigare självstudie har du utformat ett indexschema för RAG-arbetsbelastningar. Vi utelämnade avsiktligt relevansförbättringar från det schemat så att du kunde fokusera på grunderna. Om du skjuter upp relevansen för en separat övning får du en jämförelse före och efter av kvaliteten på sökresultaten när uppdateringarna har gjorts.
Uppdatera importinstruktionerna så att de innehåller klasser för semantisk rangordning och bedömningsprofiler.
from azure.identity import DefaultAzureCredential from azure.identity import get_bearer_token_provider from azure.search.documents.indexes import SearchIndexClient from azure.search.documents.indexes.models import ( SearchField, SearchFieldDataType, VectorSearch, HnswAlgorithmConfiguration, VectorSearchProfile, AzureOpenAIVectorizer, AzureOpenAIVectorizerParameters, SearchIndex, SemanticConfiguration, SemanticPrioritizedFields, SemanticField, SemanticSearch, ScoringProfile, TagScoringFunction, TagScoringParameters )
Lägg till följande semantiska konfiguration i sökindexet. Det här exemplet finns i uppdateringsschemasteget i notebook-filen.
# New semantic configuration semantic_config = SemanticConfiguration( name="my-semantic-config", prioritized_fields=SemanticPrioritizedFields( title_field=SemanticField(field_name="title"), keywords_fields=[SemanticField(field_name="locations")], content_fields=[SemanticField(field_name="chunk")] ) ) # Create the semantic settings with the configuration semantic_search = SemanticSearch(configurations=[semantic_config])
En semantisk konfiguration har ett namn och en prioriterad lista över fält för att optimera indata till semantisk ranker. Mer information finns i Konfigurera semantisk rangordning.
Lägg sedan till en bedömningsprofildefinition. Precis som med semantisk konfiguration kan en bedömningsprofil läggas till i ett indexschema när som helst. Det här exemplet finns också i uppdateringsschemasteget i notebook-filen, efter den semantiska konfigurationen.
# New scoring profile scoring_profiles = [ ScoringProfile( name="my-scoring-profile", functions=[ TagScoringFunction( field_name="locations", boost=5.0, parameters=TagScoringParameters( tags_parameter="tags", ), ) ] ) ]
Den här profilen använder taggfunktionen som ökar poängen för dokument där en matchning hittades i fältet platser. Kom ihåg att sökindexet har ett vektorfält och flera icke-inledande fält för rubrik, segment och platser. Platsfältet är en strängsamling, och strängsamlingar kan ökas med hjälp av funktionen taggar i en bedömningsprofil. Mer information finns i Lägga till en bedömningsprofil och Förbättra sökrelevansen med dokumentförstärkning (blogginlägg).
Uppdatera indexdefinitionen för söktjänsten.
# Update the search index with the semantic configuration index = SearchIndex(name=index_name, fields=fields, vector_search=vector_search, semantic_search=semantic_search, scoring_profiles=scoring_profiles) result = index_client.create_or_update_index(index) print(f"{result.name} updated")
Uppdatera frågor för semantisk rangordning och bedömningsprofiler
I en tidigare självstudie körde du frågor som körs på sökmotorn och skickade svaret och annan information till en LLM för att slutföra chatten.
I det här exemplet ändras frågebegäran så att den innehåller den semantiska konfigurationen och bedömningsprofilen.
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
)
# Prompt is unchanged in this update
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.
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}
"""
# Queries are unchanged in this update
query="Are there any cloud formations specific to oceans and large bodies of water?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")
# Add query_type semantic and semantic_configuration_name
# Add scoring_profile and scoring_parameters
search_results = search_client.search(
query_type="semantic",
semantic_configuration_name="my-semantic-config",
scoring_profile="my-scoring-profile",
scoring_parameters=["tags-ocean, 'sea surface', seas, surface"],
search_text=query,
vector_queries= [vector_query],
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])
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)
Utdata från en semantiskt rangordnad och förstärkt fråga kan se ut som i följande exempel.
Yes, there are specific cloud formations influenced by oceans and large bodies of water:
- **Stratus Clouds Over Icebergs**: Low stratus clouds can frame holes over icebergs,
such as Iceberg A-56 in the South Atlantic Ocean, likely due to thermal instability caused
by the iceberg (source: page-39.pdf).
- **Undular Bores**: These are wave structures in the atmosphere created by the collision
of cool, dry air from a continent with warm, moist air over the ocean, as seen off the
coast of Mauritania (source: page-23.pdf).
- **Ship Tracks**: These are narrow clouds formed by water vapor condensing around tiny
particles from ship exhaust. They are observed over the oceans, such as in the Pacific Ocean
off the coast of California (source: page-31.pdf).
These specific formations are influenced by unique interactions between atmospheric conditions
and the presence of large water bodies or objects within them.
Att lägga till semantiska ranknings- och bedömningsprofiler påverkar svaret från LLM positivt genom att främja resultat som uppfyller bedömningskriterierna och är semantiskt relevanta.
Nu när du har en bättre förståelse för index- och frågedesign går vi vidare till att optimera för hastighet och koncision. Vi går tillbaka till schemadefinitionen för att implementera kvantisering och lagringsminskning, men resten av pipelinen och modellerna förblir intakta.