AGI

Kracht van Rerankers en Twee-Stappen Retrieval voor Retrieval Augmented Generation

mm
Retrieval Augmented Generation

Wanneer het gaat om natuurlijke taalverwerking (NLP) en informatie-opvraging, is het vermogen om efficiënt en nauwkeurig relevante informatie op te halen van het grootste belang. Naarmate het veld zich verder ontwikkelt, worden nieuwe technieken en methoden ontwikkeld om de prestaties van opvragingssystemen te verbeteren, met name in de context van Retrieval Augmented Generation (RAG). Een dergelijke techniek, bekend als twee-stappenopvraging met rerankers, is opgekomen als een krachtige oplossing om de inherente beperkingen van traditionele opvragingsmethoden aan te pakken.

In dit artikel bespreken we de nuances van twee-stappenopvraging en rerankers, waarbij we de onderliggende principes, implementatiestrategieën en de voordelen die ze bieden in het verbeteren van de nauwkeurigheid en efficiëntie van RAG-systemen onderzoeken. We zullen ook praktische voorbeelden en codefragmenten bieden om de concepten te illustreren en een dieper begrip van deze baanbrekende techniek te faciliteren.

Inzicht in Retrieval Augmented Generation (RAG)

swe agent LLM

Voordat we de specifieke details van twee-stappenopvraging en rerankers onderzoeken, laten we eerst het concept van Retrieval Augmented Generation (RAG) kort herzien. RAG is een techniek die de kennis en mogelijkheden van grote taalmodellen (LLM’s) uitbreidt door hen toegang te geven tot externe informatiebronnen, zoals databases of documentcollecties. Raadpleeg meer van het artikel “A Deep Dive into Retrieval Augmented Generation in LLM“.

Het typische RAG-proces omvat de volgende stappen:

  1. Query: Een gebruiker stelt een vraag of geeft een instructie aan het systeem.
  2. Opvraging: Het systeem vraagt een vectordatabase of documentcollectie op om informatie te vinden die relevant is voor de vraag van de gebruiker.
  3. Aanvulling: De opgehaalde informatie wordt gecombineerd met de oorspronkelijke vraag of instructie van de gebruiker.
  4. Generatie: De taalmodel verwerkt de aangevulde invoer en genereert een antwoord, waarbij het externe informatie gebruikt om de nauwkeurigheid en volledigheid van de uitvoer te verbeteren.

Hoewel RAG een krachtige techniek is gebleken, is het niet zonder uitdagingen. Een van de belangrijkste problemen ligt in de opvragingsfase, waar traditionele opvragingsmethoden mogelijk niet in staat zijn om de meest relevante documenten te identificeren, wat leidt tot suboptimale of onnauwkeurige antwoorden van de taalmodel.

De noodzaak van twee-stappenopvraging en rerankers

Traditionele opvragingsmethoden, zoals die gebaseerd zijn op trefwoordovereenkomst of vectorruimtemodellen, worstelen vaak met het vastleggen van de nuances van semantische relaties tussen vragen en documenten. Deze beperking kan ertoe leiden dat documenten worden opgehaald die alleen oppervlakkig relevant zijn of cruciale informatie missen die de kwaliteit van het gegenereerde antwoord aanzienlijk kan verbeteren.

Om deze uitdaging aan te pakken, zijn onderzoekers en beoefenaars overgestapt op twee-stappenopvraging met rerankers. Deze benadering omvat een tweestapsproces:

  1. Initiële opvraging: In de eerste fase wordt een relatief grote set van potentieel relevante documenten opgehaald met behulp van een snelle en efficiënte opvragingsmethode, zoals een vectorruimtemodel of een trefwoordgebaseerde zoekopdracht.
  2. Reranking: In de tweede fase wordt een meer geavanceerd rerankingmodel gebruikt om de oorspronkelijk opgehaalde documenten opnieuw te rangschikken op basis van hun relevantie voor de vraag, waardoor de meest relevante documenten naar de top van de lijst worden gebracht.

Het rerankingmodel, vaak een neurale netwerk of een transformer-architectuur, is specifiek getraind om de relevantie van een document voor een bepaalde vraag te beoordelen. Door geavanceerde natuurlijke taalbegripsvermogens te gebruiken, kan de reranker de semantische nuances en contextuele relaties tussen de vraag en de documenten vastleggen, wat resulteert in een nauwkeurigere en relevantere rangschikking.

Voordelen van twee-stappenopvraging en rerankers

