Dela via


Skapa avancerade hämtningsförhöjda generationssystem

Den här artikeln beskriver hämtningsförhöjd generation (RAG) och vad utvecklare behöver för att skapa en produktionsklar RAG-lösning.

Om du vill veta mer om två sätt att skapa en "chatta över dina data"-app – ett av de främsta generativa AI-användningsfallen för företag – kan du läsa Utöka LLM:er med RAG eller finjustering.

Följande diagram visar de viktigaste stegen i RAG:

diagram som visar ett enkelt RAG-flöde, med rutor som representerar steg eller processer och pilar som ansluter varje ruta.

Den här processen kallas naiv RAG. Det hjälper dig att förstå de grundläggande delarna och rollerna i ett RAG-baserat chattsystem.

Verkliga RAG-system behöver mer förbearbetning och efterbearbetning för att hantera artiklar, frågor och svar. Nästa diagram visar en mer realistisk konfiguration, kallad avancerad RAG:

diagram som visar det avancerade RAG-flödet av logik som en serie rutor med pilar mellan dem.

Den här artikeln ger dig ett enkelt ramverk för att förstå huvudfaserna i ett verkligt RAG-baserat chattsystem:

  • Inmatningsfas
  • Slutsatsdragningspipelinefas
  • Utvärderingsfas

Inmatning

Inmatning innebär att du sparar organisationens dokument så att du snabbt kan hitta svar för användare. Den största utmaningen är att hitta och använda de delar av dokument som bäst matchar varje fråga. De flesta system använder vektorinbäddningar och samtidig likhetssökning för att matcha frågor med innehåll. Du får bättre resultat när du förstår innehållstypen (t.ex. mönster och format) och organiserar dina data väl i vektordatabasen.

När du konfigurerar inmatning fokuserar du på följande steg:

  • Förbearbetning och extrahering av innehåll
  • Segmenteringsstrategi
  • Segmenteringsorganisation
  • Uppdateringsstrategi

Förbearbetning och extrahering av innehåll

Det första steget i inmatningsfasen är att förbearbeta och extrahera innehållet från dina dokument. Det här steget är avgörande eftersom det säkerställer att texten är ren, strukturerad och redo för indexering och hämtning.

Rent och korrekt innehåll gör att ett RAG-baserat chattsystem fungerar bättre. Börja med att titta på formen och formatmallen för de dokument som du vill indexeras. Följer de ett angivet mönster, till exempel dokumentation? Om inte, vilka frågor kan dessa dokument besvara?

Konfigurera din inmatningspipeline till minst:

  • Standardisera textformat
  • Hantera specialtecken
  • Ta bort orelaterat eller gammalt innehåll
  • Spåra olika versioner av innehåll
  • Hantera innehåll med flikar, bilder eller tabeller
  • Extrahera metadata

En del av den här informationen, till exempel metadata, kan vara till hjälp vid hämtning och utvärdering om du behåller den med dokumentet i vektordatabasen. Du kan också kombinera det med textsegmentet för att förbättra inbäddningen av segmentets vektor.

Segmenteringsstrategi

Som utvecklare bestämmer du hur du ska dela upp stora dokument i mindre segment. Segmentering hjälper till att skicka det mest relevanta innehållet till LLM så att det kan besvara användarfrågor bättre. Tänk också på hur du ska använda segmenten när du har fått dem. Prova vanliga branschmetoder och testa din segmenteringsstrategi i din organisation.

När du segmenterar bör du tänka på:

  • Segmentstorleksoptimering: Välj den bästa segmentstorleken och hur du delar upp den – efter avsnitt, stycke eller mening.
  • Överlappande och glidande fönstersegment: Bestäm om segment ska vara separata eller överlappande. Du kan också använda en skjutfönstermetod.
  • Small2Big: Om du delar upp efter mening, ordna innehållet så att du kan hitta närliggande meningar eller hela stycket. Att ge den här extra kontexten till LLM kan hjälpa den att svara bättre. Mer information finns i nästa avsnitt.

Segmenteringsorganisation

