AGI dan AI masa depan
Kekuatan Rerankers dan Pencarian Dua Tahap untuk Generasi yang Ditingkatkan dengan Pencarian
Mengimplementasikan Pencarian Dua Tahap dengan Rerankers
Sekarang bahwa kita telah memahami prinsip-prinsip di balik pencarian dua tahap dan rerankers, mari kita jelajahi implementasi praktisnya dalam konteks sistem RAG. Kami akan menggunakan perpustakaan dan kerangka kerja populer untuk mendemonstrasikan integrasi teknik-teknik ini.
Mengatur Lingkungan
Sebelum kita memulai, mari kita atur lingkungan pengembangan kita. Kami akan menggunakan Python dan beberapa perpustakaan NLP populer, termasuk Hugging Face Transformers, Sentence Transformers, dan LanceDB.
# Instal perpustakaan yang diperlukan !pip install datasets huggingface_hub sentence_transformers lancedb
Persiapan Data
Untuk tujuan demonstrasi, kita akan menggunakan dataset “ai-arxiv-chunked” dari Hugging Face Datasets, yang berisi lebih dari 400 makalah ArXiv tentang pembelajaran mesin, pemrosesan bahasa alami, dan model bahasa besar.
from datasets import load_dataset <p>dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&gt;
Kemudian, kita akan memproses data dan membaginya menjadi potongan-potongan yang lebih kecil untuk memfasilitasi pengambilan dan pengolahan yang efisien.
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>
Untuk tahap pengambilan awal, kita akan menggunakan model Sentence Transformer untuk mengkodekan dokumen dan pertanyaan ke dalam representasi vektor yang padat, kemudian melakukan pencarian tetangga terdekat secara approximatif menggunakan basis data vektor seperti LanceDB.
from sentence_transformers import SentenceTransformer from lancedb import lancedb <p># Muat model Sentence Transformer model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Buat toko vektor LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indeks dokumen 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># Muat model Sentence Transformer model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Buat toko vektor LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indeks dokumen for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
Dengan dokumen yang diindeks, kita dapat melakukan pengambilan awal dengan menemukan tetangga terdekat dari vektor pertanyaan yang diberikan.
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
Setelah pengambilan awal, kita akan menggunakan model reranking untuk mengatur ulang dokumen yang diambil berdasarkan relevansi mereka dengan pertanyaan. Dalam contoh ini, kita akan menggunakan model reranking ColBERT, sebuah model transformer berbasis yang cepat dan akurat yang dirancang khusus untuk peringkat dokumen.
from lancedb.rerankers import ColbertReranker reranker = ColbertReranker() <p># Rerank dokumen awal reranked_docs = reranker.rerank(query, initial_docs)
Daftar reranked_docs sekarang berisi dokumen yang diatur ulang berdasarkan relevansi mereka dengan pertanyaan, seperti yang ditentukan oleh model reranking ColBERT.
Peningkatan dan Generasi
Dengan dokumen yang diatur ulang dan relevan di tangan, kita dapat melanjutkan ke tahap peningkatan dan generasi dari pipa RAG. Kita akan menggunakan model bahasa dari perpustakaan Hugging Face Transformers untuk menghasilkan respons akhir.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM <p>tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># Tingkatkan pertanyaan dengan dokumen yang diatur ulang augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># Hasilkan respons dari model bahasa 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)














