AGI og fremtidens AI

Kraften af Rerankers og To-Trins Retrieval til Retrieval Augmenteret Generering

mm
Føj Unite.AI til dine foretrukne kilder på Google

Når det kommer til naturlig sprogbehandling (NLP) og informationshenting, er det vigtigt at kunne hente relevante oplysninger effektivt og nøjagtigt. Mens feltet fortsætter med at udvikle sig, bliver der udviklet nye teknikker og metoder til at forbedre præstationen af hentningssystemer, især i sammenhæng med Retrieval Augmenteret Generering (RAG). En sådan teknik, kendt som to-trins henting med rerankere, er opstået som en kraftfuld løsning til at tackle de indbyggede begrænsninger i traditionelle hentningsmetoder.

I denne artikel diskuterer vi detaljerne om to-trins henting og rerankere, og udforsker deres underliggende principper, implementeringsstrategier og de fordele, de tilbyder i forbedring af nøjagtigheden og effektiviteten af RAG-systemer. Vi vil også give praktiske eksempler og kodeeksempler for at illustrere begreberne og lette en dybere forståelse af denne avancerede teknik.

Forståelse af Retrieval Augmenteret Generering (RAG)

swe agent LLM

Før vi dykker ned i detaljerne om to-trins henting og rerankere, lad os kort genopfriske begrebet om Retrieval Augmenteret Generering (RAG). RAG er en teknik, der udvider kendskabet og kapaciteten af store sprogmodeller (LLM) ved at give dem adgang til eksterne informationskilder, såsom databaser eller dokumentkollektioner. Læs mere fra artiklen “En dybdykkende introduktion til Retrieval Augmenteret Generering i LLM“.

Den typiske RAG-proces indebærer følgende trin:

  1. Spørgsmål: En bruger stiller et spørgsmål eller giver en instruks til systemet.
  2. Henting: Systemet henter en vektor-database eller dokumentkollektion for at finde oplysninger, der er relevante for brugerens spørgsmål.
  3. Udvikling: De hentede oplysninger kombineres med brugerens oprindelige spørgsmål eller instruks.
  4. Generering: Sprogmodellen behandler den udviklede input og genererer en respons, der udnytter de eksterne oplysninger til at forbedre nøjagtigheden og fuldstændigheden af dens output.

Selvom RAG har vist sig at være en kraftfuld teknik, er det ikke uden udfordringer. En af de vigtigste problemer ligger i hentningsstadiet, hvor traditionelle hentningsmetoder kan svigte i at identificere de mest relevante dokumenter, hvilket kan føre til underoptimal eller urigtig respons fra sprogmodellen.

Behovet for To-Trins Henting og Rerankere

Traditionelle hentningsmetoder, såsom de, der er baseret på nøgleordsmatchning eller vektorrummodeller, kæmper ofte med at fange de nuancerede semantiske relationer mellem spørgsmål og dokumenter. Dette begrænsning kan resultere i henting af dokumenter, der kun er overfladisk relevante eller mangler afgørende oplysninger, der kunne forbedre kvaliteten af den genererede respons.

For at tackle denne udfordring har forskere og praktikere vendt sig til to-trins henting med rerankere. Denne tilgang indebærer en to-trinsproces:

  1. Initial Henting: I første stadium hentes en relativt stor mængde potentielt relevante dokumenter ved hjælp af en hurtig og effektiv hentningsmetode, såsom en vektorrummodel eller en nøgleordsbaseret søgning.
  2. Reranking: I andet stadium anvendes en mere avanceret rerankingsmodel til at omordne de initialt hentede dokumenter baseret på deres relevans for spørgsmålet, effektivt bringer de mest relevante dokumenter til toppen af listen.

Rerankingsmodellen, ofte en neural netværk eller en transformer-baseret arkitektur, er specifikt trænet til at vurderere relevansen af et dokument i forhold til et givet spørgsmål. Ved at udnytte avancerede naturlige sprogforståelseskapaciteter kan rerankereren fange de semantiske nuancer og kontekstuelle relationer mellem spørgsmålet og dokumenterne, hvilket resulterer i en mere præcis og relevant rangordning.

Fordele ved To-Trins Henting og Rerankere

