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:

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.
  • Verzend de meest gerangschikte zoekresultaten naar de 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 met informatie van de retriever.

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. Een optie is langchain te gebruiken 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. Semantische kernel is een andere optie.

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 Ook Azure AI Studio of Azure OpenAI Studio aan om op RAG gebaseerde Azure AI Search-oplossingen te maken die zijn 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 extern worden gesegmenteerd en gevectoriseerd 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 extern worden gevectoriseerd voor een wiskundige weergave van afbeeldingsinhoud en vervolgens geïndexeerd als vectorvelden in uw index. U kunt een opensource-model zoals OpenAI CLIP gebruiken om tekst en afbeeldingen in dezelfde insluitingsruimte te vectoriseren.

1 De algemeen beschikbare functionaliteit van vectorondersteuning vereist dat u andere bibliotheken of modellen aanroept voor gegevenssegmentering en vectorisatie. Met geïntegreerde vectorisatie (preview) worden deze stappen echter ingesloten. Zie de opslagplaats azure-search-vectors voor codevoorbeelden met beide benaderingen.

2Vaardigheden zijn ingebouwde ondersteuning voor AI-verrijking. 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.

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 onderschrift s 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.

Rangschikken op relevantie

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.

Relevantie is van toepassing op trefwoordzoekopdrachten (nonvector) en hybride query's (via de niet-vectorvelden). In Azure AI Search is er geen relevantie voor overeenkomsten zoeken en vectorquery's. BM25-classificatie is het classificatie-algoritme voor zoeken in volledige tekst.

Relevantieafstemming wordt ondersteund via functies die de BM25-classificatie verbeteren. Deze benaderingen zijn onder andere:

  • Scoreprofielen die de zoekscore verhogen als overeenkomsten worden gevonden in een specifiek zoekveld of op andere criteria.
  • Semantische rangschikking waarmee een BM25-resultatenset opnieuw wordt gerangschikt met behulp van semantische modellen van Bing om de volgorde van resultaten te wijzigen voor een betere semantische pasvorm op de oorspronkelijke query.

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

Voorbeeldcode van een Azure AI Search-query voor RAG-scenario's

De volgende code wordt gekopieerd uit het retrievethenread.py-bestand van een demosite. Het produceert content voor de LLM uit zoekresultaten voor hybride query's. U kunt een eenvoudigere query schrijven, maar dit voorbeeld is inclusief vectorzoekopdrachten en trefwoordzoekopdrachten met semantische herrankering en spellingcontrole. In de demo wordt deze query gebruikt om initiële inhoud op te halen.

# Use semantic ranker if requested and if retrieval mode is text or hybrid (vectors + text)
if overrides.get("semantic_ranker") and has_text:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  query_type=QueryType.SEMANTIC,
                                  query_language="en-us",
                                  query_speller="lexicon",
                                  semantic_configuration_name="default",
                                  top=top,
                                  query_caption="extractive|highlight-false" if use_semantic_captions else None,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
else:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  top=top,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
if use_semantic_captions:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(" . ".join([c.text for c in doc['@search.captions']])) async for doc in r]
else:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(doc[self.content_field]) async for doc in r]
content = "\n".join(results)

Integratiecode en LLM's

Voor een RAG-oplossing met Azure AI Search zijn andere onderdelen en code vereist om een volledige oplossing te maken. Terwijl de vorige secties betrekking hebben op het ophalen van informatie via Azure AI Search en welke functies worden gebruikt om doorzoekbare inhoud te maken en er query's op uit te voeren, introduceert deze sectie LLM-integratie en -interactie.

Notebooks in de demo-opslagplaatsen zijn een goed uitgangspunt omdat ze patronen tonen voor het doorgeven van zoekresultaten aan een LLM. De meeste 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.

In het volgende celblok in het notebook chat-read-retrieve-read.ipynb worden zoekoproepen weergegeven in de context van een chatsessie:

# Execute this cell multiple times updating user_input to accumulate chat history
user_input = "Does my plan cover annual eye exams?"

# Exclude category, to simulate scenarios where there's a set of docs you can't see
exclude_category = None

if len(history) > 0:
    completion = openai.Completion.create(
        engine=AZURE_OPENAI_GPT_DEPLOYMENT,
        prompt=summary_prompt_template.format(summary="\n".join(history), question=user_input),
        temperature=0.7,
        max_tokens=32,
        stop=["\n"])
    search = completion.choices[0].text
else:
    search = user_input

# Alternatively simply use search_client.search(q, top=3) if not using semantic ranking
print("Searching:", search)
print("-------------------")
filter = "category ne '{}'".format(exclude_category.replace("'", "''")) if exclude_category else None
r = search_client.search(search, 
                         filter=filter,
                         query_type=QueryType.SEMANTIC, 
                         query_language="en-us", 
                         query_speller="lexicon", 
                         semantic_configuration_name="default", 
                         top=3)
results = [doc[KB_FIELDS_SOURCEPAGE] + ": " + doc[KB_FIELDS_CONTENT].replace("\n", "").replace("\r", "") for doc in r]
content = "\n".join(results)

prompt = prompt_prefix.format(sources=content) + prompt_history + user_input + turn_suffix

completion = openai.Completion.create(
    engine=AZURE_OPENAI_CHATGPT_DEPLOYMENT, 
    prompt=prompt, 
    temperature=0.7, 
    max_tokens=1024,
    stop=["<|im_end|>", "<|im_start|>"])

prompt_history += user_input + turn_suffix + completion.choices[0].text + "\n<|im_end|>" + turn_prefix
history.append("user: " + user_input)
history.append("assistant: " + completion.choices[0].text)

print("\n-------------------\n".join(history))
print("\n-------------------\nPrompt:\n" + prompt)

Aan de slag

  • Gebruik Azure AI Studio om een zoekindex te maken.

  • Gebruik Azure OpenAI Studio en 'Bring Your Own Data' om te experimenteren met prompts in een bestaande zoekindex in een speeltuin. Met deze stap kunt u bepalen welk model u wilt gebruiken en ziet u hoe goed uw bestaande index werkt in een RAG-scenario.

  • De oplossingsversneller 'Chatten met uw gegevens', gebouwd door het Azure AI Search-team, helpt u bij het maken van uw eigen aangepaste RAG-oplossing.

  • Sjablonen voor enterprise-chat-apps implementeren Azure-resources, code en voorbeeldgegevens voor grounding met behulp van fictieve documenten van het statusplan voor Contoso en Northwind. Deze end-to-end-oplossing biedt u binnen 15 minuten een operationele chat-app. Code voor deze sjablonen is de azure-search-openai-demo die in verschillende presentaties wordt aanbevolen. De volgende koppelingen bieden taalspecifieke versies:

  • Bekijk indexeringsconcepten en -strategieën om te bepalen hoe u gegevens wilt opnemen en vernieuwen. Bepaal of u vectorzoekopdrachten, trefwoordzoekopdrachten of hybride zoekopdrachten wilt gebruiken. Het type inhoud dat u moet doorzoeken en het type query's dat u wilt uitvoeren, bepaalt het indexontwerp.

  • Bekijk het maken van query's voor meer informatie over de syntaxis en vereisten van zoekaanvragen.

Notitie

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

Zie ook