الراغ المتقدم: شرح LongRAG وSelf-RAG وGraphRAG
LongRAG، Self-RAG، GraphRAG - تقنيات الجيل التالي
الإيجاد المعزز بالاسترجاع (RAG) قد تطور إلى ما يتجاوز البحث المبسط بناءً على التشابه بين المتجهات. LongRAG، وSelf-RAG، وGraphRAG تمثل أحدث ما توصل إليه في هذه القدرات.
تحتاج أنظمة RAG الحديثة إلى التعامل مع وثائق ضخمة، وفهم العلاقات المعقدة بين الكيانات وغيرها الكثير.
 هذا الصورة الجميلة تولدت بواسطة نموذج الذكاء الاصطناعي Flux 1 dev.
التطور المتجاوز لـ RAG الأساسية
تتبع أنظمة RAG التقليدية نمطًا بسيطًا: تقطع الوثائق، وتشفرها إلى متجهات، وتنجذب المتجهات المتشابهة عبر التشابه الكسبي، وتعطيها إلى نموذج LLM. وعلى الرغم من فعاليتها في العديد من الحالات، فإن هذا النهج يعاني من ثلاث حالات حاسمة:
- الاعتماد على المدى الطويل: قد يكون السياق المهم موزعًا على آلاف الرموز عبر عدة قطع
- الثقة في الاسترجاع: لا يمكن للنظام تقييم ما إذا كان المحتوى المسترجع فعليًا مرتبطًا
- تعقيد العلاقات: لا يمكن للتشابه بين المتجهات التقاط الروابط المعقدة بين الكيانات
تتناول المتغيرات المتقدمة لـ RAG هذه القيود باستخدام هياكل مخصصة مصممة لتحديات معينة.
LongRAG: انتصار المدى الطويل
لمحة عامة عن الهيكل
تعيد LongRAG تفكير استراتيجية التقطيع بشكل جذري من خلال استخدام نماذج LLM ذات نافذة سياقية موسعة (32K، 100K، أو حتى 1M رموز). بدلًا من تقسيم الوثائق إلى قطع صغيرة بطول 512 رمز، تستخدم LongRAG نهجًا هرميًا:
الإدراج على مستوى الوثيقة: تُعالج الوثيقة بأكملها (أو أقسام كبيرة جدًا) كوحدة واحدة. يلتقط إدراج مستوى الوثيقة المعنى العام، مع الحفاظ على النص الكامل للمعالجة اللاحقة.
الحد الأدنى من التقطيع: عند الحاجة إلى التقطيع، تستخدم LongRAG قطعًا كبيرة جدًا (4K-8K رموز) مع تداخل كبير (20-30%). هذا يحافظ على تدفق السرد ويقلل من تجزئة السياق.
تجميع السياق: عند الاسترجاع، تعيد LongRAG الوثائق الكاملة أو الأقسام المترابطة بدلًا من الأجزاء المبعثرة. يحصل نموذج LLM على سياق متصل يحافظ على العلاقات الهيكلية والمعنوية.
استراتيجية التنفيذ
إليك تنفيذ مفاهيمي باستخدام Python ونماذج الإدراج الحديثة:
من نوع المكتبة: القائمة، المكتبة
นำ numpy np
class LongRAGRetriever:
def __init__(self, model, chunk_size=8000, overlap=1600):
self.model = model
self.chunk_size = chunk_size
self.overlap = overlap
self.doc_embeddings = []
self.documents = []
def create_long_chunks(self, text: str) -> List[str]:
"""إنشاء قطع كبيرة مع التداخل"""
chunks = []
start = 0
while start < len(text):
end = start + self.chunk_size
chunk = text[start:end]
chunks.append(chunk)
start += (self.chunk_size - self.overlap)
return chunks
def index_document(self, doc: str, metadata: Dict):
"""إدراج وثيقة مع إدراج هرمي"""
# إدراج الوثيقة كاملة
doc_embedding = self.model.embed(doc)
# إنشاء قطع كبيرة مع التداخل
chunks = self.create_long_chunks(doc)
chunk_embeddings = [self.model.embed(c) for c in chunks]
self.doc_embeddings.append({
'doc_id': len(self.documents),
'doc_embedding': doc_embedding,
'chunk_embeddings': chunk_embeddings,
'chunks': chunks,
'full_text': doc,
'metadata': metadata
})
self.documents.append(doc)
def retrieve(self, query: str, top_k: int = 3) -> List[Dict]:
"""استرجاع محتوى طويل الأجل ذي صلة"""
query_embedding = self.model.embed(query)
# تقييم أولاً على مستوى الوثيقة
doc_scores = [
np.dot(query_embedding, doc['doc_embedding'])
for doc in self.doc_embeddings
]
# الحصول على أفضل وثائق
top_doc_indices = np.argsort(doc_scores)[-top_k:][::-1]
results = []
for idx in top_doc_indices:
doc_data = self.doc_embeddings[idx]
# لكل وثيقة، إيجاد أفضل القطع
chunk_scores = [
np.dot(query_embedding, emb)
for emb in doc_data['chunk_embeddings']
]
best_chunk_idx = np.argmax(chunk_scores)
# إرجاع السياق الموسّع حول القطعة الأفضل
context_chunks = self._get_extended_context(
doc_data['chunks'],
best_chunk_idx
)
results.append({
'text': ''.join(context_chunks),
'score': doc_scores[idx],
'metadata': doc_data['metadata']
})
return results
def _get_extended_context(self, chunks: List[str],
center_idx: int) -> List[str]:
"""الحصول على سياق موسّع حول القطعة ذات الصلة"""
start = max(0, center_idx - 1)
end = min(len(chunks), center_idx + 2)
return chunks[start:end]
استخدامات ونتائج الأداء
تتفوق LongRAG في السيناريوهات التي تهم فيها السياق:
- تحليل الوثائق القانونية: غالبًا ما يكون هناك اعتماديات عبر صفحات عديدة
- استرجاع ورق الأبحاث: يتطلب فهم المنهجية أقسامًا مترابطة، وليس فقرات منفصلة
- مستودعات الكود: يجب فهم الدوال والصفات داخل سياق وحدتها
مميزات الأداء:
- التأخير: أعلى نظرًا لمعالجة القطع الكبيرة (2-5 مرات أبطأ من RAG القياسي)
- الدقة: تحسن بنسبة 15-25% على معايير اختبار الأسئلة الطويلة
- الذاكرة: تتطلب 3-4 مرات ذاكرة إضافية لنوافذ السياق
Self-RAG: الاسترجاع التأمل
المبادئ الأساسية
يقدم Self-RAG طبقة من التأمل لأنظمة RAG. بدلًا من الاسترجاع والتكوين بشكل أعمى، يقوم النظام بتقييم عملياته من خلال رموز التأمل الخاصة:
رمز الاسترجاع: يقرر ما إذا كان الاسترجاع ضروريًا لسؤال معين رمز الصلة: يقيّم ما إذا كانت الوثائق المسترجعة فعليًا ذات صلة رمز الدعم: يتحقق من ما إذا كان الإجابة المُولدة مدعومة بالمواد المسترجعة رمز النقد: يقيّم جودة الإجابة المُولدة بشكل عام
مكونات الهيكل
تتكون هياكل Self-RAG من ثلاث مراحل مترابطة:
class SelfRAGSystem:
def __init__(self, retriever, generator, critic):
self.retriever = retriever
self.generator = generator
self.critic = critic
def generate_with_reflection(self, query: str,
max_iterations: int = 3):
"""توليد إجابة مع التأمل الذاتي"""
# المرحلة 1: قرار ما إذا كان الاسترجاع ضروريًا
retrieve_decision = self.critic.should_retrieve(query)
if not retrieve_decision:
# التوليد المباشر دون استرجاع
return self.generator.generate(query)
# المرحلة 2: الاسترجاع وتقييم الصلة
retrieved_docs = self.retriever.retrieve(query)
relevant_docs = []
for doc in retrieved_docs:
relevance_score = self.critic.assess_relevance(
query, doc
)
if relevance_score > 0.7: # العتبة
relevant_docs.append(doc)
if not relevant_docs:
# الافتراض إلى التوليد دون استرجاع
return self.generator.generate(query)
# المرحلة 3: التوليد وتقييم الدعم
best_answer = None
best_score = -1
for _ in range(max_iterations):
# توليد إجابة مبدئية
answer = self.generator.generate(
query, context=relevant_docs
)
# تقييم الدعم والجودة
support_score = self.critic.check_support(
answer, relevant_docs
)
quality_score = self.critic.assess_quality(answer)
total_score = 0.6 * support_score + 0.4 * quality_score
if total_score > best_score:
best_score = total_score
best_answer = answer
# التوقف المبكر إذا تم تحقيق جودة عالية
if total_score > 0.9:
break
return {
'answer': best_answer,
'confidence': best_score,
'sources': relevant_docs,
'reflections': {
'retrieved': retrieve_decision,
'relevance': len(relevant_docs),
'support': support_score
}
}
تدريب آليات التأمل
يحتاج Self-RAG إلى تدريب مكون المُنتقِي لتقديم تقييمات موثوقة. عادةً ما يتضمن ذلك:
- التحسين المُشرف على بيانات مُصنَّفة مع تقييمات الصلة
- التعلم بالتعزيز مع مكافآت للتنبؤات الدقيقة
- التعلم المُعاكس لتمييز المدّعى مقابل غير المدّعى
يمكن تنفيذ رموز التأمل كـ:
- رموز خاصّة في المفردات (مثل
[RETRIEVE],[RELEVANT]) - رؤوس منفصلة على النموذج
- نماذج مُنتقِية خارجية (نهج التجميع)
اعتبارات الإنتاج
عند نشر Self-RAG في أنظمة الإنتاج:
التوازن بين التأخير: يضيف كل خطوة تأمل 20-40% من تكلفة الاستنتاج. توازن بين التفصيل والوقت المطلوب للرد.
العتبات على الثقة: تضبط عتبات التأمل بناءً على استخدامك. تطبيقات القانون أو الطب تحتاج إلى ثقة أعلى من المحادثات العامة.
مراقبة: تتبع قرارات التأمل لتحديد الأنماط. إذا كان الاسترجاع نادرًا، فقد تستفيد من هيكل بسيط.
GraphRAG: الاسترجاع المعزز بالرسوم البيانية
الأساس المفاهيمي
يحوّل GraphRAG مشكلة الاسترجاع من التشابه بين المتجهات إلى مسيرة الرسوم البيانية. بدلًا من العثور على مجموعات نصية متشابهة، يحدد GraphRAG الرسوم البيانية ذات الصلة من الكيانات والروابط.
استخراج الكيانات: تحديد الكيانات، المفاهيم، ونوعها رسم العلاقات: استخراج العلاقات بين الكيانات (الزمنية، السببية، الهرمية) بناء الرسوم البيانية: بناء رسمة مع معلومات الكيانات كعقد والروابط كحواف استرجاع الرسوم الفرعية: عند الاستفسار، العثور على الرسوم الفرعية ذات الصلة
أنبوب بناء الرسوم البيانية
بناء رسمة معرفية من النصوص غير المهيكلة يتضمن عدة مراحل:
class GraphRAGBuilder:
def __init__(self, entity_extractor, relation_extractor):
self.entity_extractor = entity_extractor
self.relation_extractor = relation_extractor
self.graph = NetworkGraph()
def build_graph(self, documents: List[str]):
"""بناء رسمة معرفية من الوثائق"""
for doc in documents:
# استخراج الكيانات
entities = self.entity_extractor.extract(doc)
# إضافة الكيانات كعقد
for entity in entities:
self.graph.add_node(
entity['text'],
entity_type=entity['type'],
context=entity['surrounding_text']
)
# استخراج العلاقات
relations = self.relation_extractor.extract(
doc, entities
)
# إضافة العلاقات كحواف
for rel in relations:
self.graph.add_edge(
rel['source'],
rel['target'],
relation_type=rel['type'],
confidence=rel['score'],
evidence=rel['text_span']
)
def enrich_graph(self):
"""إضافة علاقات مشتقة والمعلومات"""
# حساب أهمية العقد (PageRank، إلخ.)
self.graph.compute_centrality()
# تحديد المجتمعات/النقاط
self.graph.detect_communities()
# إضافة الترتيب الزمني إذا كانت هناك تواريخ
self.graph.add_temporal_edges()
معالجة الاستفسارات باستخدام الرسوم البيانية
تتضمن استفسارات GraphRAG تفكيرًا متعدد الخطوات عبر الرسمة المعرفية:
class GraphRAGRetriever:
def __init__(self, graph, embedder):
self.graph = graph
self.embedder = embedder
def retrieve_subgraph(self, query: str,
max_hops: int = 2,
max_nodes: int = 50):
"""استرجاع رسمة فرعية للاستفسار"""
# تحديد الكيانات الأساسية في الاستفسار
query_entities = self.entity_extractor.extract(query)
# العثور على العقد المطابقة في الرسمة
seed_nodes = []
for entity in query_entities:
matches = self.graph.find_similar_nodes(
entity['text'],
similarity_threshold=0.85
)
seed_nodes.extend(matches)
# توسيع الرسمة الفرعية عبر المسيرة
subgraph = self.graph.create_subgraph()
visited = set()
for seed in seed_nodes:
self._expand_from_node(
seed,
subgraph,
visited,
current_hop=0,
max_hops=max_hops
)
# ترتيب العقد حسب الصلة
ranked_nodes = self._rank_subgraph_nodes(
subgraph, query
)
# استخراج وتثبيت السياق
context = self._format_graph_context(
ranked_nodes[:max_nodes],
subgraph
)
return context
def _expand_from_node(self, node, subgraph, visited,
current_hop, max_hops):
"""توسيع الرسمة الفرعية بشكل متكرر"""
if current_hop >= max_hops or node in visited:
return
visited.add(node)
subgraph.add_node(node)
# الحصول على الجيران
neighbors = self.graph.get_neighbors(node)
for neighbor, edge_data in neighbors:
# إضافة الحافة إلى الرسمة الفرعية
subgraph.add_edge(node, neighbor, edge_data)
# توسيع بشكل متكرر
self._expand_from_node(
neighbor,
subgraph,
visited,
current_hop + 1,
max_hops
)
def _format_graph_context(self, nodes, subgraph):
"""تحويل الرسمة الفرعية إلى سياق نصي"""
context_parts = []
for node in nodes:
# إضافة سياق العقدة
context_parts.append(f"الكيان: {node.text}")
context_parts.append(f"النوع: {node.entity_type}")
# إضافة معلومات العلاقة
edges = subgraph.get_edges(node)
for edge in edges:
context_parts.append(
f"- {edge.relation_type} -> {edge.target.text}"
)
return "\n".join(context_parts)
تنفيذ GraphRAG من ميكروسوفت
يأخذ تنفيذ GraphRAG من ميكروسوفت نهجًا فريدًا من خلال توليد ملخصات المجتمعات:
- بناء الرسمة المبدئية من الوثائق باستخدام استخراج الكيانات والروابط بناءً على نموذج LLM
- كشف المجتمعات باستخدام خوارزمية Leiden أو مشابهة
- توليد الملخصات لكل مجتمع باستخدام نماذج LLM
- الهيكل الهرمي: بناء مستويات متعددة من الملخصات المجتمعية
- عند الاستفسار: استرجاع المجتمعات ذات الصلة والمسيرة إلى الكيانات المحددة
هذا النهج فعّال خصوصًا في:
- الاستفسارات الاستكشافية (“ما هي المواضيع الرئيسية في هذه المجموعة؟”)
- التفكير متعدد الخطوات (“كيف يرتبط A بـ C من خلال B؟”)
- التحليل الزمني (“كيف تطورت العلاقات لهذا الكيان؟”)
تحليل مقارن
متى تستخدم كل متغير
استخدم LongRAG عندما:
- الوثائق لها ترابط داخلي قوي
- نافذة السياق الخاصة بنموذج LLM تدعم المدخلات الكبيرة (32K+)
- إجابات الاستفسارات تتطلب فهم الاعتماديات طويلة المدى
- تعمل مع وثائق منظمة (تقارير، أوراق بحثية، كتب)
استخدم Self-RAG عندما:
- الدقة والموثوقية حاسمة
- تحتاج إلى قرارات استرجاع قابلة للتفسير
- تكلفة المبالغات غير ذات صلة مكلفة
- تختلف تعقيد الاستفسارات بشكل واسع (بعضها يحتاج إلى استرجاع، وبعضها لا)
استخدم GraphRAG عندما:
- مجالك يحتوي على علاقات كيانات غنية
- الاستفسارات تتضمن تفكيرًا متعدد الخطوات
- العلاقات الزمنية أو الهرمية مهمة
- تحتاج إلى فهم الروابط بين الكيانات
مقارنة مؤشرات الأداء
| المؤشر | RAG القياسي | LongRAG | Self-RAG | GraphRAG |
|---|---|---|---|---|
| وقت الفهرسة | 1x | 0.8x | 1.1x | 3-5x |
| تأخير الاستفسار | 1x | 2-3x | 1.4x | 1.5-2x |
| استخدام الذاكرة | 1x | 3-4x | 1.2x | 2-3x |
| الدقة (الأسئلة والجواب) | مستوى القاعدة | +15-25% | +20-30% | +25-40%* |
| التفسير | منخفض | متوسط | مرتفع | مرتفع |
*تحسينات GraphRAG تعتمد على المجال بشكل كبير
النهج المركب
أقوى أنظمة الإنتاج غالبًا ما تدمج تقنيات متعددة:
LongRAG + GraphRAG: استخدم هيكل الرسمة لتحديد مجموعات الوثائق ذات الصلة، ثم استرجاع الوثائق الكاملة بدلًا من الأجزاء
Self-RAG + GraphRAG: تطبيق آليات التأمل على قرارات المسيرة (المسارات التي يجب اتباعها، متى يجب توقف التوسيع)
الأنبوب ثلاثي المراحل: استخدام GraphRAG للاسترجاع الأول بناءً على الكيانات → استخدام Self-RAG لفلترة الصلة → استخدام LongRAG لتكوين السياق
اعتبارات التنفيذ
نماذج الإدراج
تختلف متغيرات RAG عن بعضها في متطلبات الإدراج:
LongRAG: تحتاج إلى إدراج يعمل بشكل جيد على مستوى الوثيقة والقطعة. تفضل نماذج تدربت باستخدام التعلم المعاكس على التسلسلات الطويلة.
Self-RAG: تستفيد من إدراج يلتقط دلالات دقيقة لتقييم الصلة الدقيقة.
GraphRAG: تحتاج إلى إدراج مدرك للكيانات. النماذج المدربة على مهام ربط الكيانات تؤدي بشكل أفضل.
يؤثر اختيار نموذج الإدراج بشكل كبير على الأداء. عند العمل مع نماذج محلية، توفر أدوات مثل Ollama طريقة مباشرة لتجربة نماذج الإدراج المختلفة قبل الالتزام بتنفيذ الإنتاج.
إعادة النظر في استراتيجيات التقطيع
القطيع الثابت المحدد غير كافٍ للـ RAG المتقدم:
القطيع الدلالي: تقطيع عند الحدود الطبيعية (الفقرات، الأقسام، تغيير الموضوع) القطيع التكراري: إنشاء قطع هرمية مع علاقات الأبوة النافذة المتنقلة: استخدام قطع متداخلة للحفاظ على السياق عند الحدود القطيع المدرك للهيكل: الاحترام الهيكلية للوثيقة (العناوين في markdown، علامات XML، كتل الكود)
للمشاريع القائمة على Python، توفر المكتبات مثل LangChain وLlamaIndex دعمًا مدمجًا لهذه استراتيجيات التقطيع.
دمج إعادة الترتيب
تحسن إعادة الترتيب جودة الاسترجاع بشكل كبير عبر جميع متغيرات RAG. بعد الاسترجاع الأولي، يعيد نموذج مخصص ترتيب النتائج بناءً على ميزات التفاعل بين الاستفسار والوثيقة. هذا يوفر تحسنًا كبيرًا في الدقة (10-20%) مع تأثير ضئيل على التأخير إذا تم دمجه بذكاء.
التوسع إلى الإنتاج
أنبوب الفهرسة:
- استخدام معالجة توزيعية (Ray، Dask) للوثائق الضخمة
- تنفيذ الفهرسة التدريجية للتحديثات في الوقت الفعلي
- تخزين الإدراجات في قواعد بيانات متجهات مُحسّنة (Pinecone، Weaviate، Qdrant)
تحسين الاستفسار:
- تخزين الاستفسارات المتكررة ونتائجها
- تنفيذ توجيه الاستفسار (استخدام متغيرات RAG المختلفة لاستفسارات مختلفة)
- استخدام بحث أقرب الجيران التقريبي للتوسع الخطي
مراقبة:
- تتبع درجات الصلة في الاسترجاع
- مراقبة قرارات التأمل في Self-RAG
- قياس مسارات وعمق المسيرة في الرسمة
- تسجيل درجات الثقة والردود من المستخدمين
تطبيقات حقيقية
بحث الوثائق الفنية
قامت شركة كبيرة في سحابة بتطبيق GraphRAG على وثائقها:
- الكيانات: نقاط الواجهة، المعلمات، أكواد الأخطاء، أسماء الخدمات
- العلاقات: الاعتماديات، توافق الإصدارات، مسارات التحديث
- النتيجة: تقلص بنسبة 35% في طلبات الدعم، وزيادة بنسبة 45% في وقت الحل
استرجاع القانون
قامت شركة تكنولوجية قانونية بدمج Self-RAG مع LongRAG:
- يفلتر Self-RAG الوثائق غير ذات الصلة مبكرًا
- يحتفظ LongRAG بالسياق في الوثائق المحتفظ بها
- يراجع المحامون 60% أقل من المبالغات غير ذات الصلة
- تحسّن الحفاظ على السياق من 71% إلى 94%
مراجعة الأدبيات البحثية
محرك بحث أكاديمي باستخدام نهج مركب:
- يحدد GraphRAG شبكات الاقتباس والمجتمعات البحثية
- يعيد LongRAG أقسامًا كاملة مع الحفاظ على سياق المنهجية
- تحسن بنسبة 40% في اكتشاف الأوراق البحثية ذات الصلة
- تقليل وقت مراجعة الأدبيات من أسابيع إلى أيام
الموضوعات المتقدمة
RAG متعدد الوسائط
توسيع هذه المتغيرات لمعالجة الصور، الجداول، والكود:
- الاستناد البصري: ربط الكيانات النصية بالصور في الوثائق
- فهم الجداول: تحليل البيانات المهيكلة إلى تنسيق الرسوم البيانية
- تحليل الكود: بناء رسمة الاعتماد من قواعد الكود
RAG التكيفي
اختيار ديناميكي لاستراتيجية RAG بناءً على خصائص الاستفسار:
- تصنيف تعقيد الاستفسار
- كاشف نوع الوثيقة
- مُحسّن توازن التكلفة والفوائد لاختيار الاستراتيجية
RAG المحمي خصوصيًا
تنفيذ هذه المتغيرات مع قيود الخصوصية:
- الاسترجاع الموزع عبر المجموعات البيانات
- الخصوصية التفاضلية في الإدراجات
- بحث التشابه مع التشفير
البدء
البدء السريع باستخدام Python
لمن يرغب في تطبيق هذه التقنيات، فإن البدء بأساس متين في Python أمر ضروري. يوفر Python نظامًا غنيًا لتعلم الآلة مما يجعله الخيار الطبيعي لتطوير RAG.
إليك نقطة البدء البسيطة للتجربة:
# تثبيت الاعتمادات
# pip install sentence-transformers faiss-cpu langchain
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# الإعداد الأساسي للتجربة مع القطع الطويلة
model = SentenceTransformer('all-MiniLM-L6-v2')
documents = [
# وثائقك الطويلة هنا
]
# إنشاء التضمينات
embeddings = model.encode(documents)
# بناء مؤشر FAISS
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(embeddings.astype('float32'))
# الاستعلام
query = "سؤالك هنا"
query_embedding = model.encode([query])
distances, indices = index.search(
query_embedding.astype('float32'), k=3
)
اختيار الإطار
LangChain: الأفضل للبرمجة السريعة، والتكاملات الواسعة LlamaIndex: مُحسّن لفهرسة الوثائق والبحث فيها Haystack: جاهز للإنتاج، وقوالب قوية مخصص: عندما تحتاج إلى التحكم الكامل والتحسين
الإطار التقييم
قم بتطبيق تقييم صارم قبل النشر:
معدلات الاسترجاع:
- دقة@K، استرجاع@K، MRR (متوسط الترتيب المتبادل)
- NDCG (الحصول المخفف المُعدّل المُستمر)
معدلات التوليد:
- ROUGE، BLEU لتشابه النصوص
- BERTScore لتشابه المعاني
- تقييم بشري لجودة التقييم
المعدلات النهائية:
- نسبة نجاح المهام
- درجات رضا المستخدمين
- مئات المئات (p50، p95، p99)
الخاتمة
لقد نضجت بيئة أنظمة RAG بشكل كبير عن المقارنة الأساسية لبحث المتجهات. كل من LongRAG وSelf-RAG وGraphRAG تتعامل مع محدوديات النهج التقليدي:
LongRAG تحل مشكلة تجزئة السياق من خلال تبني نافذة سياقية ممتدة وتقسيمًا قليلًا. إنها الخيار المثالي عندما تهم وحدة الوثيقة وتمتلك الموارد الحاسوبية اللازمة للتعامل مع السياقات الكبيرة.
Self-RAG تضيف وعيًا ذاتيًا للأنظمة المسترجعة. من خلال التفكير في قراراتها الخاصة، تقلل من القيم الإيجابية الخاطئة وتحسن الموثوقية—مهمة لتطبيقات ذات مخاطر عالية حيث تهم الدقة أكثر من السرعة.
GraphRAG تطلق قوة تمثيل المعرفة المبنية على الرسوم. عندما يشمل مجالك علاقات معقدة بين الكيانات، يمكن للاسترجاع القائم على الرسوم أن تظهر روابط لا يمكن للبحث المبني على المتجهات أن تكتشفها.
المستقبل لـ RAG على الأرجح سيشمل النهج الهجين التي تدمج قوة هذه المتغيرات. قد يستخدم نظام الإنتاج GraphRAG لتحديد مجموعات الكيانات ذات الصلة، Self-RAG لفلترة والتحقق من الاسترجاعات، وLongRAG لتركيب سياق متماسك للـ LLM.
مع استمرار تحسن LLMs وتوسيع نافذة السياق، سنرى نماذج RAG أكثر تعقيدًا تظهر. المفتاح هو فهم متطلبات حالة الاستخدام الخاصة بك—هيكل الوثيقة، أنماط الاستعلام، متطلبات الدقة، والقيود الحسابية—and اختيار التقنية المناسبة أو المزيج منها.
إن بيئة الأدوات تتطور بسرعة، مع إطارات مثل LangChain وLlamaIndex وHaystack التي توفر دعمًا أدق تدريجيًا لهذه الأنماط المتقدمة. مع راكبات محليّة قوية ونماذج تضمين، لم يكن من الأسهل أن تجرب وتطبق أنظمة RAG من الدرجة الأولى.
ابدأ بالأساسيات، قم بتقييم الأداء بدقة، وطور هيكلك حسب المتطلبات. النماذج المتقدمة لـ RAG التي تغطيها هنا توفر خريطة طريق لهذا التطور.
الروابط المفيدة
- ورقة Python
- إعادة الترتيب باستخدام نماذج التضمين
- LLMs وخرج مهيكل: Ollama، Qwen3 وPython أو Go
- مزوّدو LLMs في السحابة
- مقارنة LLMs: Qwen3:30b مقابل GPT-OSS:20b
المراجع الخارجية
- Microsoft GraphRAG: نظام استرجاع مُحسّن مبني على الرسوم لتعزيز التوليد
- Self-RAG: تعلم الاسترجاع، التوليد، والانتقاد من خلال التفكير الذاتي
- LongRAG: تحسين الاسترجاع المُعزز بالتوليد مع نماذج LLM ذات السياق الطويل
- الاسترجاع المُعزز بالتوليد للنماذج الكبيرة: مراجعة شاملة
- FAISS: مكتبة لبحث التشابه بكفاءة
- مستندات LangChain: تقنيات متقدمة للاسترجاع
- HuggingFace: نماذج تضمين Sentence Transformers
- مراجعة RAG: تحليل شامل للاسترجاع المُعزز بالتوليد