I ett RAG-system gör hur du organiserar dina data i vektordatabasen det enklare och snabbare att hitta rätt information. Här följer några sätt att konfigurera index och sökningar:

  • Hierarkiska index: Använd indexlager. Ett sammanfattningsindex på den översta nivån hittar snabbt en liten uppsättning troliga segment. Ett index på andra nivån pekar på exakta data. Den här konfigurationen påskyndar sökningar genom att begränsa alternativen innan du tittar närmare.
  • Specialiserade index: Välj index som passar dina data. Använd till exempel grafbaserade index om dina segment ansluter till varandra, till exempel i källhänvisningsnätverk eller kunskapsdiagram. Använd relationsdatabaser om dina data finns i tabeller och filtrera med SQL-frågor.
  • Hybridindex: Kombinera olika indexeringsmetoder. Använd till exempel ett sammanfattningsindex först och sedan ett grafbaserat index för att utforska anslutningar mellan segment.

Justeringsoptimering

Gör hämtade segment mer relevanta och korrekta genom att matcha dem med de typer av frågor som de besvarar. Ett sätt är att skapa en exempelfråga för varje segment som visar vilken fråga det svarar bäst på. Den här metoden hjälper på flera sätt:

  • Förbättrad matchning: Under hämtningen jämför systemet användarens fråga med dessa exempelfrågor för att hitta det bästa segmentet. Den här tekniken förbättrar resultatets relevans.
  • Träningsdata för maskininlärningsmodeller: Dessa frågesegmentpar hjälper dig att träna maskininlärningsmodellerna i RAG-systemet. Modellerna lär sig vilka segment som svarar på vilka typer av frågor.
  • Direkt frågehantering: Om en användares fråga matchar en exempelfråga kan systemet snabbt hitta och använda rätt segment, vilket påskyndar svaret.

Varje segments exempelfråga fungerar som en etikett som vägleder hämtningsalgoritmen. Sökningen blir mer fokuserad och medveten om kontexten. Den här metoden fungerar bra när segment täcker många olika ämnen eller typer av information.

Uppdatera strategier

Om din organisation uppdaterar dokument ofta måste du hålla databasen aktuell så att hämtaren alltid kan hitta den senaste informationen. Komponenten retriever är den del av systemet som söker i vektordatabasen och returnerar resultat. Här följer några sätt att hålla vektordatabasen uppdaterad:

  • stegvisa uppdateringar:

    • Regelbundna intervall: Ange att uppdateringar ska köras enligt ett schema (till exempel varje dag eller varje vecka) baserat på hur ofta dokument ändras. Den här åtgärden håller databasen fräsch.
    • Utlösarbaserade uppdateringar: Konfigurera automatiska uppdateringar när någon lägger till eller ändrar ett dokument. Systemet indexerar bara om de berörda delarna.
  • Partiella uppdateringar:

    • Selektiv omindexering: Uppdatera endast de delar av databasen som har ändrats, inte det hela. Den här tekniken sparar tid och resurser, särskilt för stora datamängder.
    • Deltakodning: Lagra bara ändringarna mellan gamla och nya dokument, vilket minskar mängden data som ska bearbetas.
  • Versionshantering:

    • Ögonblicksbilder: Spara versioner av dokumentuppsättningen vid olika tidpunkter. Med den här åtgärden kan du gå tillbaka eller återställa tidigare versioner om det behövs.
    • Dokumentversionskontroll: Använd ett versionskontrollsystem för att spåra ändringar och behålla en historik över dina dokument.
  • realtidsuppdateringar:

    • Dataströmbearbetning: Använd dataströmbearbetning för att uppdatera vektordatabasen i realtid när dokumenten ändras.
    • Live-frågor: Använd livefrågor för att få up-to-date-svar, ibland blanda livedata med cachelagrade resultat för hastighet.
  • optimeringstekniker:

    • Batchbearbetning: Gruppera ändringar och tillämpa dem tillsammans för att spara resurser och minska kostnaderna.
    • Hybridmetoder: Blanda olika strategier:
      • Använd inkrementella uppdateringar för små ändringar.
      • Använd fullständig omindexering för betydande uppdateringar.
      • Spåra och dokumentera större ändringar i dina data.

