إنتقل إلى المحتوى الرئيسي

الفصل 3: إعادة الترتيب والتصفية

ما هو Reranking؟​

يستخدم reranking نموذجًا أقوى لإعادة تقييم نتائج الاسترجاع الأولية:

إعادة الترتيب بـ Cross-Encoder​

تقيّم نماذج cross-encoder أزواج الاستعلام-الوثيقة مباشرة:

from sentence_transformers import CrossEncoder

# Load reranker
reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')

# Initial retrieval
candidates = retriever.get_relevant_documents(query)

# Score pairs
pairs = [(query, doc.page_content) for doc in candidates]
scores = reranker.predict(pairs)

# Sort by reranked scores
reranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)

Cohere Rerank​

واجهة API جاهزة للإنتاج لإعادة الترتيب:

import cohere

co = cohere.Client("your-api-key")

# Rerank documents
results = co.rerank(
model="rerank-english-v3.0",
query=query,
documents=[doc.page_content for doc in candidates],
top_n=5
)

# Get reranked documents
for result in results.results:
print(f"Score: {result.relevance_score}, Index: {result.index}")

تصفية Metadata​

صفِّ قبل الاسترجاع أو بعده:

# Pre-retrieval filtering (more efficient)
retriever = vectorstore.as_retriever(
search_kwargs={
"k": 10,
"filter": {
"department": "HR",
"year": {"$gte": 2023}
}
}
)

# Post-retrieval filtering
results = retriever.get_relevant_documents(query)
filtered = [doc for doc in results if doc.metadata.get('verified')]

خط استرجاع كامل​

def advanced_retrieve(query, vectorstore, reranker, k=5):
# Step 1: Initial retrieval (more candidates)
candidates = vectorstore.similarity_search(query, k=50)

# Step 2: Rerank
pairs = [(query, doc.page_content) for doc in candidates]
scores = reranker.predict(pairs)

# Step 3: Sort and return top k
ranked = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)
return [doc for doc, score in ranked[:k]]

مقارنة​

الطريقةزمن الاستجابةالجودةالتكلفة
بلا rerankingمنخفضجيدةمجاني
Cross-encoderمتوسطأفضلاستضافة ذاتية
Cohere Rerankمتوسطالأفضلتكلفة API

الخطوات التالية​

اختبر معرفتك عبر اختبار الوحدة 5!