AGI a budoucnost AI
Síla Rerankingu a Dvoufázového Vyhledávání pro Retrieval Augmented Generation
Implementace Dvoufázového Vyhledávání s Rerankery
Teď, když máme pochopení principů dvoufázového vyhledávání a rerankingu, prozkoumejme jejich praktickou implementaci v kontextu systému RAG. Budeme využívat populární knihovny a rámce, aby demonstrujeme integraci těchto technik.
Nastavení Prostředí
Než se ponoříme do kódu, nastavme naše vývojové prostředí. Budeme používat Python a několik populárních knihoven NLP, včetně Hugging Face Transformers, Sentence Transformers a LanceDB.
# Instalace požadovaných knihoven !pip install datasets huggingface_hub sentence_transformers lancedb
Příprava Dat
Pro demonstrační účely budeme používat dataset “ai-arxiv-chunked” z Hugging Face Datasets, který obsahuje přes 400 článků z ArXiv o strojovém učení, zpracování přirozeného jazyka a velkých jazykových modelech.
from datasets import load_dataset <p>dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&gt;
Další krok bude předzpracování dat a rozdělení na menší části, aby se usnadnilo efektivní vyhledávání a zpracování.
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>
Pro počáteční fázi vyhledávání budeme používat model Sentence Transformer pro kódování našich dokumentů a dotazů do hustých vektorových reprezentací a poté provedeme aproximované vyhledávání nejbližších sousedů pomocí vektorové databáze, jako je LanceDB.
from sentence_transformers import SentenceTransformer from lancedb import lancedb <p># Načtení modelu Sentence Transformer model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Vytvoření vektorové databáze LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexování 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># Načtení modelu Sentence Transformer model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Vytvoření vektorové databáze LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexování dokumentů for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
S našimi dokumenty indexovanými, můžeme provést počáteční vyhledávání najít nejbližší sousedy k danému dotazu.
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
Po počátečním vyhledávání budeme používat model rerankingu, aby dokumenty byly seřazeny podle jejich relevance k dotazu. V tomto příkladu budeme používat model ColBERT rerankingu, rychlý a přesný transformátorový model speciálně navržen pro řazení dokumentů.
from lancedb.rerankers import ColbertReranker reranker = ColbertReranker() <p># Reranking počátečních dokumentů reranked_docs = reranker.rerank(query, initial_docs)
Seznam reranked_docs nyní obsahuje dokumenty seřazeny podle jejich relevance k dotazu, jak určeno modelem ColBERT rerankingu.
Doplnění a Generování
S relevantními dokumenty v ruce, můžeme pokračovat ve fázích doplnění a generování pipeline RAG. Budeme používat jazykový model z knihovny Hugging Face Transformers pro generování konečné odpovědi.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM <p>tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># Doplnění původního dotazu s rerankovanými dokumenty augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># Generování odpovědi z jazykového modelu 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)