De adoptie van twee-stappenopvraging met rerankers biedt verschillende significante voordelen in de context van RAG-systemen:

  1. Verbeterde nauwkeurigheid: Door de oorspronkelijk opgehaalde documenten opnieuw te rangschikken en de meest relevante naar de top te brengen, kan het systeem nauwkeurigere en precieze informatie aan de taalmodel leveren, wat leidt tot hoogwaardige gegenereerde antwoorden.
  2. Verlichting van uit-domeinproblemen: Embeddingmodellen die voor traditionele opvraging worden gebruikt, zijn vaak getraind op algemene tekstcorpora, die mogelijk niet voldoende domeinspecifieke taal en semantiek vastleggen. Rerankingmodellen kunnen daarentegen op domeinspecifieke gegevens worden getraind, waardoor het “uit-domein”-probleem wordt verlicht en de relevantie van opgehaalde documenten binnen gespecialiseerde domeinen wordt verbeterd.
  3. Schaalbaarheid: De twee-stappenbenadering maakt efficiënte schaalbaarheid mogelijk door snelle en lichtgewicht opvragingsmethoden in de initiële fase te gebruiken, terwijl de meer compute-intensieve rerankingfase wordt gereserveerd voor een kleinere subset van documenten.
  4. Flexibiliteit: Rerankingmodellen kunnen onafhankelijk van de initiële opvragingsmethode worden gewisseld of bijgewerkt, waardoor flexibiliteit en aanpasbaarheid aan de evoluerende behoeften van het systeem worden geboden.

ColBERT: Efficiënte en effectieve late interactie

Een van de opvallende modellen in het domein van rerankers is ColBERT (Contextualized Late Interaction over BERT). ColBERT is een documentrerankermodel dat de diepe taalbegripsvermogens van BERT gebruikt en een novum interactiemechanisme introduceert, bekend als “late interactie”.

ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT

ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT

Het late interactiemechanisme in ColBERT maakt efficiënte en precieze opvraging mogelijk door vragen en documenten afzonderlijk te verwerken totdat de laatste stadia van het opvragingsproces. Specifiek encodeert ColBERT de vraag en het document onafhankelijk met BERT en gebruikt vervolgens een lichtgewicht maar krachtig interactiestap dat de fijne korreligheid van hun overeenkomst modelleert. Door deze fijne korreligheid te behouden maar uit te stellen, kan ColBERT de expressiviteit van diepe taalmodellen benutten en tegelijkertijd de mogelijkheid verkrijgen om documentrepresentaties offline voor te berekenen, waardoor queryverwerking aanzienlijk wordt versneld.

De late interactiearchitectuur van ColBERT biedt verschillende voordelen, waaronder verbeterde compute-efficiëntie, schaalbaarheid met de grootte van de documentcollectie en praktische toepasbaarheid voor real-world scenario’s. Bovendien is ColBERT verder verbeterd met technieken zoals geruisloze supervisie en residu-compressie (in ColBERTv2), die het trainingsproces verfijnen en de ruimtevoetafdruk van het model verkleinen terwijl de hoge opvragingseffectiviteit behouden blijft.

Implementatie van twee-stappenopvraging met rerankers

Nu we een begrip hebben van de principes achter twee-stappenopvraging en rerankers, laten we hun praktische implementatie in de context van een RAG-systeem onderzoeken. We zullen populaire bibliotheken en frameworks gebruiken om de integratie van deze technieken te demonstreren.

Opzet van de omgeving

Voordat we in de code duiken, laten we onze ontwikkelomgeving opzetten. We zullen Python en verschillende populaire NLP-bibliotheken gebruiken, waaronder Hugging Face Transformers, Sentence Transformers en LanceDB.

# Installeer vereiste bibliotheken
!pip install datasets huggingface_hub sentence_transformers lancedb

Gegevensvoorbereiding

Voor demonstratiedoeleinden zullen we het “ai-arxiv-chunked”-dataset van Hugging Face Datasets gebruiken, dat meer dan 400 ArXiv-papers over machine learning, natuurlijke taalverwerking en grote taalmodellen bevat.

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;

Vervolgens zullen we de gegevens voorbereiden en opsplitsen in kleinere stukken om efficiënte opvraging en verwerking te faciliteren.

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>

Voor de initiële opvragingsfase zullen we een Sentence Transformer-model gebruiken om onze documenten en vragen om te zetten in dichte vectorrepresentaties, en vervolgens approximatieve nearest neighbor-zoekopdrachten uitvoeren met een vectordatabase zoals LanceDB.

from sentence_transformers import SentenceTransformer
from lancedb import lancedb

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

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

<p># Indexeer documenten
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># Laad Sentence Transformer-model
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

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

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

Reranking

Na de initiële opvraging zullen we een rerankingmodel gebruiken om de opgehaalde documenten opnieuw te rangschikken op basis van hun relevantie voor de vraag. In dit voorbeeld zullen we de ColBERT-reranker gebruiken, een snelle en nauwkeurige transformer-gebaseerde model specifiek ontworpen voor documentranking.

from lancedb.rerankers import ColbertReranker

reranker = ColbertReranker()

<p># Rerank initiële documenten
reranked_docs = reranker.rerank(query, initial_docs)

