Vernetzen Sie sich mit uns

Künstliche allgemeine Intelligenz

Power of Reranker und Two-Stage Retrieval für Retrieval Augmented Generation

mm
Augmented Generation abrufen

Wenn es um die Verarbeitung natürlicher Sprache (NLP) und den Informationsabruf geht, ist die Fähigkeit, relevante Informationen effizient und genau abzurufen, von größter Bedeutung. Da sich das Fachgebiet ständig weiterentwickelt, werden neue Techniken und Methoden entwickelt, um die Leistung von Retrieval-Systemen zu verbessern, insbesondere im Zusammenhang mit Augmented Generation abrufen (LAPPEN). Eine dieser Techniken, bekannt als zweistufiger Abruf mit Rerankern, hat sich als leistungsstarke Lösung erwiesen, um die inhärenten Einschränkungen herkömmlicher Abrufmethoden zu überwinden.

In diesem Artikel besprechen wir die Feinheiten der zweistufigen Retrieval- und Reranker-Methode und untersuchen ihre zugrunde liegenden Prinzipien, Implementierungsstrategien und die Vorteile, die sie bei der Verbesserung der Genauigkeit und Effizienz von RAG-Systemen bieten. Wir stellen außerdem praktische Beispiele und Codeausschnitte zur Verfügung, um die Konzepte zu veranschaulichen und ein tieferes Verständnis dieser hochmodernen Technik zu ermöglichen.

Retrieval Augmented Generation (RAG) verstehen

swe agent LLM

Bevor wir uns mit den Besonderheiten des zweistufigen Retrievals und Rerankerns befassen, werfen wir einen kurzen Blick auf das Konzept der Retrieval Augmented Generation (RAG). RAG ist eine Technik, die das Wissen und die Fähigkeiten großer Sprachmodelle (LLMs) erweitert, indem sie ihnen Zugriff auf externe Informationsquellen wie Datenbanken oder Dokumentsammlungen ermöglicht. Weitere Informationen finden Sie im Artikel „Ein tiefer Einblick in Retrieval Augmented Generation im LLM".

Der typische RAG-Prozess umfasst die folgenden Schritte:

  1. Abfrage: Ein Benutzer stellt eine Frage oder gibt dem System eine Anweisung.
  2. Abruf: Das System fragt eine Vektordatenbank oder Dokumentensammlung ab, um Informationen zu finden, die für die Anfrage des Benutzers relevant sind.
  3. Augmentation: Die abgerufenen Informationen werden mit der ursprünglichen Anfrage oder Anweisung des Benutzers kombiniert.
  4. Generation: Das Sprachmodell verarbeitet die erweiterte Eingabe und generiert eine Antwort, wobei es die externen Informationen nutzt, um die Genauigkeit und Vollständigkeit seiner Ausgabe zu verbessern.

Obwohl sich RAG als leistungsstarke Technik erwiesen hat, ist sie nicht ohne Herausforderungen. Eines der Hauptprobleme liegt in der Abrufphase, wo herkömmliche Abrufmethoden möglicherweise nicht in der Lage sind, die relevantesten Dokumente zu identifizieren, was zu suboptimalen oder ungenauen Antworten des Sprachmodells führt.

Die Notwendigkeit eines zweistufigen Abrufs und einer Neubewertung

Herkömmliche Retrieval-Methoden, beispielsweise solche, die auf Keyword-Matching oder Vektorraummodellen basieren, haben oft Schwierigkeiten, die differenzierten semantischen Beziehungen zwischen Abfragen und Dokumenten zu erfassen. Diese Einschränkung kann dazu führen, dass Dokumente abgerufen werden, die nur oberflächlich relevant sind oder wichtige Informationen fehlen, die die Qualität der generierten Antwort erheblich verbessern könnten.

