AGI och framtidens AI
Kraften i Rerankers och Tvåstegsåtervinning för Retrieval Augmented Generation
Implementering av Tvåstegsåtervinning med Rerankers
Nu när vi har en förståelse för principerna bakom tvåstegsåtervinning och rerankers, låt oss utforska deras praktiska implementering inom ramen för ett RAG-system. Vi kommer att utnyttja populära bibliotek och ramverk för att demonstrera integrationen av dessa tekniker.
Inställning av Miljön
Innan vi dyker in i koden, låt oss ställa in vår utvecklingsmiljö. Vi kommer att använda Python och flera populära NLP-bibliotek, inklusive Hugging Face Transformers, Sentence Transformers och LanceDB.
# Installera nödvändiga bibliotek !pip install datasets huggingface_hub sentence_transformers lancedb
Dataförberedelse
För demonstrationsändamål kommer vi att använda “ai-arxiv-chunked”-databasen från Hugging Face Datasets, som innehåller över 400 ArXiv-artiklar om maskinlärning, naturlig språkbehandling och stora språkmodeller.
from datasets import load_dataset <p>dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&gt;
Nästa steg är att förbereda data och dela upp den i mindre delar för att underlätta effektiv återvinning och bearbetning.
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>
För det initiala återvinningssteget kommer vi att använda en Sentence Transformer-modell för att koda våra dokument och förfrågningar till täta vektorrepresentationer, och sedan utföra approximativ närmaste granne-sökning med hjälp av en vektordatabas som LanceDB.
from sentence_transformers import SentenceTransformer from lancedb import lancedb <p># Ladda Sentence Transformer-modell model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Skapa LanceDB-vektordatabas db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexera dokument 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># Ladda Sentence Transformer-modell model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Skapa LanceDB-vektordatabas db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexera dokument for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
Med våra dokument indexerade kan vi utföra det initiala återvinningen genom att hitta de närmaste grannarna till en given förfrågningsvektor.
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)
Reranking
Efter det initiala återvinningen kommer vi att använda en rerankningsmodell för att omordna de återvunna dokumenten baserat på deras relevans för förfrågan. I det här exemplet kommer vi att använda ColBERT-rerankern, en snabb och exakt transformer-baserad modell som är specifikt utformad för dokument-rangordning.
from lancedb.rerankers import ColbertReranker reranker = ColbertReranker() <p># Rerank initiala dokument reranked_docs = reranker.rerank(query, initial_docs)
Listan reranked_docs innehåller nu dokumenten omordnade baserat på deras relevans för förfrågan, som bestäms av ColBERT-rerankern.
Tillägg och Generering
Med de omordnade och relevanta dokumenten i handen kan vi fortsätta till tilläggs- och genereringsstegen i RAG-pipelinen. Vi kommer att använda en språkmodell från Hugging Face Transformers-biblioteket för att generera det slutliga svaret.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM <p>tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># Tillägg förfrågan med omordnade dokument augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># Generera svar från språkmodell 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)














