LLM كحكم في استرجاع RAG: اختيار المرشح المناسب مع الأسباب
استكشف كيفية استخدام نموذج اللغة الكبير (LLM) كمحكم ذكي لاختيار أفضل مستند من مرشحات استرجاع RAG، مما يعزز الدقة من خلال الاستدلال السياقي ونصائح تنفيذية عملية.
الوسوم
ملخص سريع
استكشف كيفية استخدام نموذج اللغة الكبير (LLM) كمحكم ذكي لاختيار أفضل مستند من مرشحات استرجاع RAG، مما يعزز الدقة من خلال الاستدلال السياقي ونصائح تنفيذية عملية.
LLM كحكم في استرجاع RAG: اختيار المرشح المناسب مع الأسباب
أصبحت تقنية التوليد المعزز بالاسترجاع (RAG) حجر الزاوية في تطبيقات الذكاء الاصطناعي الحديثة، حيث تمكن نماذج اللغة الكبيرة (LLMs) من تأسيس استجاباتها على معرفة خارجية. ومع ذلك، لا يزال هناك تحدٍ مستمر: حتى مع الاسترجاع عالي الجودة، قد يتم إرجاع مستندات مرشحة متعددة، وليست جميعها ذات صلة متساوية. غالبًا ما تفشل طرق الترتيب التقليدية مثل تشابه جيب التمام أو BM25 في التقاط الصلة الدقيقة - مثل السياق الزمني، أو توافق النية، أو الاستدلال الخاص بالمجال.
هنا يأتي دور نهج **LLM كحكم**: بدلاً من الاعتماد فقط على تشابه التضمين، نستخدم استدعاء LLM ثانويًا لتقييم وترتيب المرشحين المسترجعين مع استدلال صريح. هذه التقنية، التي تم استكشافها في المناقشات الصناعية الأخيرة (على سبيل المثال، في *Towards Data Science*)، تقدم خطوة استرجاع أكثر ذكاءً ووعيًا بالسياق. في هذه المقالة، سنستعرض تنفيذًا عمليًا، بدءًا من التثبيت وصولاً إلى الاستخدام، موضحين كيفية بناء خط أنابيب RAG حيث يحكم LLM على المستندات المرشحة ويقدم أسبابًا لاختياراته.
لماذا استخدام LLM كحكم؟
ترتيب الاسترجاع التقليدي له حدود:
- **التشابه الدلالي** قد يفوت الإشارات العملية أو السياقية (على سبيل المثال، مستند من 2022 مقابل 2024 حول نفس الموضوع).
- **الطرق القائمة على الكلمات المفتاحية** تفشل عندما تكون الاستعلامات مجردة أو تتطلب استدلالًا متعدد الخطوات.
- **لا يوجد تفسير** لسبب تفضيل مستند على آخر.
استخدام LLM كحكم يعالج هذه المشكلات:
- يمكن لـ LLM التفكير في **الصلة الزمنية**، **الموثوقية**، و**توافق النية**.
- يخرج **أسبابًا قابلة للقراءة البشرية** لدرجة كل مرشح، مما يتيح التصحيح والثقة.
- يمكنه التعامل مع **الاستعلامات المعقدة** (على سبيل المثال، "ابحث عن أحدث تحديث للسياسة حول سلامة الذكاء الاصطناعي ليس من مدونة بائع").
هذا النهج مكمل للبحث المتجه: ما زلت تسترجع أفضل المرشحين K عبر تشابه التضمين، ثم تقوم بالتحسين باستدلال LLM. المفتاح هو أن LLM لا يعيد التوليد - إنه *يحكم*.
المتطلبات
لمتابعة هذا البرنامج التعليمي، ستحتاج إلى:
- **Python 3.10+** مثبتة على نظامك.
- **مفتاح OpenAI API** (أو مزود LLM آخر) مع الوصول إلى GPT-4 أو GPT-4o-mini (للكفاءة من حيث التكلفة). بدلاً من ذلك، يمكنك استخدام نموذج محلي عبر Ollama (على سبيل المثال، `llama3` أو `mistral`).
- **إلمام أساسي** بـ Python، البيئات الافتراضية، وأدوات سطر الأوامر.
- **ذاكرة وصول عشوائي 4GB على الأقل** إذا كنت تستخدم LLM محليًا؛ API السحابي يتطلب اتصالاً بالإنترنت.
- **pip** (مدير حزم Python).
سنستخدم مكتبات Python التالية:
- `langchain` و `langchain-community` لتنسيق RAG.
- `chromadb` للتخزين المتجه.
- `openai` (أو `ollama`) لاستدعاءات LLM.
- `pandas` لمعالجة البيانات.
التثبيت خطوة بخطوة
1. إعداد بيئة Python افتراضية
أولاً، قم بإنشاء بيئة معزولة لتجنب تعارض التبعيات.
python3 -m venv rag-arbiter
source rag-arbiter/bin/activate # على Windows: rag-arbiter\Scripts\activate2. تثبيت الحزم المطلوبة
قم بتثبيت المكتبات الأساسية. سنستخدم `langchain` لواجهة الاسترجاع و LLM المعيارية.
pip install langchain langchain-community chromadb openai pandas tiktokenإذا كنت تخطط لاستخدام نموذج محلي عبر Ollama:
pip install langchain-ollama3. إعداد مفاتيح API (إذا كنت تستخدم OpenAI)
قم بتصدير مفتاح OpenAI API الخاص بك كمتغير بيئة (استبدل `your-key-here` بمفتاحك الفعلي).
export OPENAI_API_KEY="your-key-here"على Windows (PowerShell):
$env:OPENAI_API_KEY="your-key-here"4. (اختياري) تثبيت وبدء Ollama للنماذج المحلية
إذا كنت تفضل الاستدلال المحلي، قم بتثبيت Ollama من [ollama.ai](https://ollama.ai) واسحب نموذجًا.
# بعد تثبيت Ollama
ollama pull llama3.1بناء خط أنابيب الحكم
يتكون خط الأنابيب لدينا من ثلاث مراحل: 1. **إدخال المستندات** في مخزن متجه. 2. **استرجاع أفضل المرشحين K** باستخدام تشابه التضمين. 3. **حكم LLM** يسجل كل مرشح مع الأسباب، ثم يعيد الترتيب.
الخطوة 1: إدخال مستندات نموذجية
قم بإنشاء سكريبت Python `ingest.py` لتحميل مجموعة صغيرة من النصوص. سنستخدم مستندات سياسة ذكاء اصطناعي خيالية.
# ingest.py
import pandas as pd
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.schema import Document
# مستندات نموذجية (في الممارسة العملية، قم بتحميلها من ملفات)
documents = [
Document(page_content="في عام 2024، تم الانتهاء من قانون الذكاء الاصطناعي للاتحاد الأوروبي، الذي يتطلب الشفافية للأنظمة عالية المخاطر.", metadata={"source": "eu_ai_act.txt", "date": "2024-06-01"}),
Document(page_content="نشرت Google إرشادات جديدة لتطوير الذكاء الاصطناعي المسؤول في عام 2023، مع التركيز على العدالة.", metadata={"source": "google_ai_blog.txt", "date": "2023-03-15"}),
Document(page_content="معيار الذكاء الاصطناعي المسؤول من Microsoft (2022) يحدد مبادئ الإشراف البشري.", metadata={"source": "microsoft_ai_blog.txt", "date": "2022-11-01"}),
Document(page_content="أعلنت OpenAI عن GPT-4o-mini في عام 2024، وهو نموذج فعال من حيث التكلفة للمطورين.", metadata={"source": "openai_news.txt", "date": "2024-07-01"}),
Document(page_content="الأمر التنفيذي الأمريكي لعام 2023 بشأن سلامة الذكاء الاصطناعي يفرض الإبلاغ عن النماذج الكبيرة.", metadata={"source": "us_eo.txt", "date": "2023-10-30"}),
]
# تهيئة التضمينات (OpenAI)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# إنشاء مخزن متجه
vectorstore = Chroma.from_documents(
documents,
embeddings,
persist_directory="./chroma_db"
)
print("تم إدخال المستندات بنجاح.")قم بتشغيل السكريبت:
python ingest.pyالخطوة 2: استرجاع المرشحين
الآن، قم بإنشاء دالة استرجاع تحصل على أفضل المرشحين K.
# retrieve.py
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
def retrieve_candidates(query: str, k: int = 5):
"""إرجاع أفضل المستندات k مع البيانات الوصفية."""
results = vectorstore.similarity_search_with_score(query, k=k)
# تنسيق للحكم
candidates = []
for doc, score in results:
candidates.append({
"content": doc.page_content,
"metadata": doc.metadata,
"similarity_score": round(score, 4)
})
return candidatesالخطوة 3: دالة حكم LLM
جوهر نهجنا: يقوم LLM بتقييم كل مرشح وإرجاع درجة (1-10) مع سبب.
# arbiter.py
from langchain_openai import ChatOpenAI
# تهيئة LLM (استخدم GPT-4o-mini لكفاءة التكلفة)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
def arbiter_score(query: str, candidate: dict) -> dict:
"""اطلب من LLM تقييم مستند مرشح واحد."""
prompt = f"""أنت حكم استرجاع. قم بتقييم صلة المستند التالي باستعلام المستخدم.
الاستعلام: {query}
المستند: {candidate['content']}
البيانات الوصفية (المصدر، التاريخ): {candidate['metadata']}
قدم استجابة JSON تحتوي على:
- "score": عدد صحيح 1-10 (10 = ذو صلة تامة)
- "reason": شرح موجز (بحد أقصى جملتين)
الاستجابة:"""
response = llm.invoke(prompt)
# تحليل الاستجابة (مبسط: افتراض JSON صالح)
import json
try:
result = json.loads(response.content)
except:
result = {"score": 5, "reason": "خطأ في التحليل"}
return resultالخطوة 4: خط أنابيب كامل مع إعادة الترتيب
اجمع الاسترجاع والتحكيم في دالة واحدة.
# pipeline.py
from retrieve import retrieve_candidates
from arbiter import arbiter_score
def rag_with_arbiter(query: str, k: int = 5):
"""استرجاع، تحكيم، وإعادة ترتيب المرشحين."""
# الخطوة 1: الاسترجاع
candidates = retrieve_candidates(query, k=k)
# الخطوة 2: تحكيم كل مرشح
scored_candidates = []
for cand in candidates:
arbiter_result = arbiter_score(query, cand)
cand["llm_score"] = arbiter_result["score"]
cand["reason"] = arbiter_result["reason"]
scored_candidates.append(cand)
# الخطوة 3: إعادة الترتيب حسب درجة LLM (تنازليًا)
scored_candidates.sort(key=lambda x: x["llm_score"], reverse=True)
return scored_candidatesأمثلة على الاستخدام
مثال 1: استعلام بسيط
قم بتشغيل استعلام لرؤية الحكم في العمل.
# example1.py
from pipeline import rag_with_arbiter
query = "ما هي أحدث لوائح الذكاء الاصطناعي في عام 2024؟"
results = rag_with_arbiter(query, k=3)
for i, r in enumerate(results, 1):
print(f"الترتيب {i}: الدرجة {r['llm_score']}/10")
print(f" المستند: {r['content'][:80]}...")
print(f" السبب: {r['reason']}")
print(f" المصدر: {r['metadata']['source']}")
print()**المخرجات المتوقعة (مثال):**
الترتيب 1: الدرجة 9/10
المستند: في عام 2024، تم الانتهاء من قانون الذكاء الاصطناعي للاتحاد الأوروبي...
السبب: يذكر مباشرة لوائح 2024؛ ذو صلة عالية.
المصدر: eu_ai_act.txt
الترتيب 2: الدرجة 7/10
المستند: الأمر التنفيذي الأمريكي لعام 2023 بشأن سلامة الذكاء الاصطناعي...
السبب: ذو صلة ولكن من 2023، ليس صراحةً 2024.
المصدر: us_eo.txt
الترتيب 3: الدرجة 4/10
المستند: نشرت Google إرشادات جديدة لـ...
السبب: يركز على العدالة، وليس اللوائح؛ أقدم.
المصدر: google_ai_blog.txtمثال 2: استعلام معقد مع استدلال زمني
# example2.py
from pipeline import rag_with_arbiter
query = "ابحث عن أحدث إعلان عن نموذج فعال من حيث التكلفة من OpenAI"
results = rag_with_arbiter(query, k=5)
for r in results:
print(f"الدرجة: {r['llm_score']} | {r['metadata']['source']} | السبب: {r['reason']}")**المخرجات المتوقعة:**
الدرجة: 10 | openai_news.txt | يطابق مباشرة: GPT-4o-mini هو نموذج فعال من حيث التكلفة من OpenAI في 2024.
الدرجة: 3 | eu_ai_act.txt | ليس عن OpenAI أو إعلانات النماذج.
الدرجة: 2 | microsoft_ai_blog.txt | غير ذي صلة: Microsoft، وليس OpenAI.
...مثال 3: التصحيح باستخدام الأسباب
تمكنك الأسباب من فهم *لماذا* تم ترتيب مستند منخفضًا.
# debug.py
results = rag_with_arbiter("إرشادات سلامة الذكاء الاصطناعي من الحكومة الأمريكية", k=4)
for r in results:
if r["llm_score"] < 5:
print(f"درجة منخفضة لـ {r['metadata']['source']}: {r['reason']}")**المخرجات:**
درجة منخفضة لـ openai_news.txt: يناقش نموذجًا، وليس إرشادات سلامة أو حكومة.
درجة منخفضة لـ eu_ai_act.txt: لائحة الاتحاد الأوروبي، وليس الحكومة الأمريكية.التكوين المتقدم
استخدام النماذج المحلية (Ollama)
استبدل OpenAI بـ LLM محلي لأسباب تتعلق بالخصوصية أو التكلفة.
# arbiter_ollama.py
from langchain_ollama import ChatOllama
llm = ChatOllama(model="llama3.1", temperature=0)
# نفس دالة arbiter_score كما كانت سابقًا، فقط باستخدام هذا llmالتسجيل الدفعي للكفاءة
بالنسبة للعديد من المرشحين، تقلل المعالجة الدفعية من زمن الاستجابة.
# batch_arbiter.py
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
prompt = ChatPromptTemplate.from_template(
"بالنظر إلى الاستعلام: {query}\nقم بتقييم كل مستند (1-10) مع سبب.\nالمستندات:\n{docs}"
)
def batch_arbiter(query: str, candidates: list):
docs_text = "\n---\n".join([f"المستند {i+1}: {c['content']}" for i, c in enumerate(candidates)])
response = llm.invoke(prompt.format(query=query, docs=docs_text))
# تحليل المخرجات المنظمة (التنفيذ يعتمد على تصميم موجهك)
return response.contentالخاتمة
استخدام LLM كحكم في استرجاع RAG يحول خطوة ترتيب بسيطة إلى عملية واعية بالاستدلال. من خلال مطالبة LLM بتقييم المرشحين بأسباب صريحة، تحصل على:
- **صلة أعلى**: يلتقط LLM الفروق الدقيقة مثل السياق الزمني والنية.
- **الشفافية**: كل ترتيب يأتي مع شرح قابل للقراءة البشرية.
- **المرونة**: يمكنك تكييف موجه الحكم مع معايير خاصة بالمجال (على سبيل المثال، "فضل المصادر التي تمت مراجعتها من قبل الأقران").
المقايضة هي زيادة زمن الاستجابة والتكلفة - كل استعلام يستدعي استدعاء LLM إضافيًا. ومع ذلك، بالنسبة للتطبيقات التي تكون فيها جودة الاسترجاع حاسمة (على سبيل المثال، البحث القانوني، الأسئلة الطبية، أو قواعد المعرفة المؤسسية)، تفوق الفائدة التكلفة الإضافية.
للبدء، قم باستنساخ مقتطفات الكود أعلاه وجربها مع مستنداتك الخاصة. مع استمرار تحسن نماذج LLM (كما رأينا في الإعلانات الأخيرة من OpenAI و Google و Microsoft)، سيصبح نهج الحكم أكثر قوة - وأكثر أهمية لبناء أنظمة ذكاء اصطناعي موثوقة وواعية بالسياق.
المصادر
أسئلة شائعة
عن ماذا يتحدث هذا المقال؟
يتناول هذا المقال موضوع "LLM كحكم في استرجاع RAG: اختيار المرشح المناسب مع الأسباب" ضمن تصنيف أدوات الذكاء الاصطناعي. استكشف كيفية استخدام نموذج اللغة الكبير (LLM) كمحكم ذكي لاختيار أفضل مستند من مرشحات استرجاع RAG، مما يعزز الدقة من خلال الاستدلال السياقي ونصائح تنفيذية عملية.
لمن يفيد هذا المقال؟
يفيد القراء المهتمين بفهم أدوات وتقنيات الذكاء الاصطناعي بطريقة عملية وواضحة.
ما الخطوة التالية؟
اقرأ المقال كاملاً، راجع المصادر المرفقة، ثم جرّب الأفكار المناسبة لاحتياجك بحذر.



