Share via


Augmented Generation (RAG) ophalen in Azure AI Search

Het ophalen van Augmented Generation (RAG) is een architectuur die de mogelijkheden van een Large Language Model (LLM) zoals ChatGPT vergroot door een systeem voor het ophalen van gegevens toe te voegen dat grondgegevens biedt. Door een systeem voor het ophalen van gegevens toe te voegen, hebt u controle over grondgegevens die door een LLM worden gebruikt wanneer er een antwoord wordt geformuleerd. Voor een bedrijfsoplossing betekent de RAG-architectuur dat u generatieve AI kunt beperken tot uw zakelijke inhoud die afkomstig is van gevectoriseerde documenten en afbeeldingen, en andere gegevensindelingen als u modellen voor die inhoud hebt ingesloten.

De beslissing over het te gebruiken systeem voor het ophalen van informatie is kritiek omdat het de invoer voor de LLM bepaalt. Het systeem voor het ophalen van gegevens moet het volgende bieden:

  • Indexeringsstrategieën die op schaal laden en vernieuwen, voor al uw inhoud, met de frequentie die u nodig hebt.

  • Querymogelijkheden en relevantieafstemming. Het systeem moet relevante resultaten retourneren, in de korte notaties die nodig zijn om te voldoen aan de vereisten voor de lengte van het token van LLM-invoer.

  • Beveiliging, wereldwijd bereik en betrouwbaarheid voor zowel gegevens als bewerkingen.

  • Integratie met insluitingsmodellen voor indexering en chatmodellen of taalbegripmodellen voor het ophalen.

Azure AI Search is een bewezen oplossing voor het ophalen van informatie in een RAG-architectuur. Het biedt indexerings- en querymogelijkheden, met de infrastructuur en beveiliging van de Azure-cloud. Via code en andere onderdelen kunt u een uitgebreide RAG-oplossing ontwerpen die alle elementen voor generatieve AI bevat voor uw eigen inhoud.

Notitie

Nieuw bij copilot- en RAG-concepten? Watch Vector search and state of the art retrieval for Ative AI apps.

Microsoft heeft verschillende ingebouwde implementaties voor het gebruik van Azure AI Search in een RAG-oplossing.

Gecureerde benaderingen maken het eenvoudig om aan de slag te gaan, maar voor meer controle over de architectuur hebt u een aangepaste oplossing nodig. Met deze sjablonen maakt u end-to-end-oplossingen in:

Als hulpprogramma's en sjablonen niet voldoen aan uw toepassingsvereisten, kunt u een aangepaste RAG-oplossing bouwen met behulp van Azure AI Search-API's. In de rest van dit artikel wordt beschreven hoe Azure AI Search in een aangepaste RAG-oplossing past.

Een samenvatting op hoog niveau van het patroon ziet er als volgt uit:

  • Begin met een gebruikersvraag of -aanvraag (prompt).
  • Verzend deze naar Azure AI Search om relevante informatie te vinden.
  • De hoogste gerangschikte zoekresultaten retourneren aan een LLM.
  • Gebruik de mogelijkheden voor begrip en redenering van natuurlijke taal van de LLM om een antwoord te genereren op de eerste prompt.

Azure AI Search biedt invoer voor de LLM-prompt, maar traint het model niet. In RAG-architectuur is er geen extra training. De LLM is vooraf getraind met behulp van openbare gegevens, maar genereert antwoorden die worden uitgebreid door informatie van de retriever, in dit geval Azure AI Search.

RAG-patronen met Azure AI Search bevatten de elementen die in de volgende afbeelding worden aangegeven.

Architectuurdiagram van het ophalen van informatie met zoeken en ChatGPT.

  • App UX (web-app) voor de gebruikerservaring
  • App-server of orchestrator (integratie- en coördinatielaag)
  • Azure AI Search (systeem voor het ophalen van gegevens)
  • Azure OpenAI (LLM voor generatieve AI)

De web-app biedt de gebruikerservaring en biedt de presentatie, context en gebruikersinteractie. Vragen of prompts van een gebruiker beginnen hier. Invoer passeert de integratielaag, gaat eerst naar het ophalen van informatie om de zoekresultaten op te halen, maar gaat ook naar de LLM om de context en intentie in te stellen.

De app-server of orchestrator is de integratiecode die de handoffs coördineert tussen het ophalen van gegevens en de LLM. Algemene oplossingen zijn LangChain om de werkstroom te coördineren. LangChain kan worden geïntegreerd met Azure AI Search, zodat u Azure AI Search eenvoudiger kunt opnemen als een retriever in uw werkstroom. LlamaIndex en Semantische kernel zijn andere opties.