Um dieser Herausforderung zu begegnen, haben sich Forscher und Praktiker dem zweistufigen Retrieval mit Rerankern zugewandt. Dieser Ansatz umfasst einen zweistufigen Prozess:

  1. Erster Abruf: In der ersten Phase wird eine relativ große Menge potenziell relevanter Dokumente mithilfe einer schnellen und effizienten Abrufmethode wie einem Vektorraummodell oder einer schlüsselwortbasierten Suche abgerufen.
  2. Neueinstufung: In der zweiten Stufe wird ein ausgefeilteres Reranking-Modell verwendet, um die ursprünglich abgerufenen Dokumente basierend auf ihrer Relevanz für die Abfrage neu zu ordnen und so die relevantesten Dokumente effektiv an die Spitze der Liste zu bringen.

Das Reranking-Modell, häufig ein neuronales Netzwerk oder eine transformatorbasierte Architektur, ist speziell darauf trainiert, die Relevanz eines Dokuments für eine bestimmte Abfrage zu bewerten. Durch die Nutzung fortschrittlicher Fähigkeiten zum Verständnis natürlicher Sprache kann der Reranker die semantischen Nuancen und kontextuellen Beziehungen zwischen der Abfrage und den Dokumenten erfassen, was zu einer genaueren und relevanteren Rangfolge führt.

Vorteile des zweistufigen Abrufs und der Reranker

Die Einführung des zweistufigen Abrufs mit Rerankern bietet im Kontext von RAG-Systemen mehrere wesentliche Vorteile:

  1. Verbesserte Genauigkeit: Durch die Neuordnung der ursprünglich abgerufenen Dokumente und die Heraufstufung der relevantesten nach oben kann das System dem Sprachmodell genauere und präzisere Informationen liefern, was zu qualitativ hochwertigeren Antworten führt.
  2. Entschärfte Probleme außerhalb der Domäne: Einbettungsmodelle, die für die herkömmliche Retrieval-Methode verwendet werden, werden oft auf allgemeine Textkorpora trainiert, die möglicherweise die domänenspezifische Sprache und Semantik nicht ausreichend erfassen. Reranking-Modelle hingegen können auf domänenspezifischen Daten trainiert werden, wodurch das „Out-of-Domain“-Problem gemildert und die Relevanz abgerufener Dokumente innerhalb spezialisierter Domänen verbessert wird.
  3. Skalierbarkeit: Der zweistufige Ansatz ermöglicht eine effiziente Skalierung durch den Einsatz schneller und einfacher Abrufmethoden in der Anfangsphase, während der rechenintensivere Reranking-Prozess einer kleineren Teilmenge von Dokumenten vorbehalten bleibt.
  4. Flexibilität: Reranking-Modelle können unabhängig von der ursprünglichen Abrufmethode ausgetauscht oder aktualisiert werden, was Flexibilität und Anpassungsfähigkeit an die sich ändernden Anforderungen des Systems bietet.

ColBERT: Effiziente und effektive späte Interaktion

Eines der herausragenden Modelle im Bereich Reranking ist ColBERT (Kontextualisierte späte Interaktion über BERT). ColBERT ist ein Dokument-Reranker-Modell, das die umfassenden Sprachverständnisfähigkeiten von BERT nutzt und gleichzeitig einen neuartigen Interaktionsmechanismus einführt, der als „späte Interaktion“ bekannt ist.

ColBERT: Effiziente und effektive Passagensuche durch kontextualisierte späte Interaktion über BERT

ColBERT: Effiziente und effektive Passagensuche durch kontextualisierte späte Interaktion über BERT

Der Mechanismus der späten Interaktion in ColBERT ermöglicht einen effizienten und präzisen Abruf, indem Abfragen und Dokumente bis zur letzten Phase des Abrufprozesses getrennt verarbeitet werden. Insbesondere kodiert ColBERT die Abfrage und das Dokument unabhängig voneinander mithilfe von BERT und verwendet dann einen einfachen, aber leistungsstarken Interaktionsschritt, der ihre feinkörnige Ähnlichkeit modelliert. Durch die Verzögerung, aber Beibehaltung dieser feinkörnigen Interaktion kann ColBERT die Ausdruckskraft tiefer Sprachmodelle nutzen und gleichzeitig die Möglichkeit erhalten, Dokumentdarstellungen offline vorzuberechnen, was die Abfrageverarbeitung erheblich beschleunigt.

