AGI
Kracht van Rerankers en Twee-Stappen Retrieval voor Retrieval Augmented Generation
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("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&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("bert-base-uncased")</p> <p>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</p> <p>chunked_data = [] for doc in dataset: text = doc["chunk"] 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('all-MiniLM-L6-v2')</p> <p># Maak LanceDB-vectoropslag db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexeer documenten for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)</p> <p>from sentence_transformers import SentenceTransformer from lancedb import lancedb</p> <p># Laad Sentence Transformer-model model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Maak LanceDB-vectoropslag db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexeer documenten for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', 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("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># Aanvullen van de oorspronkelijke vraag met gererangschikte documenten augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># Genereren van antwoord vanuit taalmodel 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)</p> print(response)