Het systeem voor het ophalen van gegevens biedt de doorzoekbare index, querylogica en de nettolading (queryreactie). De zoekindex kan vectoren of niet-vectorinhoud bevatten. Hoewel de meeste voorbeelden en demo's vectorvelden bevatten, is dit geen vereiste. De query wordt uitgevoerd met behulp van de bestaande zoekmachine in Azure AI Search, die trefwoorden (of termen) en vectorquery's kan verwerken. De index wordt vooraf gemaakt op basis van een schema dat u definieert en geladen met uw inhoud die afkomstig is van bestanden, databases of opslag.

De LLM ontvangt de oorspronkelijke prompt, plus de resultaten van Azure AI Search. De LLM analyseert de resultaten en formuleert een antwoord. Als de LLM ChatGPT is, kan de interactie van de gebruiker een heen en weer gesprek zijn. Als u Davinci gebruikt, is de prompt mogelijk een volledig samengesteld antwoord. Een Azure-oplossing maakt waarschijnlijk gebruik van Azure OpenAI, maar er is geen harde afhankelijkheid van deze specifieke service.

Azure AI Search biedt geen systeemeigen LLM-integratie voor promptstromen of het behoud van chats, dus u moet code schrijven die indeling en status afhandelt. U kunt de demobron (Azure-Samples/azure-search-openai-demo) bekijken voor een blauwdruk van wat een volledige oplossing inhoudt. We raden Azure AI Studio ook aan om op RAG gebaseerde Azure AI Search-oplossingen te maken die kunnen worden geïntegreerd met LLM's.

In Azure AI Search wordt alle doorzoekbare inhoud opgeslagen in een zoekindex die wordt gehost op uw zoekservice. Een zoekindex is ontworpen voor snelle query's met milliseconden reactietijden, zodat de interne gegevensstructuren bestaan om die doelstelling te ondersteunen. Daartoe slaat een zoekindex geïndexeerde inhoud op en niet hele inhoudsbestanden, zoals volledige PDF-bestanden of afbeeldingen. Intern bevatten de gegevensstructuren omgekeerde indexen van tokenized tekst, vectorindexen voor insluitingen en ongewijzigde tekst voor gevallen waarin exacte overeenkomsten vereist zijn (bijvoorbeeld in filters, fuzzy zoekopdrachten, reguliere expressiequery's).

Wanneer u de gegevens voor uw RAG-oplossing instelt, gebruikt u de functies die een index maken en laden in Azure AI Search. Een index bevat velden die de broninhoud dupliceren of vertegenwoordigen. Een indexveld kan een eenvoudige overdracht zijn (een titel of beschrijving in een brondocument wordt een titel of beschrijving in een zoekindex), of een veld kan de uitvoer van een extern proces bevatten, zoals vectorisatie of vaardigheidsverwerking waarmee een weergave of tekstbeschrijving van een afbeelding wordt gegenereerd.

Aangezien u waarschijnlijk weet welk soort inhoud u wilt doorzoeken, moet u rekening houden met de indexeringsfuncties die van toepassing zijn op elk inhoudstype:

Inhoudstype Geïndexeerd als Functies
sms verzenden tokens, ongewijzigde tekst Indexeerfuncties kunnen tekst zonder opmaak ophalen uit andere Azure-resources, zoals Azure Storage en Cosmos DB. U kunt ook JSON-inhoud naar een index pushen. Als u tekst tijdens de vlucht wilt wijzigen, gebruikt u analysefuncties en normalizers om lexicale verwerking toe te voegen tijdens het indexeren. Synoniemenkaarten zijn handig als brondocumenten terminologie missen die in een query kan worden gebruikt.
sms verzenden vectoren 1 Tekst kan worden gesegmenteerd en gevectoriseerd in een indexeerpijplijn, of extern worden verwerkt en vervolgens worden geïndexeerd als vectorvelden in uw index.
image tokens, ongewijzigde tekst 2 Vaardigheden voor OCR en afbeeldingsanalyse kunnen afbeeldingen verwerken voor tekstherkenning of afbeeldingskenmerken. Afbeeldingsgegevens worden geconverteerd naar doorzoekbare tekst en toegevoegd aan de index. Vaardigheden hebben een indexeerfunctievereiste.
image vectoren 1 Afbeeldingen kunnen worden gevectoriseerd in een indexeerpijplijn of extern worden verwerkt voor een wiskundige weergave van afbeeldingsinhoud en vervolgens geïndexeerd als vectorvelden in uw index. U kunt Azure AI Vision multimodale of een opensourcemodel zoals OpenAI CLIP gebruiken om tekst en afbeeldingen in dezelfde insluitingsruimte te vectoriseren.