Anvendelsen af to-trins henting med rerankere tilbyder flere betydelige fordele i sammenhæng med RAG-systemer:

  1. Forbedret Nøjagtighed: Ved at omordne de initialt hentede dokumenter og fremme de mest relevante til toppen, kan systemet give mere præcise og nøjagtige oplysninger til sprogmodellen, hvilket fører til højere kvalitet af de genererede responser.
  2. Mindskning af Udenfor-Domæne-Problemer: Indlejrede modeller, der anvendes til traditionel henting, er ofte trænet på generelle tekstkorpus, som måske ikke fanger domænespecifik sprog og semantik. Rerankingsmodeller kan derimod trænes på domænespecifik data, hvilket mindsker “udenfor-domæne”-problemet og forbedrer relevansen af de hentede dokumenter inden for specialiserede domæner.
  3. Skalbarhed: To-trins-tilgange tillader effektiv skalering ved at udnytte hurtige og letvægtige hentningsmetoder i første stadium, mens den mere beregningsintensive rerankingsproces reserveres for en mindre undermængde af dokumenter.
  4. Fleksibilitet: Rerankingsmodeller kan udskiftes eller opdateres uafhængigt af den initiale hentningsmetode, hvilket giver fleksibilitet og tilpasningsevne til systemets udviklingsbehov.

ColBERT: Effektiv og Effektiv Sen Interaktion

En af de fremtrædende modeller i området for rerankere er ColBERT (Contextualized Late Interaction over BERT). ColBERT er en dokument-reranker-model, der udnytter de dybe sprogforståelseskapaciteter i BERT, samtidig med at den introducerer en ny interaktionsmekanisme kendt som “sen interaktion”.

ColBERT: Effektiv og Effektiv Passage Search via Contextualized Late Interaction over BERT

ColBERT: Effektiv og Effektiv Passage Search via Contextualized Late Interaction over BERT

Den sene interaktionsmekanisme i ColBERT tillader effektiv og præcis henting ved at behandle spørgsmål og dokumenter separat indtil de sidste stadier af hentningsprocessen. Specifikt kodificerer ColBERT spørgsmålet og dokumentet uafhængigt ved hjælp af BERT og anvender derefter en letvægtig, men kraftfuld interaktionsstep, der modellerer deres fine-grænede lignende. Ved at udsætte, men bevare denne fine-grænede interaktion, kan ColBERT udnytte udtrykskraften af dybe sprogmodeller, samtidig med at den opnår evnen til at forhåndskode dokumentrepræsentationer offline, hvilket betydeligt accelererer spørgmålsbehandling.

ColBERTs sene interaktionsarkitektur tilbyder flere fordele, herunder forbedret beregnings-effektivitet, skalbarhed med dokumentkollektionsstørrelse og praktisk anvendelighed for virkelige scenarier. Desuden er ColBERT yderligere forbedret med teknikker som støjreducering og residual kompression (i ColBERTv2), som raffinerer træningsprocessen og reducerer modellens pladsaftryk, samtidig med at den opretholder høj hentningseffektivitet.

Dette kodeeksempel demonstrerer, hvordan man kan konfigurere og anvende jina-colbert-v1-en-modellen til at indekserere en samling af dokumenter, udnyttende dens evne til at håndtere lange kontekster effektivt.

Implementering af To-Trins Henting med Rerankere

Nu, hvor vi har en forståelse for principperne bag to-trins henting og rerankere, lad os udforske deres praktiske implementering inden for en RAG-kontekst. Vi vil anvende populære biblioteker og rammer til at demonstrere integrationen af disse teknikker.

Opsætning af Miljøet

Før vi dykker ned i koden, lad os opsætte vores udviklingsmiljø. Vi vil anvende Python og flere populære NLP-biblioteker, herunder Hugging Face Transformers, Sentence Transformers og LanceDB.

# Installér nødvendige biblioteker
!pip install datasets huggingface_hub sentence_transformers lancedb

Dataforberedelse

Til demonstration formål vil vi anvende “ai-arxiv-chunked”-datasettet fra Hugging Face Datasets, der indeholder over 400 ArXiv-papirer om maskinlæring, naturlig sprogbehandling og store sprogmodeller.

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;

Herefter vil vi forberede dataene og opdele dem i mindre stykker for at lette effektiv henting og bearbejdning.

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 den initiale hentningsfase vil vi anvende en Sentence Transformer-model til at kodificere vores dokumenter og spørgsmål i tætte vektorrepræsentationer og derefter udføre approximativ nærmeste nabo-søgning ved hjælp af en vektor-database som LanceDB.

from sentence_transformers import SentenceTransformer
from lancedb import lancedb

<p># Indlæs Sentence Transformer-model
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

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

<p># Indeksér 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># Indlæs Sentence Transformer-model
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

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

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

Med vores dokumenter indekseret kan vi udføre den initiale henting ved at finde de nærmeste naboer til en given spørgsmålsvektor.

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

