مصنوعی جنرل انٹیلی جنس
رینکرز کی طاقت اور دوبارہ حاصل کرنے کے لئے دو مرحلے کی بازیافت بڑھا ہوا نسل
یہ کوڈ کا ٹکڑا ظاہر کرتا ہے کہ jina-colbert-v1-en ماڈل کو کنفیگر کرنے اور دستاویزات کے مجموعے کو انڈیکس کرنے کے لیے استعمال کرنے کا طریقہ، طویل سیاق و سباق کو مؤثر طریقے سے ہینڈل کرنے کی اپنی صلاحیت کا فائدہ اٹھاتے ہوئے۔
Rerankers کے ساتھ دو مرحلے کی بازیافت کو نافذ کرنا
اب جب کہ ہمیں دو مراحل کی بازیافت اور دوبارہ رینکرز کے پیچھے اصولوں کی سمجھ آگئی ہے، آئیے RAG سسٹم کے تناظر میں ان کے عملی نفاذ کو تلاش کریں۔ ہم ان تکنیکوں کے انضمام کو ظاہر کرنے کے لیے مقبول لائبریریوں اور فریم ورک کا فائدہ اٹھائیں گے۔
ماحولیات کو ترتیب دینا
اس سے پہلے کہ ہم کوڈ میں ڈوبیں، آئیے اپنے ترقیاتی ماحول کو ترتیب دیں۔ ہم Python اور کئی مشہور NLP لائبریریوں کا استعمال کریں گے، بشمول Hugging Face Transformers، Sentence Transformers، اور LanceDB۔
# Install required libraries !pip install datasets huggingface_hub sentence_transformers lancedb
ڈیٹا کی تیاری
مظاہرے کے مقاصد کے لیے، ہم Hugging Face Datasets سے "ai-arxiv-chunked" ڈیٹاسیٹ استعمال کریں گے، جس میں مشین لرننگ، قدرتی لینگویج پروسیسنگ، اور بڑے لینگویج ماڈلز پر 400 سے زیادہ ArXiv پیپرز شامل ہیں۔
from datasets import load_dataset dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train") <pre>
اگلا، ہم ڈیٹا کو پہلے سے پروسیس کریں گے اور اسے چھوٹے حصوں میں تقسیم کریں گے تاکہ موثر بازیافت اور پروسیسنگ میں آسانی ہو۔
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") 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 chunked_data = [] for doc in dataset: text = doc["chunk"] chunked_texts = chunk_text(text) chunked_data.extend(chunked_texts)
ابتدائی بازیافت کے مرحلے کے لیے، ہم اپنے دستاویزات اور سوالات کو گھنے ویکٹر کی نمائندگی میں انکوڈ کرنے کے لیے ایک Sentence Transformer ماڈل کا استعمال کریں گے، اور پھر LanceDB جیسے ویکٹر ڈیٹا بیس کا استعمال کرتے ہوئے قریب ترین پڑوسی تلاش کریں گے۔
from sentence_transformers import SentenceTransformer from lancedb import lancedb # Load Sentence Transformer model model = SentenceTransformer('all-MiniLM-L6-v2') # Create LanceDB vector store db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension()) # Index documents for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text) from sentence_transformers import SentenceTransformer from lancedb import lancedb # Load Sentence Transformer model model = SentenceTransformer('all-MiniLM-L6-v2') # Create LanceDB vector store db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension()) # Index documents for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
ہماری دستاویزات کی ترتیب کے ساتھ، ہم دیے گئے استفسار ویکٹر کے قریب ترین پڑوسیوں کو تلاش کرکے ابتدائی بازیافت انجام دے سکتے ہیں۔
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") 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 chunked_data = [] for doc in dataset: text = doc["chunk"] chunked_texts = chunk_text(text) chunked_data.extend(chunked_texts)
رینکنگ
ابتدائی بازیافت کے بعد، ہم بازیافت شدہ دستاویزات کو استفسار سے ان کی مطابقت کی بنیاد پر دوبارہ ترتیب دینے کے لیے ایک رینکنگ ماڈل استعمال کریں گے۔ اس مثال میں، ہم ColBERT reranker استعمال کریں گے، ایک تیز اور درست ٹرانسفارمر پر مبنی ماڈل جو خاص طور پر دستاویز کی درجہ بندی کے لیے ڈیزائن کیا گیا ہے۔
from lancedb.rerankers import ColbertReranker reranker = ColbertReranker() # Rerank initial documents reranked_docs = reranker.rerank(query, initial_docs)
۔ reranked_docs
فہرست اب ان دستاویزات پر مشتمل ہے جو استفسار سے ان کی مطابقت کی بنیاد پر دوبارہ ترتیب دی گئی ہیں، جیسا کہ ColBERT ری رینکر کے ذریعے طے کیا گیا ہے۔
اضافہ اور نسل
دوبارہ ترتیب دیے گئے اور متعلقہ دستاویزات ہاتھ میں لے کر، ہم RAG پائپ لائن کے بڑھانے اور جنریشن کے مراحل کی طرف بڑھ سکتے ہیں۔ حتمی ردعمل پیدا کرنے کے لیے ہم Hugging Face Transformers لائبریری سے لینگویج ماڈل استعمال کریں گے۔
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") # Augment query with reranked documents augmented_query = query + " " + " ".join(reranked_docs[:3]) # Generate response from language model 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) print(response)