De reranked_docs-lijst bevat nu de documenten opnieuw gerangschikt op basis van hun relevantie voor de vraag, zoals bepaald door de ColBERT-reranker.

Aanvulling en generatie

Met de gererangschikte en relevante documenten in handen, kunnen we verdergaan met de aanvullings- en generatiefasen van de RAG-pijplijn. We zullen een taalmodel uit de Hugging Face Transformers-bibliotheek gebruiken om het finale antwoord te genereren.

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

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

<p># Aanvullen van de oorspronkelijke vraag met gererangschikte documenten
augmented_query = query + &quot; &quot; + &quot; &quot;.join(reranked_docs[:3])</p>

<p># Genereren van antwoord vanuit taalmodel
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)

In het bovenstaande codefragment wordt de oorspronkelijke vraag aangevuld met de top drie gererangschikte documenten, waardoor een augmented_query ontstaat. Vervolgens wordt deze aangevulde vraag doorgegeven aan een T5-taalmodel, dat een antwoord genereert op basis van de verstrekte context.

De response-variabele bevat het finale antwoord, dat de externe informatie van de opgehaalde en gererangschikte documenten gebruikt om een nauwkeuriger en vollediger antwoord te bieden op de oorspronkelijke vraag.

Geavanceerde technieken en overwegingen

Hoewel de implementatie die we hebben behandeld een solide basis biedt voor het integreren van twee-stappenopvraging en rerankers in een RAG-systeem, zijn er verschillende geavanceerde technieken en overwegingen die de prestaties en robuustheid van deze benadering verder kunnen verbeteren.

  1. Vraaguitbreiding: Om de initiële opvragingsfase te verbeteren, kunt u vraaguitbreidingsmethoden gebruiken, die het oorspronkelijke vraag uitbreiden met verwante termen of zinnen. Dit kan helpen om een meer diverse set van potentieel relevante documenten op te halen.
  2. Ensemble-reranking: In plaats van te vertrouwen op één rerankingmodel, kunt u meerdere rerankers combineren in een ensemble, waarbij de sterke punten van verschillende modellen worden benut om de algehele prestaties te verbeteren.
  3. Fine-tunen van rerankers: Hoewel vooraf getrainde rerankingmodellen effectief kunnen zijn, kan het fine-tunen ervan op domeinspecifieke gegevens hun vermogen om domeinspecifieke semantiek en relevantiesignalen te begrijpen, verder verbeteren.
  4. Iteratieve opvraging en reranking: In sommige gevallen kan één iteratie van opvraging en reranking niet voldoende zijn. U kunt iteratieve benaderingen onderzoeken, waarbij de uitvoer van het taalmodel wordt gebruikt om de vraag en het opvragingsproces te verfijnen, wat leidt tot een meer interactief en dynamisch systeem.
  5. Balans tussen relevantie en diversiteit: Hoewel rerankers ernaar streven de meest relevante documenten te promoten, is het essentieel om een balans te vinden tussen relevantie en diversiteit. Het incorporeren van diversiteit-bevorderende technieken kan helpen voorkomen dat het systeem te smal of bevooroordeeld wordt in zijn informatiebronnen.
  6. Beoordelingscriteria: Om de effectiviteit van uw twee-stappenopvragings- en rerankingbenadering te beoordelen, moet u geschikte beoordelingscriteria definiëren. Deze kunnen traditionele informatie-opvragingscriteria omvatten, zoals precisie, recall en gemiddelde reciproke rang (MRR), evenals taakspecifieke criteria die zijn aangepast aan uw specifieke use case.

Conclusie

Retrieval Augmented Generation (RAG) is opgekomen als een krachtige techniek voor het verbeteren van de capaciteiten van grote taalmodellen door externe informatiebronnen te benutten. Echter, traditionele opvragingsmethoden worstelen vaak met het identificeren van de meest relevante documenten, wat leidt tot suboptimale prestaties.

Twee-stappenopvraging met rerankers biedt een aantrekkelijke oplossing voor deze uitdaging. Door een initiële snelle opvragingsfase te combineren met een meer geavanceerd rerankingmodel, kan deze benadering de nauwkeurigheid en relevantie van de opgehaalde documenten aanzienlijk verbeteren, wat uiteindelijk leidt tot hoogwaardige gegenereerde antwoorden van het taalmodel.

Ik heb de afgelopen vijf jaar doorgebracht met het onderdompelen van mezelf in de fascinerende wereld van Machine Learning en Deep Learning. Mijn passie en expertise hebben me geleid om bij te dragen aan meer dan 50 diverse software-engineeringprojecten, met een bijzondere focus op AI/ML. Mijn voortdurende nieuwsgierigheid heeft me ook aangetrokken tot Natural Language Processing, een vakgebied dat ik graag verder wil verkennen.