Die Late-Interaction-Architektur von ColBERT bietet mehrere Vorteile, darunter eine verbesserte Recheneffizienz, Skalierbarkeit mit der Größe der Dokumentensammlung und praktische Anwendbarkeit für reale Szenarien. Darüber hinaus wurde ColBERT durch Techniken wie Denoised Supervision und Residualkomprimierung (in ColBERTv2) weiter verbessert, die den Trainingsprozess verfeinern und den Platzbedarf des Modells reduzieren, während gleichzeitig eine hohe Abrufeffektivität erhalten bleibt.

Dieses Code-Snippet zeigt, wie Sie das Modell jina-colbert-v1-en für die Indizierung einer Sammlung von Dokumenten konfigurieren und verwenden und dabei seine Fähigkeit nutzen, lange Kontexte effizient zu verarbeiten.

Implementierung eines zweistufigen Abrufs mit Rerankern

Da wir nun ein Verständnis für die Prinzipien des zweistufigen Abrufs und der Rerankerung haben, wollen wir ihre praktische Umsetzung im Kontext eines RAG-Systems untersuchen. Wir werden gängige Bibliotheken und Frameworks nutzen, um die Integration dieser Techniken zu demonstrieren.

Einrichten der Umgebung

Bevor wir uns mit dem Code befassen, richten wir unsere Entwicklungsumgebung ein. Wir werden Python und mehrere beliebte NLP-Bibliotheken verwenden, darunter Hugging Face Transformers, Sentence Transformers und LanceDB.

# Install required libraries
!pip install datasets huggingface_hub sentence_transformers lancedb

Datenaufbereitung

Zu Demonstrationszwecken verwenden wir den Datensatz „ai-arxiv-chunked“ von Hugging Face Datasets, der über 400 ArXiv-Artikel zu maschinellem Lernen, Verarbeitung natürlicher Sprache und großen Sprachmodellen enthält.

from datasets import load_dataset

dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")

<pre>

Als Nächstes verarbeiten wir die Daten vor und teilen sie in kleinere Teile auf, um ein effizientes Abrufen und Verarbeiten zu ermöglichen.

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 die erste Abrufphase verwenden wir ein Sentence Transformer-Modell, um unsere Dokumente und Abfragen in dichte Vektordarstellungen zu kodieren, und führen dann eine Suche nach ungefähren nächsten Nachbarn mithilfe einer Vektordatenbank wie LanceDB durch.
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)

Wenn unsere Dokumente indiziert sind, können wir den ersten Abruf durchführen, indem wir die nächsten Nachbarn zu einem bestimmten Abfragevektor finden.

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)

Neueinstufung

Nach dem ersten Abruf verwenden wir ein Reranking-Modell, um die abgerufenen Dokumente basierend auf ihrer Relevanz für die Abfrage neu zu ordnen. In diesem Beispiel verwenden wir den ColBERT-Reranker, ein schnelles und genaues transformatorbasiertes Modell, das speziell für die Dokumenteneinstufung entwickelt wurde.

from lancedb.rerankers import ColbertReranker

reranker = ColbertReranker()

# Rerank initial documents
reranked_docs = reranker.rerank(query, initial_docs)

Der reranked_docs Die Liste enthält nun die Dokumente, die basierend auf ihrer Relevanz für die Abfrage neu geordnet wurden, wie durch den ColBERT-Reranker ermittelt.

Augmentation und Generation

Mit den neu eingestuften und relevanten Dokumenten können wir mit der Erweiterungs- und Generierungsphase der RAG-Pipeline fortfahren. Wir verwenden ein Sprachmodell aus der Hugging Face Transformers-Bibliothek, um die endgültige Antwort zu generieren.

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)

Im obigen Codeausschnitt erweitern wir die ursprüngliche Abfrage um die drei neu eingestuften Dokumente und erstellen so eine augmented_query. Anschließend übergeben wir diese erweiterte Abfrage an ein T5-Sprachmodell, das eine Antwort basierend auf dem bereitgestellten Kontext generiert.