Efter den initiale henting vil vi anvende en reranker-model til at omordne de hentede dokumenter baseret på deres relevans for spørgsmålet. I dette eksempel vil vi anvende ColBERT-rerankereren, en hurtig og præcis transformer-baseret model specifikt designet til dokument-rangordning.

from lancedb.rerankers import ColbertReranker

reranker = ColbertReranker()

<p># Rerank initialt dokumenter
reranked_docs = reranker.rerank(query, initial_docs)

Listen reranked_docs indeholder nu dokumenterne omordnet baseret på deres relevans for spørgsmålet, som bestemt af ColBERT-rerankereren.

Udvikling og Generering

Med de omordnede og relevante dokumenter i hånden kan vi fortsætte til udviklings- og genereringsstadierne af RAG-pipelines. Vi vil anvende en sprogmodel fra Hugging Face Transformers-biblioteket til at generere den endelige respons.

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

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

<p># Udvikler spørgsmål med omordnede dokumenter
augmented_query = query + &quot; &quot; + &quot; &quot;.join(reranked_docs[:3])</p>

<p># Generer respons fra sprogmodel
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 kodeeksemplet ovenfor udvikler vi det oprindelige spørgsmål med de top tre omordnede dokumenter, opretter en augmented_query. Vi passer derefter denne udviklede forespørgsel til en T5-sprogmodel, der genererer en respons baseret på den givne kontekst.

Variablen response vil indeholde den endelige output, der udnytter de eksterne oplysninger fra de hentede og omordnede dokumenter til at give en mere præcis og fuldstændig respons på det oprindelige spørgsmål.

Avancerede Teknikker og Overvejelser

Selvom implementeringen, vi har dækket, giver en solid grundlag for integration af to-trins henting og rerankere i et RAG-system, er der flere avancerede teknikker og overvejelser, der kan yderligere forbedre præstationen og robustheden af denne tilgang.

  1. Spørgsmålsudvidelse: For at forbedre den initiale hentningsfase kan du anvende spørgsmålsudvidelsesteknikker, der indebærer at udvide det oprindelige spørgsmål med relaterede termer eller fraser. Dette kan hjælpe med at hente en mere diversificeret mængde potentielt relevante dokumenter.
  2. Ensemble-Reranking: I stedet for at afhænge af en enkelt rerankeringsmodel kan du kombinere flere rerankere i et ensemble, der udnytter styrkerne fra forskellige modeller til at forbedre den samlede præstation.
  3. Fine-tuning af Rerankere: Selvom forudtrænede rerankeringsmodeller kan være effektive, kan fine-tuning af dem på domænespecifik data yderligere forbedre deres evne til at fange domænespecifik semantik og relevanssignaler.
  4. Iterativ Henting og Reranking: I visse tilfælde kan en enkelt iteration af henting og reranking ikke være tilstrækkelig. Du kan udforske iterative tilgange, hvor outputtet fra sprogmodellen anvendes til at raffinere spørgsmålet og hentningsprocessen, hvilket fører til et mere interaktivt og dynamisk system.
  5. Balancering af Relevans og Diversitet: Selvom rerankere sigter mod at fremme de mest relevante dokumenter, er det vigtigt at finde en balance mellem relevans og diversitet. Indlejring af diversitetsfremmende teknikker kan hjælpe med at forhindre, at systemet bliver for snævert eller forvrænget i sine informationskilder.
  6. Evalueringsmetrikker: For at vurdere effektiviteten af din to-trins hentnings- og rerankings-tilgang skal du definere passende evalueringsmetrikker. Disse kan omfatte traditionelle informationshentningsmetrikker som præcision, recall og gennemsnitlig reciprok rang (MRR), samt opgave-specifikke metrikker tilpasset til din anvendelsessituation.

Konklusion

Retrieval Augmenteret Generering (RAG) er opstået som en kraftfuld teknik til at forbedre kapaciteten af store sprogmodeller ved at udnytte eksterne informationskilder. Dog kæmper traditionelle hentningsmetoder ofte med at identificere de mest relevante dokumenter, hvilket kan føre til underoptimal eller urigtig respons fra sprogmodellen.

To-trins henting med rerankere tilbyder en overbevisende løsning på denne udfordring. Ved at kombinere en initial hurtig hentningsfase med en mere avanceret rerankeringsmodel kan denne tilgang betydeligt forbedre nøjagtigheden og relevansen af de hentede dokumenter, hvilket fører til højere kvalitet af de genererede responser fra sprogmodellen.

Jeg har brugt de sidste fem år på at dykke ned 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-ingeniørprojekter, med en særlig fokus på AI/ML. Min fortsatte nysgerrighed har også ført mig mod Natural Language Processing, et felt jeg er ivrig efter at udforske yderligere.