AGI og fremtidens AI

Kraften til Rerankere og To-trinnsøkning for Retrieval Augmented Generation

mm
Legg til Unite.AI blant dine foretrukne kilder på Google

Når det gjelder naturlig språkbehandling (NLP) og informasjonsgjenfinning, er evnen til å effektivt og nøyaktig gjenfinne relevant informasjon av største betydning. Ettersom feltet fortsetter å utvikle seg, utvikles det nye teknikker og metoder for å forbedre ytelsen til gjenfinningssystemer, særlig i sammenheng med Retrieval Augmented Generation (RAG). En slik teknikk, kjent som to-trinnsøkning med rerankere, har oppstått som en kraftfull løsning for å møte de innebygde begrensningene til tradisjonelle gjenfinningmetoder.

I denne artikkelen diskuterer vi detaljene til to-trinnsøkning og rerankere, og utforsker deres underliggende prinsipper, implementeringsstrategier og fordeler de tilbyr i å forbedre nøyaktigheten og effektiviteten til RAG-systemer. Vi vil også gi praktiske eksempler og kodeutdrag for å illustrere konseptene og lette en dypere forståelse av denne banebrytende teknikken.

Forståelse av Retrieval Augmented Generation (RAG)

swe agent LLM

Før vi dykker ned i detaljene til to-trinnsøkning og rerankere, la oss kort gjenoppta konseptet om Retrieval Augmented Generation (RAG). RAG er en teknikk som utvider kunnskapen og evnene til store språkmodeller (LLM) ved å gi dem tilgang til eksterne informasjonskilder, som databaser eller dokumentasjoner. Se mer fra artikkelen “A Deep Dive into Retrieval Augmented Generation in LLM“.

Den typiske RAG-prosessen innebærer følgende trinn:

  1. Spørring: En bruker stiller et spørsmål eller gir en instruksjon til systemet.
  2. Gjenfinning: Systemet spør en vektor database eller dokumentasjoner for å finne informasjon relevant til brukerens spørring.
  3. Utvidelse: Den gjenfunne informasjonen kombineres med brukerens opprinnelige spørring eller instruksjon.
  4. Generering: Språkmodellen prosesserer den utvidede innmatningen og genererer et svar, ved å utnytte den eksterne informasjonen for å forbedre nøyaktigheten og fullstendigheten til utgangen.

Selv om RAG har vist seg å være en kraftfull teknikk, er den ikke uten utfordringer. En av de viktigste utfordringene ligger i gjenfinningsstadiet, der tradisjonelle gjenfinningmetoder kan svikte i å identifisere de mest relevante dokumentene, noe som kan føre til underoptimal eller uriktige svar fra språkmodellen.

Behovet for To-trinnsøkning og Rerankere

Tradisjonelle gjenfinningmetoder, som de basert på nøkkelordsmatching eller vektorrommodeller, har ofte vanskelig for å fange de nyanserte semantiske relasjonene mellom spørsmål og dokumenter. Denne begrensningen kan føre til at dokumenter som bare er overfladisk relevante eller mangler avgjørende informasjon som kunne forbedre kvaliteten på det genererte svaret.

For å møte denne utfordringen, har forskere og praktikere vendt seg mot to-trinnsøkning med rerankere. Denne tilnærmingen innebærer en to-trinnsprosess:

  1. Initial Gjenfinning: I det første stadiet, hentes en relativt stor mengde potensielt relevante dokumenter ved hjelp av en rask og effektiv gjenfinningmetode, som en vektorrommodell eller en nøkkelordbasert søk.
  2. Reranking: I det andre stadiet, brukes en mer avansert rerankingmodell til å omprioritere de initialt hentede dokumentene basert på deres relevans til spørringen, og bringer de mest relevante dokumentene til toppen av listen.

