När det gäller bearbetning av naturligt språk (NLP) och informationssökning är förmågan att effektivt och korrekt hämta relevant information av största vikt. Allt eftersom området fortsätter att utvecklas utvecklas nya tekniker och metoder för att förbättra prestandan hos hämtningssystem, särskilt i samband med Retrieval Augmented Generation (TRASA). En sådan teknik, känd som tvåstegshämtning med rerankers, har dykt upp som en kraftfull lösning för att ta itu med de inneboende begränsningarna hos traditionella hämtningsmetoder.
I den här artikeln diskuterar vi krångligheterna med tvåstegshämtning och omrankare, och utforskar deras underliggande principer, implementeringsstrategier och fördelarna de erbjuder för att förbättra noggrannheten och effektiviteten hos RAG-system. Vi kommer också att tillhandahålla praktiska exempel och kodavsnitt för att illustrera koncepten och underlätta en djupare förståelse av denna banbrytande teknik.
Förstå Retrieval Augmented Generation (RAG)
Innan vi dyker in i detaljerna för tvåstegshämtning och rerankers, låt oss kort återkomma till konceptet Retrieval Augmented Generation (RAG). RAG är en teknik som utökar kunskapen och kapaciteten hos stora språkmodeller (LLM) genom att ge dem tillgång till externa informationskällor, såsom databaser eller dokumentsamlingar. Se mer från artikeln "En djupdykning i Retrieval Augmented Generation i LLM".
Den typiska RAG-processen innefattar följande steg:
Fråga: En användare ställer en fråga eller ger en instruktion till systemet.
hämtning: Systemet frågar efter en vektordatabas eller dokumentsamling för att hitta information som är relevant för användarens fråga.
Ökning: Den hämtade informationen kombineras med användarens ursprungliga fråga eller instruktion.
Generation: Språkmodellen bearbetar den utökade inmatningen och genererar ett svar, som utnyttjar den externa informationen för att förbättra noggrannheten och heltäckande utdata.
Även om RAG har visat sig vara en kraftfull teknik, är den inte utan sina utmaningar. En av nyckelfrågorna ligger i hämtningsstadiet, där traditionella hämtningsmetoder kanske misslyckas med att identifiera de mest relevanta dokumenten, vilket leder till suboptimala eller felaktiga svar från språkmodellen.
Behovet av tvåstegshämtning och rerankers
Traditionella hämtningsmetoder, som de som baseras på nyckelordsmatchning eller vektorrumsmodeller, kämpar ofta för att fånga de nyanserade semantiska sambanden mellan frågor och dokument. Denna begränsning kan resultera i hämtning av dokument som endast är ytligt relevanta eller missar viktig information som avsevärt skulle kunna förbättra kvaliteten på det genererade svaret.
För att möta denna utmaning har forskare och praktiker vänt sig till tvåstegshämtning med rerankers. Detta tillvägagångssätt innefattar en process i två steg:
Första hämtning: I det första steget hämtas en relativt stor uppsättning potentiellt relevanta dokument med hjälp av en snabb och effektiv hämtningsmetod, såsom en vektorrymdsmodell eller en nyckelordsbaserad sökning.
Omplacering: I det andra steget används en mer sofistikerad omrankningsmodell för att ordna om de ursprungligen hämtade dokumenten baserat på deras relevans för frågan, vilket effektivt placerar de mest relevanta dokumenten överst på listan.
Omrankningsmodellen, ofta ett neuralt nätverk eller en transformatorbaserad arkitektur, är specifikt tränad för att bedöma relevansen av ett dokument för en given fråga. Genom att utnyttja avancerad förståelse av naturligt språk kan omrankaren fånga de semantiska nyanserna och kontextuella relationerna mellan frågan och dokumenten, vilket resulterar i en mer exakt och relevant rangordning.
Fördelar med tvåstegshämtning och rerankers
Antagandet av tvåstegshämtning med rerankers erbjuder flera betydande fördelar i samband med RAG-system:
Förbättrad noggrannhet: Genom att rangordna de ursprungligen hämtade dokumenten och främja de mest relevanta till toppen, kan systemet ge mer exakt och exakt information till språkmodellen, vilket leder till genererade svar av högre kvalitet.
Lindrade problem utanför domänen: Inbäddningsmodeller som används för traditionell hämtning tränas ofta på generella textkorpus, som kanske inte tillräckligt fångar domänspecifikt språk och semantik. Omrankningsmodeller, å andra sidan, kan tränas på domänspecifika data, vilket minskar problemet "utanför domänen" och förbättrar relevansen av hämtade dokument inom specialiserade domäner.
Skalbarhet: Tvåstegsmetoden möjliggör effektiv skalning genom att utnyttja snabba och lätta hämtningsmetoder i det inledande skedet, samtidigt som den mer beräkningsintensiva omrankningsprocessen reserveras för en mindre delmängd av dokument.
Flexibilitet: Omrankningsmodeller kan bytas ut eller uppdateras oberoende av den initiala hämtningsmetoden, vilket ger flexibilitet och anpassningsförmåga till systemets föränderliga behov.
ColBERT: Effektiv och effektiv sen interaktion
En av de framstående modellerna inom omrankningen är ColBERT (Kontextualiserad sen interaktion över BERT). ColBERT är en dokumentomplaceringsmodell som utnyttjar BERTs djupa språkförståelsemöjligheter samtidigt som den introducerar en ny interaktionsmekanism som kallas "sen interaktion".
ColBERT: Effektiv och effektiv passagesökning via kontextualiserad sen interaktion över BERT
Den sena interaktionsmekanismen i ColBERT möjliggör effektiv och exakt hämtning genom att bearbeta frågor och dokument separat fram till slutskedet av hämtningsprocessen. Specifikt kodar ColBERT självständigt frågan och dokumentet med BERT, och använder sedan ett lätt men kraftfullt interaktionssteg som modellerar deras finkorniga likhet. Genom att fördröja men behålla denna finkorniga interaktion kan ColBERT dra nytta av uttrycksförmågan hos djupa språkmodeller och samtidigt få möjligheten att förberäkna dokumentrepresentationer offline, vilket avsevärt påskyndar frågebehandlingen.
ColBERTs sena interaktionsarkitektur erbjuder flera fördelar, inklusive förbättrad beräkningseffektivitet, skalbarhet med dokumentsamlingsstorlek och praktisk användbarhet för verkliga scenarier. Dessutom har ColBERT förbättrats ytterligare med tekniker som släckt övervakning och kvarvarande kompression (i ColBERTv2), som förfinar träningsprocessen och minskar modellens utrymmesavtryck samtidigt som hög hämtningseffektivitet bibehålls.
Det här kodavsnittet visar hur man konfigurerar och använder jina-colbert-v1-en-modellen för att indexera en samling dokument, vilket utnyttjar dess förmåga att hantera långa sammanhang effektivt.
Implementering av tvåstegshämtning med rerankers
Nu när vi har en förståelse för principerna bakom tvåstegshämtning och rerankers, låt oss utforska deras praktiska implementering inom ramen för ett RAG-system. Vi kommer att utnyttja populära bibliotek och ramverk för att demonstrera integrationen av dessa tekniker.
Att ställa in miljön
Innan vi dyker in i koden, låt oss ställa in vår utvecklingsmiljö. Vi kommer att använda Python och flera populära NLP-bibliotek, inklusive Hugging Face Transformers, Sentence Transformers och LanceDB.
För demonstrationsändamål kommer vi att använda datauppsättningen "ai-arxiv-chunked" från Hugging Face Datasets, som innehåller över 400 ArXiv-artiklar om maskininlärning, naturlig språkbehandling och stora språkmodeller.
from datasets import load_dataset
dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")
<pre>
Därefter förbearbetar vi data och delar upp den i mindre bitar för att underlätta effektiv hämtning och bearbetning.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
För det inledande hämtningsskedet kommer vi att använda en meningstransformatormodell för att koda våra dokument och frågor till täta vektorrepresentationer och sedan utföra en ungefärlig sökning efter närmaste granne med hjälp av en vektordatabas som LanceDB.
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
Med våra dokument indexerade kan vi utföra den första hämtningen genom att hitta de närmaste grannarna till en given frågevektor.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
Omplacering
Efter den första hämtningen kommer vi att använda en omrankningsmodell för att ordna om de hämtade dokumenten baserat på deras relevans för frågan. I det här exemplet kommer vi att använda ColBERT reranker, en snabb och exakt transformatorbaserad modell speciellt designad för dokumentrankning.
Ocuco-landskapet reranked_docs listan innehåller nu dokumenten som sorterats om baserat på deras relevans för frågan, som bestäms av ColBERT-omrankaren.
Augmentation och Generation
Med de omplacerade och relevanta dokumenten i handen kan vi gå vidare till förstärknings- och genereringsstadierna av RAG-pipelinen. Vi kommer att använda en språkmodell från Hugging Face Transformers-biblioteket för att generera det slutliga svaret.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
# Augment query with reranked documents
augmented_query = query + " " + " ".join(reranked_docs[:3])
# Generate response from language model
input_ids = tokenizer.encode(augmented_query, return_tensors="pt")
output_ids = model.generate(input_ids, max_length=500)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)
print(response)
I kodavsnittet ovan utökar vi den ursprungliga frågan med de tre översta omrankade dokumenten, vilket skapar en augmented_query. Vi skickar sedan denna utökade fråga till en T5-språkmodell, som genererar ett svar baserat på det angivna sammanhanget.
Ocuco-landskapet response variabeln kommer att innehålla den slutliga utdatan och utnyttjar den externa informationen från de hämtade och omrankade dokumenten för att ge ett mer exakt och heltäckande svar på den ursprungliga frågan.
Avancerade tekniker och överväganden
Även om implementeringen vi har täckt ger en solid grund för att integrera tvåstegshämtning och rerankers i ett RAG-system, finns det flera avancerade tekniker och överväganden som ytterligare kan förbättra prestandan och robustheten i metoden.
Frågeexpansion: För att förbättra det inledande hämtningsskedet kan du använda frågeexpansionstekniker, som innebär att den ursprungliga frågan utökas med relaterade termer eller fraser. Detta kan hjälpa till att hämta en mer mångsidig uppsättning potentiellt relevanta dokument.
Ensemble Reranking: Istället för att förlita sig på en enda omrankningsmodell kan du kombinera flera omrankare till en ensemble och utnyttja styrkorna hos olika modeller för att förbättra den övergripande prestandan.
Finjustera Rerankers: Även om förtränade omrankningsmodeller kan vara effektiva, kan finjustering av dem på domänspecifika data ytterligare förbättra deras förmåga att fånga domänspecifik semantik och relevanssignaler.
Iterativ hämtning och omrankning: I vissa fall kanske en enda iteration av hämtning och omplacering inte räcker. Du kan utforska iterativa tillvägagångssätt, där utdata från språkmodellen används för att förfina sök- och hämtningsprocessen, vilket leder till ett mer interaktivt och dynamiskt system.
Balansera relevans och mångfald: Även om rerankers syftar till att marknadsföra de mest relevanta dokumenten, är det viktigt att hitta en balans mellan relevans och mångfald. Att införliva mångfaldsfrämjande tekniker kan hjälpa till att förhindra att systemet blir alltför smalt eller partiskt i sina informationskällor.
Utvärderingsmätvärden: För att bedöma effektiviteten av ditt tillvägagångssätt för hämtning och omplacering i två steg måste du definiera lämpliga utvärderingsmått. Dessa kan inkludera traditionella mätvärden för informationshämtning som precision, återkallelse och genomsnittlig ömsesidig rankning (MRR), såväl som uppgiftsspecifika mätvärden som är skräddarsydda för ditt användningsfall.
Slutsats
Retrieval Augmented Generation (RAG) har dykt upp som en kraftfull teknik för att förbättra kapaciteten hos stora språkmodeller genom att utnyttja externa informationskällor. Men traditionella hämtningsmetoder kämpar ofta för att identifiera de mest relevanta dokumenten, vilket leder till suboptimal prestanda.
Tvåstegshämtning med rerankers erbjuder en övertygande lösning på denna utmaning. Genom att kombinera ett inledande snabbt hämtningssteg med en mer sofistikerad omrankningsmodell kan detta tillvägagångssätt avsevärt förbättra noggrannheten och relevansen hos de hämtade dokumenten, vilket i slutändan leder till genererade svar av högre kvalitet från språkmodellen.
Jag har ägnat de senaste fem åren åt att fördjupa mig i den fascinerande världen av Machine Learning och Deep Learning. Min passion och expertis har lett mig till att bidra till över 50 olika programvaruutvecklingsprojekt, med särskilt fokus på AI/ML. Min pågående nyfikenhet har också dragit mig mot Natural Language Processing, ett område som jag är ivrig att utforska vidare.