Når det kommer til naturlig sprogbehandling (NLP) og informationssøgning, er evnen til effektivt og præcist at hente relevant information altafgørende. I takt med at feltet fortsætter med at udvikle sig, udvikles nye teknikker og metoder for at forbedre ydeevnen af ​​genfindingssystemer, især i forbindelse med Retrieval Augmented Generation (KLUD). En sådan teknik, kendt som to-trins hentning med rerankere, er dukket op som en kraftfuld løsning til at løse de iboende begrænsninger af traditionelle hentningsmetoder.
I denne artikel diskuterer vi forviklingerne ved to-trins hentning og rerankere, udforsker deres underliggende principper, implementeringsstrategier og de fordele, de tilbyder ved at forbedre nøjagtigheden og effektiviteten af ​​RAG-systemer. Vi vil også give praktiske eksempler og kodestykker for at illustrere koncepterne og lette en dybere forståelse af denne banebrydende teknik.
ForstĂĄ Retrieval Augmented Generation (RAG)
Før vi dykker ned i detaljerne ved to-trins hentning og rerankere, lad os kort gense konceptet Retrieval Augmented Generation (RAG). RAG er en teknik, der udvider viden og muligheder for store sprogmodeller (LLM'er) ved at give dem adgang til eksterne informationskilder, såsom databaser eller dokumentsamlinger. Se mere fra artiklen "Et dybt dyk ned i Retrieval Augmented Generation i LLM".
Den typiske RAG-proces omfatter følgende trin:
Query: En bruger stiller et spørgsmål eller giver en instruktion til systemet.
Hentning: Systemet forespørger i en vektordatabase eller dokumentsamling for at finde information, der er relevant for brugerens forespørgsel.
Augmentation: Den hentede information kombineres med brugerens oprindelige forespørgsel eller instruktion.
Generation: Sprogmodellen behandler det udvidede input og genererer et svar, der udnytter den eksterne information til at øge nøjagtigheden og omfanget af dens output.
Selvom RAG har vist sig at være en kraftfuld teknik, er den ikke uden sine udfordringer. Et af nøglespørgsmålene ligger i genfindingsstadiet, hvor traditionelle genfindingsmetoder måske ikke kan identificere de mest relevante dokumenter, hvilket fører til suboptimale eller unøjagtige svar fra sprogmodellen.
Behovet for to-trins hentning og rerankere
Traditionelle genfindingsmetoder, såsom dem, der er baseret på søgeordsmatching eller vektorrumsmodeller, har ofte svært ved at fange de nuancerede semantiske relationer mellem forespørgsler og dokumenter. Denne begrænsning kan resultere i hentning af dokumenter, der kun er overfladisk relevante eller savner afgørende information, der kan forbedre kvaliteten af ​​det genererede svar væsentligt.
For at løse denne udfordring har forskere og praktikere vendt sig til to-trins hentning med rerankere. Denne tilgang involverer en to-trins proces:
Indledende hentning: I første fase hentes et relativt stort sæt af potentielt relevante dokumenter ved hjælp af en hurtig og effektiv genfindingsmetode, såsom en vektorrumsmodel eller en søgeordsbaseret søgning.
Omplacering: I den anden fase anvendes en mere sofistikeret omrangeringsmodel til at omarrangere de oprindeligt hentede dokumenter baseret på deres relevans for forespørgslen, hvilket effektivt bringer de mest relevante dokumenter øverst på listen.
Omrangeringsmodellen, ofte et neuralt netværk eller en transformer-baseret arkitektur, er specifikt trænet til at vurdere et dokuments relevans for en given forespørgsel. Ved at udnytte avancerede naturlige sprogforståelsesevner kan rerankeren fange de semantiske nuancer og kontekstuelle forhold mellem forespørgslen og dokumenterne, hvilket resulterer i en mere præcis og relevant rangering.
Fordele ved to-trins hentning og rerankere
Indførelsen af ​​to-trins hentning med rerankere giver flere væsentlige fordele i forbindelse med RAG-systemer:
Forbedret nøjagtighed: Ved at omrangere de oprindeligt hentede dokumenter og promovere de mest relevante til toppen, kan systemet give mere nøjagtige og præcise oplysninger til sprogmodellen, hvilket fører til genererede svar af højere kvalitet.
Afhjælpede problemer uden for domænet: Indlejringsmodeller, der bruges til traditionel hentning, trænes ofte i tekstkorpuer til generelle formål, som muligvis ikke fanger domænespecifikt sprog og semantik tilstrækkeligt. Genrangeringsmodeller kan på den anden side trænes på domænespecifikke data, hvilket mindsker "uden for domæne"-problemet og forbedrer relevansen af ​​hentede dokumenter inden for specialiserede domæner.
Skalerbarhed: Den to-trins tilgang giver mulighed for effektiv skalering ved at udnytte hurtige og lette genfindingsmetoder i den indledende fase, mens den mere beregningsintensive genrangeringsproces reserveres til en mindre delmængde af dokumenter.
Fleksibilitet: Genrangeringsmodeller kan udskiftes eller opdateres uafhængigt af den indledende genfindingsmetode, hvilket giver fleksibilitet og tilpasningsevne til systemets skiftende behov.
ColBERT: Effektiv og effektiv sen interaktion
En af de fremtrædende modeller inden for omplacering er ColBERT (Kontekstualiseret sen interaktion over BERT). ColBERT er en dokumentomstillingsmodel, der udnytter BERT's dybe sprogforståelsesevner, mens den introducerer en ny interaktionsmekanisme kendt som "sen interaktion".
ColBERT: Effektiv og effektiv passagesøgning via kontekstualiseret sen interaktion over BERT
Den sene interaktionsmekanisme i ColBERT giver mulighed for effektiv og præcis hentning ved at behandle forespørgsler og dokumenter separat indtil de sidste stadier af genfindingsprocessen. Specifikt koder ColBERT uafhængigt forespørgslen og dokumentet ved hjælp af BERT og anvender derefter et let, men kraftfuldt interaktionstrin, der modellerer deres finkornede lighed. Ved at forsinke, men bevare denne finkornede interaktion, kan ColBERT udnytte dybe sprogmodellers udtryksevne og samtidig opnå evnen til at forudberegne dokumentrepræsentationer offline, hvilket fremskynder forespørgselsbehandlingen betydeligt.
ColBERTs sene interaktionsarkitektur tilbyder adskillige fordele, herunder forbedret beregningseffektivitet, skalerbarhed med dokumentsamlingsstørrelse og praktisk anvendelighed til scenarier i den virkelige verden. Derudover er ColBERT blevet yderligere forbedret med teknikker som dæmpet supervision og resterende kompression (i ColBERTv2), som forfiner træningsprocessen og reducerer modellens pladsfodaftryk, samtidig med at den høje genfindingseffektivitet opretholdes.
Dette kodestykke demonstrerer, hvordan man konfigurerer og bruger jina-colbert-v1-en-modellen til at indeksere en samling af dokumenter, og udnytter dens evne til at håndtere lange sammenhænge effektivt.
Implementering af to-trins hentning med rerankere
Nu hvor vi har en forståelse af principperne bag to-trins hentning og rerankere, lad os undersøge deres praktiske implementering inden for rammerne af et RAG-system. Vi vil udnytte populære biblioteker og rammer til at demonstrere integrationen af ​​disse teknikker.
Opsætning af miljøet
Inden vi dykker ned i koden, lad os sætte vores udviklingsmiljø op. Vi vil bruge Python og flere populære NLP-biblioteker, herunder Hugging Face Transformers, Sentence Transformers og LanceDB.
Til demonstrationsformål vil vi bruge "ai-arxiv-chunked"-datasættet fra Hugging Face Datasets, som indeholder over 400 ArXiv-artikler om maskinlæring, naturlig sprogbehandling og store sprogmodeller.
from datasets import load_dataset
dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")
<pre>
Dernæst vil vi forbehandle dataene og opdele dem i mindre bidder for at lette effektiv hentning og behandling.
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)
Til den indledende genfindingsfase vil vi bruge en sætningstransformer-model til at indkode vores dokumenter og forespørgsler til tætte vektorrepræsentationer og derefter udføre den omtrentlige nærmeste nabosøgning ved hjælp af en vektordatabase 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 vores dokumenter indekseret kan vi udføre den indledende hentning ved at finde de nærmeste naboer til en given forespørgselsvektor.
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 indledende hentning anvender vi en omrangeringsmodel til at omarrangere de hentede dokumenter baseret på deres relevans for forespørgslen. I dette eksempel vil vi bruge ColBERT reranker, en hurtig og nøjagtig transformer-baseret model, der er specielt designet til dokumentrangering.
reranked_docs listen indeholder nu de dokumenter, der er omarrangeret baseret på deres relevans for forespørgslen, som bestemt af ColBERT-omplaceringen.
Augmentation og Generation
Med de omplacerede og relevante dokumenter i hånden, kan vi fortsætte til forstærknings- og generationsstadierne af RAG-pipelinen. Vi bruger en sprogmodel fra Hugging Face Transformers-biblioteket til at generere det endelige svar.
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 kodestykket ovenfor udvider vi den oprindelige forespørgsel med de tre øverste omrangerede dokumenter, hvilket skaber en augmented_query. Vi sender derefter denne udvidede forespørgsel til en T5-sprogmodel, som genererer et svar baseret på den angivne kontekst.
response variabel vil indeholde det endelige output, der udnytter den eksterne information fra de hentede og omrangerede dokumenter for at give et mere præcist og omfattende svar på den oprindelige forespørgsel.
Avancerede teknikker og overvejelser
Mens den implementering, vi har dækket, giver et solidt grundlag for at integrere to-trins hentning og rerankere i et RAG-system, er der adskillige avancerede teknikker og overvejelser, der yderligere kan forbedre ydeevnen og robustheden af ​​tilgangen.
Forespørgselsudvidelse: For at forbedre det indledende genfindingsstadium kan du anvende teknikker til forespørgselsudvidelse, som involverer at udvide den oprindelige forespørgsel med relaterede termer eller sætninger. Dette kan hjælpe med at hente et mere forskelligartet sæt af potentielt relevante dokumenter.
Ensemble-omplacering: I stedet for at stole pĂĄ en enkelt omplaceringsmodel, kan du kombinere flere rerankere til et ensemble, og udnytte styrkerne ved forskellige modeller til at forbedre den samlede ydeevne.
Finjustering af Rerankers: Selvom præ-trænede omrangeringsmodeller kan være effektive, kan finjustering af dem på domænespecifikke data yderligere forbedre deres evne til at fange domænespecifik semantik og relevanssignaler.
Iterativ hentning og omrangering: I nogle tilfælde er en enkelt iteration af hentning og omplacering muligvis ikke tilstrækkelig. Du kan udforske iterative tilgange, hvor outputtet fra sprogmodellen bruges til at forfine forespørgslen og genfindingsprocessen, hvilket fører til et mere interaktivt og dynamisk system.
Afbalancering af relevans og mangfoldighed: Mens rerankers sigter mod at fremme de mest relevante dokumenter, er det vigtigt at finde en balance mellem relevans og mangfoldighed. Inkorporering af mangfoldighedsfremmende teknikker kan hjælpe med at forhindre, at systemet bliver alt for snævert eller partisk i dets informationskilder.
Evalueringsmålinger: For at vurdere effektiviteten af ​​din tilgang til hentning og omplacering i to trin skal du definere passende evalueringsmetrikker. Disse kan omfatte traditionelle informationshentningsmetrikker som præcision, tilbagekaldelse og gennemsnitlig gensidig rang (MRR) såvel som opgavespecifikke metrikker, der er skræddersyet til din brugssituation.
Konklusion
Retrieval Augmented Generation (RAG) er dukket op som en kraftfuld teknik til at forbedre mulighederne for store sprogmodeller ved at udnytte eksterne informationskilder. Traditionelle genfindingsmetoder har dog ofte svært ved at identificere de mest relevante dokumenter, hvilket fører til suboptimal ydeevne.
To-trins hentning med rerankere tilbyder en overbevisende løsning på denne udfordring. Ved at kombinere en indledende hurtig genfindingsfase med en mere sofistikeret omplaceringsmodel, kan denne tilgang markant forbedre nøjagtigheden og relevansen af ​​de hentede dokumenter, hvilket i sidste ende fører til genererede svar af højere kvalitet fra sprogmodellen.
Jeg har brugt de sidste fem år på at fordybe mig i den fascinerende verden af ​​Machine Learning og Deep Learning. Min passion og ekspertise har ført mig til at bidrage til over 50 forskellige software engineering projekter, med særligt fokus på AI/ML. Min vedvarende nysgerrighed har også trukket mig hen imod Natural Language Processing, et felt jeg er ivrig efter at udforske yderligere.