1 Azure AI Search biedt geïntegreerde gegevenssegmentering en vectorisatie, maar u moet afhankelijk zijn van indexeerfuncties en vaardighedensets. Als u geen indexeerfunctie kunt gebruiken, kan de Semantische kernel van Microsoft of andere communityaanbiedingen u helpen met een volledige stack-oplossing. Zie de opslagplaats azure-search-vectors voor codevoorbeelden met beide benaderingen.

2 Vaardigheden zijn ingebouwde ondersteuning voor toegepaste AI. Voor OCR- en afbeeldingsanalyse maakt de indexeringspijplijn een interne aanroep naar de Azure AI Vision-API's. Deze vaardigheden geven een geëxtraheerde afbeelding door aan Azure AI voor verwerking en ontvangen de uitvoer als tekst die wordt geïndexeerd door Azure AI Search. Vaardigheden worden ook gebruikt voor geïntegreerde gegevenssegmentering (tekstsplitsingsvaardigheden) en geïntegreerde insluiting (vaardigheden die Azure AI Vision multimodale, Azure OpenAI en modellen aanroepen in de Azure AI Studio-modelcatalogus.)

Vectoren bieden de beste accommodatie voor niet-imilare inhoud (meerdere bestandsindelingen en talen), omdat inhoud universeel wordt uitgedrukt in wiskundige representaties. Vectoren bieden ook ondersteuning voor overeenkomsten zoeken: overeenkomen met de coördinaten die het meest lijken op de vectorquery. Vergeleken met trefwoordzoekopdrachten (of zoektermen) die overeenkomen met tokenized termen, is overeenkomsten zoeken genuanceerder. Het is een betere keuze als er dubbelzinnigheids- of interpretatievereisten zijn in de inhoud of in query's.

Zodra uw gegevens zich in een zoekindex bevindt, gebruikt u de querymogelijkheden van Azure AI Search om inhoud op te halen.

In een niet-RAG-patroon maken query's een retour van een zoekclient. De query wordt verzonden, wordt uitgevoerd op een zoekmachine en het antwoord dat wordt geretourneerd naar de clienttoepassing. Het antwoord of de zoekresultaten bestaan uitsluitend uit de exacte inhoud in uw index.

In een RAG-patroon worden query's en antwoorden gecoördineerd tussen de zoekmachine en de LLM. De vraag of query van een gebruiker wordt doorgestuurd naar zowel de zoekmachine als de LLM als een prompt. De zoekresultaten komen terug van de zoekmachine en worden omgeleid naar een LLM. Het antwoord dat het terugbrengt naar de gebruiker is generatieve AI, ofwel een optelsom of antwoord van de LLM.

Er is geen querytype in Azure AI Search, zelfs niet semantisch of vectorzoekopdrachten, waarmee nieuwe antwoorden worden samengesteld. Alleen de LLM biedt generatieve AI. Dit zijn de mogelijkheden in Azure AI Search die worden gebruikt om query's te formuleren:

Queryfunctie Doel Redenen om dit te gebruiken
Eenvoudige of volledige Lucene-syntaxis Query's uitvoeren op tekst en niet-numerieke inhoud Zoeken in volledige tekst is het meest geschikt voor exacte overeenkomsten, in plaats van vergelijkbare overeenkomsten. Zoekquery's voor volledige tekst worden gerangschikt met behulp van het BM25-algoritme en ondersteunen het afstemmen van relevantie via scoreprofielen. Het ondersteunt ook filters en facetten.
Filters en facetten Alleen van toepassing op tekst- of numerieke velden (niet-numerieke velden). Vermindert het zoekoppervlak op basis van insluitings- of uitsluitingscriteria. Voegt precisie toe aan uw query's.
Semantische rangschikking Rangschikt een BM25-resultatenset opnieuw met behulp van semantische modellen. Produceert korte ondertiteling en antwoorden die nuttig zijn als LLM-invoer. Eenvoudiger dan scoreprofielen, en afhankelijk van uw inhoud, een betrouwbaardere techniek voor het afstemmen van relevantie.
Vector zoeken Query's uitvoeren op vectorvelden voor overeenkomsten zoeken, waarbij de querytekenreeks een of meer vectoren is. Vectoren kunnen alle typen inhoud in elke taal vertegenwoordigen.
Hybride zoekopdracht Combineert een of alle bovenstaande querytechnieken. Vector- en nonvectorquery's worden parallel uitgevoerd en worden geretourneerd in een uniforme resultatenset. De belangrijkste voordelen van precisie en relevante overeenkomsten zijn via hybride query's.

Het queryantwoord structuren