Välj den uppdateringsstrategi eller blandning som passar dina behov. Tänk på:

  • Dokument corpus-storlek
  • Uppdateringsfrekvens
  • Databehov i realtid
  • Tillgängliga resurser

Granska de här faktorerna för ditt program. Varje metod har kompromisser i komplexitet, kostnad och hur snabbt uppdateringar visas.

Slutsatsdragningspipeline

Dina artiklar är nu segmenterade, vektoriserade och lagrade i en vektordatabas. Fokusera sedan på att få de bästa svaren från systemet.

Tänk på följande viktiga frågor för att få korrekta och snabba resultat:

  • Är användarens fråga tydlig och kommer sannolikt att få rätt svar?
  • Bryter frågan mot några företagsregler?
  • Kan du skriva om frågan för att hjälpa systemet att hitta bättre matchningar?
  • Matchar resultaten från databasen frågan?
  • Bör du ändra resultatet innan du skickar dem till LLM för att se till att svaret är relevant?
  • Tar LLM:s svar fullständigt upp användarens fråga?
  • Följer svaret organisationens regler?

Hela slutsatsdragningspipelinen fungerar i realtid. Det finns inget enda rätt sätt att konfigurera dina förbearbetnings- och efterbearbetningssteg. Du använder en blandning av kod och LLM-anrop. En av de största kompromisserna är att balansera noggrannhet och efterlevnad med kostnader och hastighet.

Nu ska vi titta på strategier för varje steg i slutsatsdragningspipelinen.

Förbearbetningssteg för frågor

Förbearbetning av frågor startar direkt efter att användaren har skickat en fråga:

diagram som upprepar de avancerade RAG-stegen, med betoning på de rutor som är märkta med frågebearbetningssteg.

De här stegen hjälper dig att se till att användarens fråga passar ditt system och är redo att hitta de bästa artikelsegmenten med hjälp av cosinélikhet eller "närmaste granne"-sökning.

Principkontroll: Använd logik för att upptäcka och ta bort eller flagga oönskat innehåll, till exempel personliga data, dåligt språk eller försök att bryta mot säkerhetsregler (kallas "jailbreaking").

Frågeomskrivning: Ändra frågan om det behövs – expandera akronymer, ta bort slang eller omformulera den för att fokusera på större idéer (steg-tillbaka-fråga).

En särskild version av stegvisa frågor är HyDE (Hypothetical Document Embeddings). HyDE har LLM-svaret på frågan, gör en inbäddning från det svaret och söker sedan i vektordatabasen med den.

Underfrågor

Underfrågor delar upp en lång eller komplex fråga i mindre, enklare frågor. Systemet svarar på varje liten fråga och kombinerar sedan svaren.

Till exempel, om någon frågar, "Vem gjorde viktigare bidrag till modern fysik, Albert Einstein eller Niels Bohr?" kan du dela upp den i:

  • Underfråga 1: "Vad bidrog Albert Einstein till modern fysik?"
  • Subquery 2: "Vad bidrog Niels Bohr till modern fysik?"

Svaren kan vara:

  • För Einstein: relativitetsteorin, den fotoelektriska effekten och E=mc^2.
  • För Bohr: väteatomens modell, arbeta med kvantmekanik och principen om komplementaritet.

Sedan kan du ställa uppföljningsfrågor:

  • Subquery 3: "Hur förändrade Einsteins teorier modern fysik?"
  • Underfråga 4: "Hur förändrade Bohrs teorier modern fysik?"

Dessa uppföljningar tittar på varje forskares effekt, till exempel:

  • Hur Einsteins arbete ledde till nya idéer inom kosmologi och kvantteori
  • Hur Bohrs arbete hjälpte oss att förstå atomer och kvantmekanik

Systemet kombinerar svaren för att ge ett fullständigt svar på den ursprungliga frågan. Den här metoden gör komplexa frågor enklare att besvara genom att dela upp dem i tydliga, mindre delar.

Frågerouter

Ibland finns ditt innehåll i flera databaser eller söksystem. I dessa fall använder du en frågerouter. En frågerouter väljer den bästa databasen eller indexet för att besvara varje fråga.

En frågerouter fungerar efter att användaren har frågat en fråga men innan systemet söker efter svar.

