AGI og fremtidens AI
Kraften til Rerankere og To-trinnsøkning for Retrieval Augmented Generation
Implementering av To-trinnsøkning med Rerankere
Nå som vi har en forståelse av prinsippene bak to-trinnsøkning og rerankere, la oss utforske deres praktiske implementering innenfor sammenhengen av et RAG-system. Vi vil utnytte populære biblioteker og rammer for å demonstrere integreringen av disse teknikkene.
Oppsett av Miljø
Før vi dykker ned i koden, la oss sette opp vår utviklingsmiljø. Vi vil bruke Python og flere populære NLP-biblioteker, inkludert Hugging Face Transformers, Sentence Transformers og LanceDB.
# Installer nødvendige biblioteker !pip install datasets huggingface_hub sentence_transformers lancedb
Dataforberedelse
Til demonstrasjon, vil vi bruke “ai-arxiv-chunked”-datasettet fra Hugging Face Datasets, som inneholder over 400 ArXiv-papirer om maskinlæring, naturlig språkbehandling og store språkmodeller.
from datasets import load_dataset <p>dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&gt;
Deretter vil vi forberede dataene og dele dem inn i mindre deler for å lette effektiv gjenfinning og prosessering.
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>
Til det initial gjenfinningsstadiet, vil vi bruke en Sentence Transformer-modell til å kode våre dokumenter og spørsmål til tette vektorrepresentasjoner, og deretter utføre approksimert nærmeste nabo-søk ved hjelp av en vektor database som LanceDB.
from sentence_transformers import SentenceTransformer from lancedb import lancedb <p># Last inn Sentence Transformer-modell model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Opprett LanceDB-vektorlagring db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexer dokumenter 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># Last inn Sentence Transformer-modell model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Opprett LanceDB-vektorlagring db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexer dokumenter for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
Med dokumentene indexert, kan vi utføre det initial gjenfinningsstadiet ved å finne de nærmeste naboene til en gitt spørringsvektor.
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
Etter det initial gjenfinningsstadiet, vil vi bruke en reranking-modell til å omprioritere de hentede dokumentene basert på deres relevans til spørringen. I dette eksemplet vil vi bruke ColBERT-reranker, en rask og nøyaktig transformer-basert modell spesifikt designet for dokument-rangering.
from lancedb.rerankers import ColbertReranker reranker = ColbertReranker() <p># Reranker initial dokumenter reranked_docs = reranker.rerank(query, initial_docs)
Listen reranked_docs inneholder nå dokumentene omprioritert basert på deres relevans til spørringen, bestemt av ColBERT-reranker.
Utvidelse og Generering
Med de rerankede og relevante dokumentene i hånden, kan vi gå videre til utvidelses- og genereringsstadiene av RAG-pipeline. Vi vil bruke en språkmodell fra Hugging Face Transformers-biblioteket til å generere det endelige svaret.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM <p>tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># Utvider spørring med rerankede dokumenter augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># Generer svar fra 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)