Het antwoord van een query levert de invoer voor de LLM, zodat de kwaliteit van uw zoekresultaten essentieel is voor succes. Resultaten zijn een rijenset in tabelvorm. De samenstelling of structuur van de resultaten is afhankelijk van:

  • Velden die bepalen welke onderdelen van de index zijn opgenomen in het antwoord.
  • Rijen die een overeenkomst uit de index vertegenwoordigen.

Velden worden weergegeven in zoekresultaten wanneer het kenmerk 'ophaalbaar' is. Een velddefinitie in het indexschema heeft kenmerken en die bepalen of een veld wordt gebruikt in een antwoord. Alleen velden die kunnen worden opgehaald, worden geretourneerd in volledige tekst of vectorqueryresultaten. Standaard worden alle 'ophaalbare' velden geretourneerd, maar u kunt 'selecteren' gebruiken om een subset op te geven. Naast "ophaalbaar", zijn er geen beperkingen voor het veld. Velden kunnen van elke lengte of elk type zijn. Met betrekking tot lengte is er geen maximale veldlengtelimiet in Azure AI Search, maar er gelden limieten voor de grootte van een API-aanvraag.

Rijen zijn overeenkomsten met de query, gerangschikt op relevantie, overeenkomsten of beide. Standaard worden de resultaten beperkt tot de top 50 overeenkomsten voor zoekopdrachten in volledige tekst of k-nearest-neighbor-overeenkomsten voor vectorzoekopdrachten. U kunt de standaardinstellingen wijzigen om de limiet te verhogen of te verlagen tot maximaal 1000 documenten. U kunt ook de bovenste parameters gebruiken en paggineringsparameters overslaan om resultaten op te halen als een reeks gepagineerde resultaten.

Relevantie en relevante overeenkomsten maximaliseren

Wanneer u werkt met complexe processen, een grote hoeveelheid gegevens en verwachtingen voor milliseconden voor reacties, is het essentieel dat elke stap waarde toevoegt en de kwaliteit van het eindresultaat verbetert. Aan de kant van het ophalen van informatie is relevantieafstemming een activiteit die de kwaliteit van de resultaten verbetert die naar de LLM wordt verzonden. Alleen de meest relevante of de meest vergelijkbare overeenkomende documenten moeten worden opgenomen in de resultaten.

Hier volgen enkele tips voor het maximaliseren van relevantie en relevante overeenkomsten:

  • Hybride query's die trefwoorden (niet-vectorzoekopdrachten) combineren, bieden maximale relevante overeenkomsten wanneer de invoer hetzelfde is. Als u in een hybride query dubbelklikt op dezelfde invoer, genereren een tekenreeks en het vectorequivalent parallelle query's voor trefwoorden en overeenkomsten, waardoor de meest relevante overeenkomsten van elk querytype in een uniforme resultatenset worden geretourneerd.

  • Hybride query's kunnen ook uitgebreid zijn. U kunt overeenkomsten doorzoeken op uitgebreide, gesegmenteerde inhoud en zoeken naar trefwoorden via namen, allemaal in dezelfde aanvraag.

  • Relevantieafstemming wordt ondersteund via:

Ter vergelijking en benchmarktests produceren hybride query's met tekst- en vectorvelden, aangevuld met semantische classificatie, de meest relevante resultaten.

Voorbeeldcode voor een RAG-werkstroom

De volgende Python-code demonstreert de essentiële onderdelen van een RAG-werkstroom in Azure AI Search. U moet de clients instellen, een systeemprompt definiëren en een query opgeven. De prompt geeft aan dat de LLM alleen de resultaten van de query moet gebruiken en hoe de resultaten moeten worden geretourneerd. Zie deze RAG-quickstart voor meer stappen op basis van dit voorbeeld.

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

Integratiecode en LLM's

Een RAG-oplossing met Azure AI Search kan gebruikmaken van ingebouwde mogelijkheden voor gegevenssegmentering en vectorisatie, of u kunt uw eigen oplossing bouwen met behulp van platforms zoals Semantic Kernel, LangChain of LlamaIndex.

Notebooks in de demoopslagplaats zijn een goed uitgangspunt omdat ze patronen voor LLM-integratie weergeven. Veel van de code in een RAG-oplossing bestaat uit aanroepen naar de LLM, dus u moet inzicht krijgen in hoe deze API's werken, wat buiten het bereik van dit artikel valt.

Aan de slag

Notitie

Sommige Azure AI Search-functies zijn bedoeld voor menselijke interactie en zijn niet nuttig in een RAG-patroon. U kunt functies zoals automatisch aanvullen en suggesties overslaan. Andere functies zoals facetten en orderby kunnen nuttig zijn, maar zijn ongebruikelijk in een RAG-scenario.

Zie ook