الذكاء العام الاصطناعي
قوة عمليات إعادة الترتيب والاسترجاع على مرحلتين للجيل المعزز للاسترجاع

يوضح مقتطف التعليمات البرمجية هذا كيفية تكوين نموذج jina-colbert-v1-en واستخدامه لفهرسة مجموعة من المستندات، مما يزيد من قدرته على التعامل مع السياقات الطويلة بكفاءة.
تنفيذ الاسترجاع على مرحلتين مع عمليات إعادة الترتيب
الآن بعد أن أصبح لدينا فهم للمبادئ الكامنة وراء الاسترجاع على مرحلتين وإعادة الترتيب، دعونا نستكشف تنفيذها العملي في سياق نظام RAG. سنستفيد من المكتبات والأطر الشائعة لإظهار تكامل هذه التقنيات.
تهيئة البيئة
قبل أن نتعمق في الكود، فلنقم بإعداد بيئة التطوير الخاصة بنا. سنستخدم Python والعديد من مكتبات البرمجة اللغوية العصبية الشهيرة، بما في ذلك Hugging Face Transformers، وSentence Transformers، وLanceDB.
# Install required libraries !pip install datasets huggingface_hub sentence_transformers lancedb
تحضير البيانات
لأغراض العرض التوضيحي، سنستخدم مجموعة البيانات "ai-arxiv-chunked" من Hugging Face Datasets، والتي تحتوي على أكثر من 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، وهو نموذج سريع ودقيق يعتمد على المحولات ومصمم خصيصًا لتصنيف المستندات.
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)