Der response Die Variable enthält die endgültige Ausgabe und nutzt die externen Informationen aus den abgerufenen und neu eingestuften Dokumenten, um eine genauere und umfassendere Antwort auf die ursprüngliche Abfrage bereitzustellen.

Fortgeschrittene Techniken und Überlegungen

Während die von uns behandelte Implementierung eine solide Grundlage für die Integration von zweistufigem Abruf und Rerankern in ein RAG-System bietet, gibt es mehrere fortschrittliche Techniken und Überlegungen, die die Leistung und Robustheit des Ansatzes weiter verbessern können.

  1. Abfrageerweiterung: Um die anfängliche Abrufphase zu verbessern, können Sie Abfrageerweiterungstechniken einsetzen, bei denen die ursprüngliche Abfrage um verwandte Begriffe oder Phrasen erweitert wird. Dies kann dazu beitragen, einen vielfältigeren Satz potenziell relevanter Dokumente abzurufen.
  2. Neuordnung des Ensembles: Anstatt sich auf ein einziges Reranking-Modell zu verlassen, können Sie mehrere Reranking-Modelle zu einem Ensemble kombinieren und so die Stärken verschiedener Modelle nutzen, um die Gesamtleistung zu verbessern.
  3. Feinabstimmung der Reranker: Während vorab trainierte Reranking-Modelle effektiv sein können, kann ihre Feinabstimmung auf domänenspezifische Daten ihre Fähigkeit, domänenspezifische Semantik- und Relevanzsignale zu erfassen, weiter verbessern.
  4. Iteratives Abrufen und Neuranking: In manchen Fällen reicht eine einzige Iteration des Abrufs und der Neubewertung möglicherweise nicht aus. Sie können iterative Ansätze erkunden, bei denen die Ausgabe des Sprachmodells zur Verfeinerung des Abfrage- und Abrufprozesses verwendet wird, was zu einem interaktiveren und dynamischeren System führt.
  5. Relevanz und Vielfalt in Einklang bringen: Während Reranker darauf abzielen, die relevantesten Dokumente zu fördern, ist es wichtig, ein Gleichgewicht zwischen Relevanz und Vielfalt zu finden. Der Einsatz von Techniken zur Förderung der Vielfalt kann dazu beitragen, zu verhindern, dass das System in seinen Informationsquellen zu eng oder voreingenommen ist.
  6. Bewertungsmetriken: Um die Wirksamkeit Ihres zweistufigen Retrieval- und Reranking-Ansatzes zu bewerten, müssen Sie geeignete Bewertungsmetriken definieren. Dazu können herkömmliche Metriken zum Informationsabruf wie Präzision, Rückruf und mittlerer reziproker Rang (MRR) sowie aufgabenspezifische Metriken gehören, die auf Ihren Anwendungsfall zugeschnitten sind.

Fazit

Retrieval Augmented Generation (RAG) hat sich zu einer leistungsstarken Technik zur Verbesserung der Fähigkeiten großer Sprachmodelle durch Nutzung externer Informationsquellen entwickelt. Allerdings haben herkömmliche Abrufmethoden oft Schwierigkeiten, die relevantesten Dokumente zu identifizieren, was zu einer suboptimalen Leistung führt.

Die zweistufige Rückholung mit Rerankern bietet eine überzeugende Lösung für diese Herausforderung. Durch die Kombination einer anfänglichen schnellen Abrufphase mit einem ausgefeilteren Reranking-Modell kann dieser Ansatz die Genauigkeit und Relevanz der abgerufenen Dokumente erheblich verbessern, was letztendlich zu qualitativ hochwertigeren generierten Antworten aus dem Sprachmodell führt.

Ich habe die letzten fünf Jahre damit verbracht, in die faszinierende Welt des maschinellen Lernens und des Deep Learning einzutauchen. Meine Leidenschaft und mein Fachwissen haben dazu geführt, dass ich an über 50 verschiedenen Software-Engineering-Projekten mitgewirkt habe, mit besonderem Schwerpunkt auf KI/ML. Meine anhaltende Neugier hat mich auch zur Verarbeitung natürlicher Sprache geführt, einem Bereich, den ich gerne weiter erforschen möchte.