Så här fungerar en frågerouter:

  1. Frågeanalys: LLM eller ett annat verktyg tittar på frågan för att ta reda på vilken typ av svar som behövs.
  2. Indexval: Routern väljer ett eller flera index som passar frågan. Vissa index är bättre för fakta, andra för åsikter eller specialämnen.
  3. Frågesändning: Routern skickar frågan till det valda indexet eller indexen.
  4. Resultatsammansättning: Systemet samlar in och kombinerar svaren från indexen.
  5. Svarsgenerering: Systemet skapar ett tydligt svar med hjälp av den information som hittades.

Använd olika index eller sökmotorer för:

  • Specialisering av datatyp: Vissa index fokuserar på nyheter, andra på akademiska artiklar eller på särskilda databaser som medicinsk eller juridisk information.
  • Optimering av frågetyp: Vissa index är snabba för enkla fakta (t.ex. datum), medan andra hanterar komplexa frågor eller expertfrågor.
  • Algoritmiska skillnader: Olika sökmotorer använder olika metoder, till exempel vektorsökning, nyckelordssökning eller avancerad semantisk sökning.

I ett medicinskt rådgivningssystem kan du till exempel ha:

  • Ett forskningsdokumentindex för teknisk information
  • Ett fallstudieindex för verkliga exempel
  • Ett allmänt hälsoindex för grundläggande frågor

Om någon frågar om effekterna av ett nytt läkemedel skickar routern frågan till forskningspappersindexet. Om frågan handlar om vanliga symtom använder den det allmänna hälsoindexet för ett enkelt svar.

Steg för bearbetning efter hämtning

Bearbetning efter hämtning sker när systemet hittar innehållssegment i vektordatabasen:

diagram som upprepar de avancerade RAG-stegen, med betoning på rutan märkt steg för bearbetning efter informationshämtning.

Kontrollera sedan om dessa segment är användbara för LLM-prompten innan du skickar dem till LLM.

Tänk på följande:

  • Extra information kan dölja den viktigaste informationen.
  • Irrelevant information kan göra svaret värre.

Se upp för nålen i ett höstacksproblem : LLMs ägnar ofta mer uppmärksamhet åt början och slutet av en prompt än mitten.

Kom också ihåg LLM:s maximala kontextfönster och antalet token som behövs för långa uppmaningar, särskilt i stor skala.

Om du vill hantera dessa problem använder du en pipeline för bearbetning efter hämtning med steg som:

  • Filtreringsresultat: Behåll endast segment som matchar frågan. Ignorera resten när du skapar LLM-prompten.
  • Omrankning: Placera de mest relevanta segmenten i början och slutet av prompten.
  • Snabbkomprimering: Använd en liten, billig modell för att sammanfatta och kombinera segment i en enda fråga innan du skickar den till LLM.

Bearbetningssteg efter slutförande

Bearbetning efter slutförande sker efter användarens fråga och alla innehållssegment går till LLM:

diagram som upprepar de avancerade RAG-stegen, med betoning på rutan märkta bearbetningssteg efter slutförande.

När LLM har svarat kontrollerar du dess noggrannhet. En pipeline för bearbetning efter slutförande kan innehålla:

  • Faktakontroll: Leta efter instruktioner i svaret som påstår sig vara fakta och kontrollera sedan om de är sanna. Om en faktakontroll misslyckas kan du fråga LLM igen eller visa ett felmeddelande.
  • Principkontroll: Kontrollera att svaret inte innehåller skadligt innehåll för användaren eller din organisation.

Utvärdering

Att utvärdera ett system som detta är mer komplext än att köra vanliga enhets- eller integreringstester. Tänk på följande frågor:

  • Är användarna nöjda med svaren?
  • Är svaren korrekta?
  • Hur samlar du in feedback från användare?
  • Finns det regler för vilka data du kan samla in?
  • Kan du se varje steg systemet tog när svaren är fel?
  • Har du detaljerade loggar för rotorsaksanalys?
  • Hur uppdaterar du systemet utan att göra saker värre?

Samla in och agera på feedback från användare