Rerankingmodellen, ofte en neural nettverks- eller transformer-basert arkitektur, er spesifikt trent for å vurdere relevansen av et dokument til en gitt spørring. Ved å utnytte avanserte naturlige språkforståelsesegenskaper, kan rerankereren fange de semantiske nyanser og kontekstuelle relasjonene mellom spørringen og dokumentene, noe som resulterer i en mer nøyaktig og relevant rangering.

Fordeler med To-trinnsøkning og Rerankere

Adopsjonen av to-trinnsøkning med rerankere tilbyr flere betydelige fordeler i sammenheng med RAG-systemer:

  1. Forbedret Nøyaktighet: Ved å omprioritere de initialt hentede dokumentene og fremme de mest relevante til toppen, kan systemet gi mer nøyaktig og presis informasjon til språkmodellen, noe som fører til høykvalitets genererte svar.
  2. Mindskede Ut-av-Domene-Problemer: Innlejningsmodellene brukt i tradisjonell gjenfinning er ofte trent på generelle tekstkorpus, som ikke alltid fanger domenespesifikke språk og semantikk. Rerankingmodellene, på den andre siden, kan trenes på domenespesifikke data, noe som mindsker “ut-av-domene”-problemet og forbedrer relevansen av hentede dokumenter innen spesialiserte domener.
  3. Skalbarhet: To-trinns tilnærmingen tillater effektiv skalering ved å utnytte raske og lette gjenfinningmetoder i det første stadiet, mens den mer komputasjonskrevende rerankingprosessen reserveres for en mindre undergruppe av dokumenter.
  4. Fleksibilitet: Rerankingmodellene kan byttes eller oppdateres uavhengig av den initial gjenfinningmetoden, noe som gir fleksibilitet og tilpasning til de evoluerende behovene til systemet.

ColBERT: Effektiv og Effektiv Sen Interaksjon

En av de fremtredende modellene i området til reranking er ColBERT (Contextualized Late Interaction over BERT). ColBERT er en dokument-reranker modell som utnytter de dype språkforståelsesegenskapene til BERT, samtidig som den introduserer en ny interaksjonsmekanisme kjent som “sen interaksjon”.

ColBERT: Effektiv og Effektiv Passage Søk via Contextualized Late Interaction over BERT

ColBERT: Effektiv og Effektiv Passage Søk via Contextualized Late Interaction over BERT

Den sene interaksjonsmekanismen i ColBERT tillater effektiv og presis gjenfinning ved å prosessere spørsmål og dokumenter separat til de siste stadiene av gjenfinningsprosessen. Spesifikt, ColBERT koder spørringen og dokumentet uavhengig ved hjelp av BERT, og deretter anvender en lettvekts, men kraftfull interaksjonssteg som modellerer deres fine-grådde likhet. Ved å forsinke, men likevel beholde denne fine-grådde interaksjonen, kan ColBERT utnytte uttrykkskraften til dypt lærte språkmodeller, samtidig som den tilegner seg evnen til å forhåndskalkulere dokumentrepresentasjoner offline, noe som betyr en betydelig akselerasjon av spørringsprosessen.

ColBERTs sene interaksjonsarkitektur tilbyr flere fordeler, inkludert forbedret beregnings-effektivitet, skalbarhet med dokumentasjoner, og praktisk anvendelighet for virkelige scenarier. I tillegg har ColBERT blitt ytterligere forbedret med teknikker som støyforstyrret overvåking og residual kompresjon (i ColBERTv2), som finjusterer treningsprosessen og reduserer modellens plassforbruk, samtidig som den opprettholder høy gjenfinningseffektivitet.

Implementering av To-trinnsøkning med Rerankere

Nå som vi har en forståelse av prinsippene bak to-trinnsøkning og rerankere, la oss utforske deres praktiske implementering innenfor sammenhengen av et RAG-system. Vi vil utnytte populære biblioteker og rammer for å demonstrere integreringen av disse teknikkene.

Oppsett av Miljø

Før vi dykker ned i koden, la oss sette opp vår utviklingsmiljø. Vi vil bruke Python og flere populære NLP-biblioteker, inkludert Hugging Face Transformers, Sentence Transformers og LanceDB.

