Förbättra kvaliteten på RAG-datapipelines
I den här artikeln beskrivs hur du experimenterar med val av datapipelines ur praktisk synvinkel när det gäller att implementera ändringar i datapipelines.
Viktiga komponenter i datapipelinen
Grunden för alla RAG-program med ostrukturerade data är datapipelinen. Den här pipelinen ansvarar för att förbereda ostrukturerade data i ett format som kan användas effektivt av RAG-programmet. Även om den här datapipelinen kan bli godtyckligt komplex är följande viktiga komponenter som du måste tänka på när du först skapar DITT RAG-program:
- Corpus-sammansättning: Välja rätt datakällor och innehåll baserat på det specifika användningsfallet.
- Parsning: Extrahera relevant information från rådata med lämpliga parsningstekniker.
- Segmentering: Dela upp parsade data i mindre, hanterbara segment för effektiv hämtning.
- Inbäddning: Konvertera segmenterade textdata till en numerisk vektorrepresentation som fångar dess semantiska betydelse.
Corpus-sammansättning
Utan rätt datakorus kan ditt RAG-program inte hämta den information som krävs för att besvara en användarfråga. Rätt data är helt beroende av programmets specifika krav och mål, vilket gör det viktigt att ägna tid åt att förstå nyanserna i tillgängliga data (se avsnittet kravinsamling för vägledning om detta).
När du till exempel skapar en kundsupportrobot kan du överväga att inkludera:
- Kunskapsbasdokument
- Vanliga frågor (FAQ)
- Produkthandböcker och specifikationer
- Felsökningsguider
Engagera domänexperter och intressenter från början av alla projekt för att identifiera och kurera relevant innehåll som kan förbättra kvaliteten och täckningen för dina datakorus. De kan ge insikter om vilka typer av frågor som användarna sannolikt kommer att skicka och hjälpa till att prioritera den viktigaste informationen som ska inkluderas.
Parsning
När du har identifierat datakällorna för ditt RAG-program extraherar nästa steg nödvändig information från rådata. Den här processen, som kallas parsning, innebär att de ostrukturerade data omvandlas till ett format som effektivt kan användas av RAG-programmet.
De specifika parsningstekniker och verktyg som du använder beror på vilken typ av data du arbetar med. Till exempel:
- Textdokument (PDF-filer, Word-dokument): Off-the-shelf-bibliotek som ostrukturerade och PyPDF2 kan hantera olika filformat och ge alternativ för att anpassa parsningsprocessen.
- HTML-dokument: HTML-parsningsbibliotek som BeautifulSoup kan användas för att extrahera relevant innehåll från webbsidor. Med dem kan du navigera i HTML-strukturen, välja specifika element och extrahera önskad text eller attribut.
- Bilder och skannade dokument: OCR-tekniker (Optisk teckenigenkänning) krävs vanligtvis för att extrahera text från bilder. Populära OCR-bibliotek är Tesseract, Amazon Textract, Azure AI Vision OCR och Google Cloud Vision API.
Metodtips för att parsa data
När du parsar dina data bör du överväga följande metodtips:
- Datarensning: Förbearbeta den extraherade texten för att ta bort irrelevant eller bullrig information, till exempel sidhuvuden, sidfötter eller specialtecken. Var medveten om att minska mängden onödig eller felaktig information som din RAG-kedja behöver bearbeta.
- Hantera fel och undantag: Implementera mekanismer för felhantering och loggning för att identifiera och lösa eventuella problem som uppstår under parsningsprocessen. Detta hjälper dig att snabbt identifiera och åtgärda problem. Detta pekar ofta på överordnade problem med kvaliteten på källdata.
- Anpassa parsningslogik: Beroende på dina datas struktur och format kan du behöva anpassa parsningslogik för att extrahera den mest relevanta informationen. Även om det kan kräva ytterligare arbete i förväg kan du investera tid för att göra detta om det behövs– det förhindrar ofta många problem med nedströmskvalitet.
- Utvärderar parsningskvalitet: Utvärdera regelbundet kvaliteten på de parsade data genom att manuellt granska ett urval av utdata. Detta kan hjälpa dig att identifiera eventuella problem eller förbättringsområden i parsningsprocessen.
Spaltning
När du har parsat rådata i ett mer strukturerat format är nästa steg att dela upp dem i mindre, hanterbara enheter som kallas segment. Segmentering av stora dokument i mindre, semantiskt koncentrerade segment säkerställer att hämtade data passar i LLM:s kontext, samtidigt som störande eller irrelevant information minimeras. De val som görs vid segmentering påverkar direkt vilka hämtade data som LLM tillhandahålls, vilket gör den till ett av de första optimeringsskikten i ett RAG-program.
När du segmenterar dina data bör du tänka på följande faktorer:
- Segmenteringsstrategi: Den metod som du använder för att dela upp den ursprungliga texten i segment. Detta kan omfatta grundläggande tekniker som att dela upp efter meningar, stycken eller specifika tecken/tokenantal, till mer avancerade dokumentspecifika delningsstrategier.
- Segmentstorlek: Mindre segment kan fokusera på specifik information men förlora viss omgivande information. Större segment kan fånga mer kontext men kan också innehålla irrelevant information.
- Överlappning mellan segment: För att säkerställa att viktig information inte går förlorad när data delas upp i segment bör du överväga att inkludera viss överlappning mellan angränsande segment. Överlappning kan säkerställa kontinuitet och kontextbevarande mellan segment.
- Semantisk koherens: När det är möjligt vill du skapa segment som är semantiskt sammanhängande, vilket innebär att de innehåller relaterad information och kan stå på egen hand som en meningsfull textenhet. Detta kan uppnås genom att överväga strukturen för de ursprungliga data, till exempel stycken, avsnitt eller ämnesgränser.
- Metadata: Om du inkluderar relevanta metadata i varje segment, till exempel källdokumentets namn, avsnittsrubrik eller produktnamn, kan du förbättra hämtningsprocessen. Den här ytterligare informationen i segmentet kan hjälpa dig att matcha hämtningsfrågor till segment.
Strategier för datasegmentering
Att hitta rätt segmenteringsmetod är både iterativt och kontextberoende. Det finns ingen one-size-fits all-metod; den optimala segmentstorleken och metoden beror på det specifika användningsfallet och typen av data som bearbetas. I stort sett kan segmenteringsstrategier ses som följande:
- Segmentering med fast storlek: Dela upp texten i segment av en förutbestämd storlek, till exempel ett fast antal tecken eller token (till exempel LangChain CharacterTextSplitter). Även om det är snabbt och enkelt att dela upp ett godtyckligt antal tecken/token, resulterar det vanligtvis inte i konsekventa semantiskt sammanhängande segment.
- Styckebaserad segmentering: Använd de naturliga styckegränserna i texten för att definiera segment. Den här metoden kan bidra till att bevara segmentens semantiska enhetlighet, eftersom stycken ofta innehåller relaterad information (till exempel LangChain RecursiveCharacterTextSplitter).
- Formatspecifik segmentering: Format som markdown eller HTML har en inbyggd struktur inom sig som kan användas för att definiera segmentgränser (till exempel markdown-rubriker). Verktyg som LangChains MarkdownHeaderTextSplitter eller HTML-sidhuvudavsnittsbaserade/ splitter kan användas för detta ändamål.
- Semantisk segmentering: Tekniker som ämnesmodellering kan användas för att identifiera semantiskt sammanhängande avsnitt i texten. Dessa metoder analyserar innehållet eller strukturen i varje dokument för att fastställa de lämpligaste segmentgränserna baserat på skiftningar i ämnet. Även om det är mer involverat än mer grundläggande metoder kan semantisk segmentering hjälpa till att skapa segment som är mer anpassade till de naturliga semantiska divisionerna i texten (se LangChain SemanticChunker för ett exempel på detta).
Exempel: Korrigeringsstorlek för segmentering
Exempel på segmentering med fast storlek med LangChains RecursiveCharacterTextSplitter med chunk_size=100
och chunk_overlap=20
. ChunkViz är ett interaktivt sätt att visualisera hur olika segmentstorlek och segment överlappningsvärden med Langchains teckendelningar påverkar resulterande segment.
Inbäddningsmodell
När du har segmenterat dina data är nästa steg att konvertera textsegmenten till en vektorrepresentation med hjälp av en inbäddningsmodell. En inbäddningsmodell används för att konvertera varje textsegment till en vektorrepresentation som fångar dess semantiska betydelse. Genom att representera segment som kompakta vektorer möjliggör inbäddningar snabb och korrekt hämtning av de mest relevanta segmenten baserat på deras semantiska likhet med en hämtningsfråga. Vid frågetillfället transformeras hämtningsfrågan med samma inbäddningsmodell som användes för att bädda in segment i datapipelinen.
När du väljer en inbäddningsmodell bör du tänka på följande faktorer:
- Modellval: Varje inbäddningsmodell har sina nyanser och de tillgängliga riktmärkena kanske inte fångar in de specifika egenskaperna för dina data. Experimentera med olika inbäddningsmodeller utanför hyllan, även de som kan vara lägre rankade på vanliga rankningslistor som MTEB. Några exempel att överväga är:
- Maximalt antal token: Var medveten om den maximala tokengränsen för din valda inbäddningsmodell. Om du skickar segment som överskrider den här gränsen trunkeras de, vilket kan leda till att viktig information går förlorad. Till exempel har bge-large-en-v1.5 en maximal tokengräns på 512.
- Modellstorlek: Större inbäddningsmodeller ger vanligtvis bättre prestanda men kräver mer beräkningsresurser. Hitta en balans mellan prestanda och effektivitet baserat på ditt specifika användningsfall och tillgängliga resurser.
- Finjustering: Om DITT RAG-program hanterar domänspecifikt språk (t.ex. interna företagsakronymer eller terminologi) bör du överväga att finjustera inbäddningsmodellen på domänspecifika data. Detta kan hjälpa modellen att bättre fånga nyanser och terminologi för din specifika domän, och kan ofta leda till bättre hämtningsprestanda.