Samarbeta med organisationens sekretessteam för att utforma verktyg för feedbackinsamling, systemdata och loggning för kriminalteknik och rotorsaksanalys av en frågesession.

Nästa steg är att skapa en utvärderingspipeline. En utvärderingspipeline gör det enklare och snabbare att granska feedback och ta reda på varför AI:n gav vissa svar. Kontrollera varje svar för att se hur AI:n skapade den, om rätt innehållssegment användes och hur dokumenten delades upp.

Leta också efter extra förbearbetnings- eller efterbearbetningssteg som kan förbättra resultaten. Den här nära granskningen hittar ofta innehållsluckor, särskilt när det inte finns någon bra dokumentation för en användares fråga.

Du behöver en utvärderingspipeline för att hantera dessa uppgifter i stor skala. En bra pipeline använder anpassade verktyg för att mäta svarskvaliteten. Det hjälper dig att se varför AI:n gav ett specifikt svar, vilka dokument den använde och hur väl slutsatsdragningspipelinen fungerade.

Gyllene datauppsättning

Ett sätt att kontrollera hur bra ett RAG-chattsystem fungerar är att använda en gyllene datamängd. En gyllene datauppsättning är en uppsättning frågor med godkända svar, användbara metadata (till exempel ämnes- och frågetyp), länkar till källdokument och olika sätt som användare kan ställa samma sak på.

En gyllene datauppsättning visar "bästa scenario". Utvecklare använder det för att se hur bra systemet fungerar och för att köra tester när de lägger till nya funktioner eller uppdateringar.

Bedöma skada

Skademodellering hjälper dig att upptäcka möjliga risker i en produkt och planera sätt att minska dem.

Ett verktyg för skadebedömning bör innehålla följande viktiga funktioner:

  • Identifiering av intressenter: Hjälper dig att lista och gruppera alla som påverkas av tekniken, inklusive direkta användare, personer som påverkas indirekt, framtida generationer och till och med miljön.
  • Skadekategorier och beskrivningar: Listar möjliga skador, till exempel integritetsförlust, känslomässigt lidande eller ekonomisk skada. Vägleder dig genom exempel och hjälper dig att tänka på både förväntade och oväntade problem.
  • Bedömning av allvarlighetsgrad och sannolikhet: Hjälper dig att bedöma hur allvarlig och sannolik varje skada är, så att du kan bestämma vad du ska åtgärda först. Du kan använda data för att stödja dina val.
  • Åtgärdsstrategier: Föreslår sätt att minska risker, till exempel att ändra systemdesignen, lägga till skydd eller använda annan teknik.
  • Feedbackmekanismer: Låter dig samla in feedback från intressenter så att du kan fortsätta att förbättra processen när du lär dig mer.
  • Dokumentation och rapportering: Gör det enkelt att skapa rapporter som visar vad du hittade och vad du gjorde för att minska riskerna.

Dessa funktioner hjälper dig att hitta och åtgärda risker, och de hjälper dig också att skapa mer etisk och ansvarsfull AI genom att tänka på alla möjliga effekter från början.

Mer information finns i följande artiklar:

Testa och verifiera skyddsåtgärderna

Red-teaming är nyckeln – det innebär att agera som en angripare för att hitta svaga punkter i systemet. Det här steget är särskilt viktigt för att stoppa jailbreaking. Tips om hur du planerar och hanterar röd teamindelning för ansvarsfull AI finns i Planera röd teamindelning för stora språkmodeller (LLM: er) och deras program.

Utvecklare bör testa RAG-systemskydd i olika scenarier för att se till att de fungerar. Det här steget gör systemet starkare och hjälper även till att finjustera svar för att följa etiska standarder och regler.

Slutliga överväganden för programdesign

Här följer några viktiga saker att komma ihåg från den här artikeln som kan hjälpa dig att utforma din app:

  • Generativ AI-oförutsägbarhet
  • Användaren uppmanar till ändringar och deras effekt på tid och kostnad
  • Parallella LLM-begäranden för snabbare prestanda

Om du vill skapa en generativ AI-app kan du kolla in Kom igång med chatt med hjälp av ditt eget dataexempel för Python. Självstudien är också tillgänglig för .NET, Javaoch JavaScript.