# Installer nødvendige biblioteker
!pip install datasets huggingface_hub sentence_transformers lancedb

Dataforberedelse

Til demonstrasjon, vil vi bruke “ai-arxiv-chunked”-datasettet fra Hugging Face Datasets, som inneholder over 400 ArXiv-papirer om maskinlæring, naturlig språkbehandling og store språkmodeller.

from datasets import load_dataset

<p>dataset = load_dataset(&quot;jamescalam/ai-arxiv-chunked&quot;, split=&quot;train&quot;)</p>

&amp;lt;pre&amp;gt;

Deretter vil vi forberede dataene og dele dem inn i mindre deler for å lette effektiv gjenfinning og prosessering.

from transformers import AutoTokenizer

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)</p>

<p>def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors=&quot;pt&quot;, truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts</p>

<p>chunked_data = []
for doc in dataset:
text = doc[&quot;chunk&quot;]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)</p>

Til det initial gjenfinningsstadiet, vil vi bruke en Sentence Transformer-modell til å kode våre dokumenter og spørsmål til tette vektorrepresentasjoner, og deretter utføre approksimert nærmeste nabo-søk ved hjelp av en vektor database som LanceDB.

from sentence_transformers import SentenceTransformer
from lancedb import lancedb

<p># Last inn Sentence Transformer-modell
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

