Hämtning av utökad generation (RAG) i Azure AI Search
RAG (Retrieval Augmented Generation) är en arkitektur som utökar funktionerna i en stor språkmodell (LLM) som ChatGPT genom att lägga till ett informationshämtningssystem som tillhandahåller jordningsdata. Genom att lägga till ett informationshämtningssystem får du kontroll över jordningsdata som används av en LLM när den formulerar ett svar. För en företagslösning innebär RAG-arkitektur att du kan begränsa generativ AI till ditt företagsinnehåll som kommer från vektoriserade dokument och bilder och andra dataformat om du har inbäddningsmodeller för innehållet.
Beslutet om vilket informationshämtningssystem som ska användas är avgörande eftersom det avgör indata till LLM. Informationshämtningssystemet bör tillhandahålla:
Indexeringsstrategier som läser in och uppdaterar i stor skala, för allt innehåll, med den frekvens du behöver.
Frågefunktioner och relevansjustering. Systemet bör returnera relevanta resultat i de korta format som krävs för att uppfylla kraven på tokenlängd för LLM-indata.
Säkerhet, global räckvidd och tillförlitlighet för både data och åtgärder.
Integrering med inbäddningsmodeller för indexering och chattmodeller eller språktolkningsmodeller för hämtning.
Azure AI Search är en beprövad lösning för informationshämtning i en RAG-arkitektur. Den tillhandahåller indexerings- och frågefunktioner med infrastrukturen och säkerheten i Azure-molnet. Med hjälp av kod och andra komponenter kan du utforma en omfattande RAG-lösning som innehåller alla element för generativ AI framför ditt egenutvecklade innehåll.
Kommentar
Är du nybörjare på copilot- och RAG-begrepp? Titta på Vektorsökning och senaste hämtning för Generative AI-appar.
Metoder för RAG med Azure AI Search
Microsoft har flera inbyggda implementeringar för att använda Azure AI Search i en RAG-lösning.
- Azure AI Studio, använd ett vektorindex och hämtningsförstoring.
- Azure OpenAI, använd ett sökindex med eller utan vektorer.
- Azure Machine Learning, använd ett sökindex som ett vektorlager i ett promptflöde.
Utvalda metoder gör det enkelt att komma igång, men för att få mer kontroll över arkitekturen behöver du en anpassad lösning. Dessa mallar skapar lösningar från slutpunkt till slutpunkt i:
Om verktyg och mallar inte uppfyller dina programkrav kan du skapa en anpassad RAG-lösning med hjälp av Api:er för Azure AI Search. Resten av den här artikeln utforskar hur Azure AI Search passar in i en anpassad RAG-lösning.
Anpassat RAG-mönster för Azure AI Search
En sammanfattning på hög nivå av mönstret ser ut så här:
- Börja med en användarfråga eller begäran (fråga).
- Skicka den till Azure AI Search för att hitta relevant information.
- Returnera de högst rankade sökresultaten till en LLM.
- Använd funktionerna för förståelse och resonemang för naturligt språk i LLM för att generera ett svar på den första prompten.
Azure AI Search innehåller indata till LLM-prompten, men tränar inte modellen. I RAG-arkitekturen finns det ingen extra utbildning. LLM är förtränad med offentliga data, men den genererar svar som utökas med information från hämtaren, i det här fallet Azure AI Search.
RAG-mönster som inkluderar Azure AI Search innehåller de element som anges i följande bild.
- App-UX (webbapp) för användarupplevelsen
- Appserver eller orchestrator (integrerings- och samordningslager)
- Azure AI Search (informationshämtningssystem)
- Azure OpenAI (LLM för generativ AI)
Webbappen tillhandahåller användarupplevelsen och tillhandahåller presentation, kontext och användarinteraktion. Frågor eller frågor från en användare börjar här. Indata passerar genom integreringsskiktet och går först till informationshämtning för att hämta sökresultaten, men går också till LLM för att ange kontext och avsikt.
Appservern eller orkestratorn är integrationskoden som samordnar överlämningarna mellan informationshämtning och LLM. Vanliga lösningar är LangChain för att samordna arbetsflödet. LangChain integreras med Azure AI Search, vilket gör det enklare att inkludera Azure AI Search som en retriever i arbetsflödet. LlamaIndex och Semantic Kernel är andra alternativ.
Informationshämtningssystemet innehåller det sökbara indexet, frågelogik och nyttolasten (frågesvar). Sökindexet kan innehålla vektorer eller icke-bevektorinnehåll. Även om de flesta exempel och demonstrationer innehåller vektorfält är det inte ett krav. Frågan körs med hjälp av den befintliga sökmotorn i Azure AI Search, som kan hantera nyckelord (eller term) och vektorfrågor. Indexet skapas i förväg baserat på ett schema som du definierar och läses in med ditt innehåll som kommer från filer, databaser eller lagring.
LLM tar emot den ursprungliga prompten, plus resultatet från Azure AI Search. LLM analyserar resultaten och formulerar ett svar. Om LLM är ChatGPT kan användarinteraktionen vara en konversation fram och tillbaka. Om du använder Davinci kan frågan vara ett fullständigt sammansatt svar. En Azure-lösning använder troligen Azure OpenAI, men det finns inget hårt beroende av den här specifika tjänsten.
Azure AI Search tillhandahåller inte inbyggd LLM-integrering för snabbflöden eller chattkonservering, så du måste skriva kod som hanterar orkestrering och tillstånd. Du kan granska demokällan (Azure-Samples/azure-search-openai-demo) för en skiss av vad en fullständig lösning innebär. Vi rekommenderar också Att Azure AI Studio skapar RAG-baserade Azure AI Search-lösningar som integreras med LLM:er.
Sökbart innehåll i Azure AI Search
I Azure AI Search lagras allt sökbart innehåll i ett sökindex som finns i söktjänsten. Ett sökindex är utformat för snabba frågor med svarstider på millisekunder, så dess interna datastrukturer finns för att stödja det målet. För detta ändamål lagrar ett sökindex indexerat innehåll och inte hela innehållsfiler som hela PDF-filer eller bilder. Internt inkluderar datastrukturerna inverterade index för tokeniserad text, vektorindex för inbäddningar och oförändrad text för fall där ordagrann matchning krävs (till exempel i filter, fuzzy-sökning, frågor om reguljära uttryck).
När du konfigurerar data för din RAG-lösning använder du de funktioner som skapar och läser in ett index i Azure AI Search. Ett index innehåller fält som duplicerar eller representerar källinnehållet. Ett indexfält kan vara enkel överföring (en rubrik eller beskrivning i ett källdokument blir en rubrik eller beskrivning i ett sökindex), eller ett fält kan innehålla utdata från en extern process, till exempel vektorisering eller färdighetsbearbetning som genererar en representation eller textbeskrivning av en bild.
Eftersom du förmodligen vet vilken typ av innehåll du vill söka igenom bör du överväga de indexeringsfunktioner som gäller för varje innehållstyp:
Innehållstyp | Indexerat som | Funktioner |
---|---|---|
text | tokens, oförändrad text | Indexerare kan hämta oformaterad text från andra Azure-resurser som Azure Storage och Cosmos DB. Du kan också push-överföra JSON-innehåll till ett index. Om du vill ändra text under flygning använder du analysverktyg och normaliserare för att lägga till lexikal bearbetning under indexering. Synonymkartor är användbara om källdokument saknar terminologi som kan användas i en fråga. |
text | vektorer 1 | Text kan segmenteras och vektoriseras i en indexeringspipeline, eller hanteras externt och sedan indexeras som vektorfält i ditt index. |
bild | tokens, oförändrad text 2 | Kunskaper för OCR och bildanalys kan bearbeta bilder för textigenkänning eller bildegenskaper. Bildinformation konverteras till sökbar text och läggs till i indexet. Kunskaper har ett indexerarekrav. |
bild | vektorer 1 | Bilder kan vektoriseras i en indexeringspipeline eller hanteras externt för en matematisk representation av bildinnehåll och sedan indexeras som vektorfält i ditt index. Du kan använda Azure AI Vision multimodal eller en öppen källkod modell som OpenAI CLIP för att vektorisera text och bilder i samma inbäddningsutrymme. |
1 Azure AI Search tillhandahåller integrerad datasegmentering och vektorisering, men du måste vara beroende av indexerare och kompetensuppsättningar. Om du inte kan använda en indexerare kan Microsofts semantiska kernel eller andra community-erbjudanden hjälpa dig med en fullständig stacklösning. Kodexempel som visar båda metoderna finns i lagringsplatsen azure-search-vectors.
2 Färdigheter är inbyggt stöd för tillämpad AI. För OCR och bildanalys gör indexeringspipelinen ett internt anrop till Api:erna för Azure AI Vision. Dessa kunskaper skickar en extraherad avbildning till Azure AI för bearbetning och tar emot utdata som text som indexeras av Azure AI Search. Kunskaper används också för integrerad datasegmentering (kompetens för textdelning) och integrerad inbäddning (kunskaper som kallar Azure AI Vision multimodal, Azure OpenAI och modeller i Azure AI Studio-modellkatalogen.)
Vektorer är det bästa alternativet för olika innehåll (flera filformat och språk) eftersom innehållet uttrycks universellt i matematiska representationer. Vektorer stöder också likhetssökning: matchning på koordinaterna som mest liknar vektorfrågan. Jämfört med nyckelordssökning (eller termsökning) som matchar tokeniserade termer är likhetssökningen mer nyanserad. Det är ett bättre val om det finns tvetydighets- eller tolkningskrav i innehållet eller i frågor.
Innehållshämtning i Azure AI Search
När dina data finns i ett sökindex använder du frågefunktionerna i Azure AI Search för att hämta innehåll.
I ett icke-RAG-mönster gör frågor en tur och retur från en sökklient. Frågan skickas, den körs på en sökmotor och svaret returneras till klientprogrammet. Svaret, eller sökresultatet, består uteslutande av det ordagranna innehållet som finns i ditt index.
I ett RAG-mönster samordnas frågor och svar mellan sökmotorn och LLM. En användares fråga eller fråga vidarebefordras till både sökmotorn och till LLM som en uppmaning. Sökresultaten kommer tillbaka från sökmotorn och omdirigeras till en LLM. Svaret som gör det tillbaka till användaren är generativ AI, antingen en sammanfattning eller ett svar från LLM.
Det finns ingen frågetyp i Azure AI Search – inte ens semantisk sökning eller vektorsökning – som skapar nya svar. Endast LLM tillhandahåller generativ AI. Här är funktionerna i Azure AI Search som används för att formulera frågor:
Frågefunktion | Syfte | Varför du ska använda det |
---|---|---|
Enkel eller fullständig Lucene-syntax | Frågekörning över text och icke-numeriskt innehåll | Fulltextsökning är bäst för exakta matchningar, snarare än liknande matchningar. Fulltextsökningsfrågor rangordnas med BM25-algoritmen och stöder relevansjustering via bedömningsprofiler. Den stöder också filter och fasetter. |
Filter och fasetter | Gäller endast för text- eller numeriska fält (icke-belackare). Minskar sökytan baserat på inkluderings- eller exkluderingskriterier. | Lägger till precision i dina frågor. |
Semantisk ranker | Rangordna om en BM25-resultatuppsättning med hjälp av semantiska modeller. Ger korta bildtexter och svar som är användbara som LLM-indata. | Enklare än att bedöma profiler, och beroende på ditt innehåll är en mer tillförlitlig teknik för relevansjustering. |
Vektorsökning | Frågekörning över vektorfält för likhetssökning, där frågesträngen är en eller flera vektorer. | Vektorer kan representera alla typer av innehåll på valfritt språk. |
Hybridsökning | Kombinerar någon av eller alla ovanstående frågetekniker. Vektor- och nonvector-frågor körs parallellt och returneras i en enhetlig resultatuppsättning. | De viktigaste vinsterna i precision och återkallande är genom hybridfrågor. |
Strukturera frågesvaret
En frågas svar ger indata till LLM, så kvaliteten på sökresultaten är avgörande för att lyckas. Resultatet är en tabellraduppsättning. Resultatets sammansättning eller struktur beror på:
- Fält som avgör vilka delar av indexet som ingår i svaret.
- Rader som representerar en matchning från index.
Fält visas i sökresultat när attributet är "hämtningsbart". En fältdefinition i indexschemat har attribut och de avgör om ett fält används i ett svar. Endast "hämtningsbara" fält returneras i fulltext- eller vektorfrågeresultat. Som standard returneras alla "hämtningsbara" fält, men du kan använda "select" för att ange en delmängd. Förutom "hämtningsbar" finns det inga begränsningar för fältet. Fält kan vara av valfri längd eller typ. När det gäller längd finns det ingen gräns för maximal fältlängd i Azure AI Search, men det finns gränser för storleken på en API-begäran.
Rader matchar frågan, rangordnade efter relevans, likhet eller båda. Som standard begränsas resultaten till de 50 bästa matchningarna för fulltextsökning eller k-närmaste granne-matchningar för vektorsökning. Du kan ändra standardvärdena för att öka eller minska gränsen till högst 1 000 dokument. Du kan också använda de översta och hoppa över växlingsparametrar för att hämta resultat som en serie sidsidiga resultat.
Maximera relevans och återkallande
När du arbetar med komplexa processer, en stor mängd data och förväntningar på millisekunders svar är det viktigt att varje steg tillför värde och förbättrar slutresultatets kvalitet. På informationshämtningssidan är relevansjustering en aktivitet som förbättrar kvaliteten på resultaten som skickas till LLM. Endast de mest relevanta eller mest liknande matchande dokumenten ska ingå i resultaten.
Här följer några tips för att maximera relevans och återkalla:
Hybridfrågor som kombinerar nyckelordssökning (nonvector) och vektorsökning ger dig maximal träffsäkerhet när indata är desamma. Om du dubblar samma indata i en hybridfråga genererar en textsträng och dess vektormotsvarighet parallella frågor för nyckelord och likhetssökning, vilket returnerar de mest relevanta matchningarna från varje frågetyp i en enhetlig resultatuppsättning.
Hybridfrågor kan också vara omfattande. Du kan köra likhetssökning över utförligt segmenterat innehåll och nyckelordssökning över namn, allt i samma begäran.
Relevansjustering stöds genom:
Bedömningsprofiler som ökar sökpoängen om matchningar hittas i ett specifikt sökfält eller på andra kriterier.
Semantisk rankare som rangordnar om en inledande resultatuppsättning med hjälp av semantiska modeller från Bing för att ordna om resultaten för en bättre semantisk anpassning till den ursprungliga frågan.
Frågeparametrar för finjustering. Du kan öka vikten av vektorfrågor eller justera mängden BM25-rankade resultat i en hybridfråga. Du kan också ange minimitrösklar för att exkludera resultat med låg poäng från en vektorfråga.
Vid jämförelse- och benchmark-testning ger hybridfrågor med text- och vektorfält, kompletterade med semantisk rangordning, de mest relevanta resultaten.
Exempelkod för ett RAG-arbetsflöde
Följande Python-kod visar de viktigaste komponenterna i ett RAG-arbetsflöde i Azure AI Search. Du måste konfigurera klienterna, definiera en systemprompt och ange en fråga. Uppmaningen instruerar LLM att bara använda resultatet från frågan och hur resultatet returneras. Fler steg som baseras på det här exemplet finns i den här RAG-snabbstarten.
För Azure Government-molnet ändrar du API-slutpunkten på tokenprovidern till "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)
Integreringskod och LLM:er
En RAG-lösning som innehåller Azure AI Search kan utnyttja inbyggda funktioner för datasegmentering och vektorisering, eller så kan du skapa egna med hjälp av plattformar som Semantic Kernel, LangChain eller LlamaIndex.
Notebook-filer på demolagringsplatsen är en bra startpunkt eftersom de visar mönster för LLM-integrering. Mycket av koden i en RAG-lösning består av anrop till LLM så du behöver utveckla en förståelse för hur dessa API:er fungerar, vilket ligger utanför omfånget för den här artikeln.
Så här kommer du igång
Prova den här RAG-snabbstarten för en demonstration av frågeintegrering med chattmodeller över ett sökindex.
Självstudie: Så här skapar du en RAG-lösning i Azure AI Search för fokuserad täckning på funktionerna och mönstret för RAG-lösningar som hämtar grunddata från ett sökindex.
Börja med lösningsacceleratorer:
Använd mallar för företagschattappar för att distribuera Azure-resurser, kod och exempel på grunddata med fiktiva hälsoplansdokument för Contoso och Northwind. Den här lösningen från slutpunkt till slutpunkt ger dig en fungerande chattapp på så lite som 15 minuter. Kod för dessa mallar är den azure-search-openai-demo som visas i flera presentationer. Följande länkar innehåller språkspecifika versioner:
Granska indexeringsbegrepp och strategier för att avgöra hur du vill mata in och uppdatera data. Bestäm om du vill använda vektorsökning, nyckelordssökning eller hybridsökning. Vilken typ av innehåll du behöver söka efter och vilken typ av frågor du vill köra avgör indexdesignen.
Läs mer om att skapa frågor om du vill veta mer om syntax och krav för sökbegäran.
Kommentar
Vissa Azure AI Search-funktioner är avsedda för mänsklig interaktion och är inte användbara i ett RAG-mönster. Mer specifikt kan du hoppa över funktioner som automatisk komplettering och förslag. Andra funktioner som fasetter och orderby kan vara användbara, men skulle vara ovanliga i ett RAG-scenario.