<p># Opprett LanceDB-vektorlagring
db = lancedb.lancedb(&#039;/path/to/store&#039;)
db.create_collection(&#039;docs&#039;, vector_dimension=model.get_sentence_embedding_dimension())</p>

<p># Indexer dokumenter
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document(&#039;docs&#039;, vector, text)</p>

<p>from sentence_transformers import SentenceTransformer
from lancedb import lancedb</p>

<p># Last inn Sentence Transformer-modell
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

<p># Opprett LanceDB-vektorlagring
db = lancedb.lancedb(&#039;/path/to/store&#039;)
db.create_collection(&#039;docs&#039;, vector_dimension=model.get_sentence_embedding_dimension())</p>

<p># Indexer dokumenter
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document(&#039;docs&#039;, vector, text)

Med dokumentene indexert, kan vi utføre det initial gjenfinningsstadiet ved å finne de nærmeste naboene til en gitt spørringsvektor.

from transformers import AutoTokenizer

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)</p>

<p>def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors=&quot;pt&quot;, truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts</p>

<p>chunked_data = []
for doc in dataset:
text = doc[&quot;chunk&quot;]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)

Reranking

Etter det initial gjenfinningsstadiet, vil vi bruke en reranking-modell til å omprioritere de hentede dokumentene basert på deres relevans til spørringen. I dette eksemplet vil vi bruke ColBERT-reranker, en rask og nøyaktig transformer-basert modell spesifikt designet for dokument-rangering.

from lancedb.rerankers import ColbertReranker

reranker = ColbertReranker()

<p># Reranker initial dokumenter
reranked_docs = reranker.rerank(query, initial_docs)

Listen reranked_docs inneholder nå dokumentene omprioritert basert på deres relevans til spørringen, bestemt av ColBERT-reranker.

Utvidelse og Generering

Med de rerankede og relevante dokumentene i hånden, kan vi gå videre til utvidelses- og genereringsstadiene av RAG-pipeline. Vi vil bruke en språkmodell fra Hugging Face Transformers-biblioteket til å generere det endelige svaret.

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;t5-base&quot;)
model = AutoModelForSeq2SeqLM.from_pretrained(&quot;t5-base&quot;)</p>

<p># Utvider spørring med rerankede dokumenter
augmented_query = query + &quot; &quot; + &quot; &quot;.join(reranked_docs[:3])</p>

<p># Generer svar fra språkmodell
input_ids = tokenizer.encode(augmented_query, return_tensors=&quot;pt&quot;)
output_ids = model.generate(input_ids, max_length=500)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)</p>

print(response)

I kodeutdraget ovenfor, utvider vi den opprinnelige spørringen med de tre øverste rerankede dokumentene, og skaper en augmented_query. Deretter passerer vi denne utvidede spørringen til en T5-språkmodell, som genererer et svar basert på den gitt konteksten.

Variabelen response vil inneholde det endelige svaret, som utnytter den eksterne informasjonen fra de hentede og rerankede dokumentene for å gi et mer nøyaktig og fullstendig svar på den opprinnelige spørringen.

Avanserte Teknikker og Overveielser

Selv om implementeringen vi har dekket gir en solid basis for å integrere to-trinnsøkning og rerankere i et RAG-system, finnes det flere avanserte teknikker og overveielser som kan ytterligere forbedre ytelsen og robustheten til tilnærmingen.

  1. Spørringsutvidelse: For å forbedre det initial gjenfinningsstadiet, kan du bruke spørringsutvidelsesteknikker, som innebærer å utvide den opprinnelige spørringen med relaterte termer eller fraser. Dette kan hjelpe med å hente en mer divers mengde potensielt relevante dokumenter.
  2. Ensemble Reranking: I stedet for å avhenge av en enkelt rerankingmodell, kan du kombinere flere rerankere i et ensemble, og utnytte styrkene til forskjellige modeller for å forbedre den overordnede ytelsen.
  3. Fine-tuning av Rerankere: Mens forhånds-trente rerankingmodeller kan være effektive, kan fine-tuning av dem på domenespesifikke data ytterligere forbedre deres evne til å fange domenespesifikke semantikk og relevanssignal.
  4. Iterativ Gjenfinning og Reranking: I noen tilfeller kan ett enkelt iterasjon av gjenfinning og reranking ikke være tilstrekkelig. Du kan utforske iterative tilnærminger, hvor utgangen fra språkmodellen brukes til å finjustere spørringen og gjenfinningsprosessen, noe som fører til et mer interaktivt og dynamisk system.
  5. Balansering av Relevans og Mangfold: Mens rerankere søker å fremme de mest relevante dokumentene, er det essensielt å finne en balanse mellom relevans og mangfold. Innføring av mangfoldsfrämjande teknikker kan hjelpe med å forhindre at systemet blir for snevert eller fordomsfullt i sine informasjonskilder.
  6. Evaluering av Metrikker: For å vurdere effektiviteten av din to-trinnsøkning og reranking-tilnærming, må du definere egnet evaluering av metrikker. Disse kan inkludere tradisjonelle informasjonsgjenfinningsmetrikker som presisjon, gjennomtrengning og gjennomsnittlig rekkefølge (MRR), samt oppgavespesifikke metrikker tilpasset ditt brukstilfelle.

Konklusjon

Retrieval Augmented Generation (RAG) har oppstått som en kraftfull teknikk for å forbedre evnene til store språkmodeller ved å utnytte eksterne informasjonskilder. Likevel har tradisjonelle gjenfinningmetoder ofte vanskelig for å identifisere de mest relevante dokumentene, noe som kan føre til underoptimal ytelse.

To-trinnsøkning med rerankere tilbyr en overbevisende løsning på denne utfordringen. Ved å kombinere et raskt initialt gjenfinningsstadium med en mer avansert rerankingmodell, kan denne tilnærmingen betydelig forbedre nøyaktigheten og relevansen av de hentede dokumentene, og til slutt føre til høykvalitets genererte svar fra språkmodellen.

Jeg har brukt de siste fem årene på å dykke ned i den fasiniserende verden av Maskinlæring og Dypt Læring. Min lidenskap og ekspertise har ledet meg til å bidra til over 50 ulike programvareprosjekter, med særlig fokus på AI/ML. Min pågående nysgjørhet har også trukket meg mot Naturlig Språkbehandling, et felt jeg er ivrig etter å utforske videre.