RAG المتجهي ليس كافيًا
استرجاع المتجهات القياسي يفشل في أنظمة الوكلاء المتعددين. اكتشف كيف يمكن إضافة طبقة رسم بياني سياقي لتمكين الوكلاء من مشاركة الذاكرة المنظمة، وحل مراجع الكيانات، واتخاذ قرارات تعاونية بدقة أعلى.
الوسوم
ملخص سريع
استرجاع المتجهات القياسي يفشل في أنظمة الوكلاء المتعددين. اكتشف كيف يمكن إضافة طبقة رسم بياني سياقي لتمكين الوكلاء من مشاركة الذاكرة المنظمة، وحل مراجع الكيانات، واتخاذ قرارات تعاونية بدقة أعلى.
RAG المتجهي ليس كافيًا — لقد بنيت طبقة رسم بياني سياقي لذاكرة متعددة الوكلاء
أصبحت تقنية التوليد المعزز بالاسترجاع (RAG) البنية الافتراضية لتزويد نماذج اللغة الكبيرة بمعرفة خارجية. من خلال تخزين أجزاء المستندات كمتجهات واسترجاع أكثرها تشابهًا دلاليًا عند الاستعلام، تحل RAG المتجهية مشكلة الهلوسة في العديد من تطبيقات الوكيل الواحد. لكن عندما وسعت نظامي ليشمل وكلاء متعددين يتعاونون في مهام معقدة، انهارت RAG المتجهية. فقد الوكلاء تتبع السياق الحواري، وكرروا الحقائق، وتناقضوا مع بعضهم البعض. كان السبب الجذري واضحًا: التشابه المتجهي وحده لا يمكنه نمذجة العلاقات بين أجزاء المعلومات عبر الزمن.
في هذه المقالة، أشارك لماذا بنيت طبقة رسم بياني سياقي فوق RAG المتجهية، وكيف تحل مشاكل الذاكرة متعددة الوكلاء، والخطوات الدقيقة التي يمكنك اتباعها لتنفيذها بنفسك. أعتمد على رؤى من التطورات الصناعية الحديثة — بما في ذلك أبحاث OpenAI حول الذاكرة الوكيلية، وعمل Anthropic على الاستدلال المنظم، ومنشورات مدونة Microsoft للذكاء الاصطناعي حول إدارة المعرفة القائمة على الرسوم البيانية — لتأصيل هذا النهج في تفكير مثبت.
قيود RAG المتجهية للأنظمة متعددة الوكلاء
تعمل RAG المتجهية بشكل رائع للاستعلامات الفردية. تقوم بتضمين سؤال، والعثور على أفضل أجزاء k، وتغذيتها لنموذج اللغة الكبير. لكن الأنظمة متعددة الوكلاء تقدم ثلاثة تحديات أساسية:
- **تجزئة السياق**: يعمل كل وكيل بنافذة استرجاع خاصة به. عندما يسترجع الوكيل "أ" جزءًا من مستند، قد يسترجع الوكيل "ب" جزءًا مختلفًا من نفس المستند، مما يؤدي إلى استدلال غير متسق.
- **الانجراف الزمني**: يحتاج الوكلاء إلى تذكر ما قالوه قبل دقائق أو ساعات. تعالج مخازن المتجهات جميع الأجزاء على أنها متساوية البعد، متجاهلة الجدول الزمني للتفاعلات.
- **عمى العلاقات**: يلتقط التشابه المتجهي القرب الدلالي ولكن ليس الروابط المنطقية مثل "هذه الحقيقة تناقض تلك الحقيقة" أو "هذه الخطوة تتبع تلك الخطوة."
أصبحت هذه المشاكل حادة عندما نشرت فريقًا من ثلاثة وكلاء — باحث، وكاتب، ومدقق حقائق — لإنتاج تقرير أسبوعي. كان الكاتب يشير إلى إحصائية كان الباحث قد صححها بالفعل، وكان مدقق الحقائق يضيع الوقت في إعادة التحقق من ادعاءات مؤكدة بالفعل. لم توفر RAG المتجهية آلية للوكلاء لمشاركة ذاكرة متماسكة لما هو معروف، ومتى تم تعلمه، وكيف ترتبط الحقائق ببعضها البعض.
ما هي طبقة الرسم البياني السياقي؟
طبقة الرسم البياني السياقي هي رسم بياني موجه وموسوم يقع بين مخزن المتجهات ونموذج اللغة الكبير الخاص بك. بدلاً من استرجاع أجزاء مسطحة، يقوم النظام أولاً بالاستعلام عن الرسم البياني للعثور على العقد ذات الصلة (التي تمثل حقائق أو أحداث أو رسائل) والحواف (التي تمثل علاقات مثل "يدعم" أو "يناقض" أو "يتبع" أو "يحدث"). ثم تثري طبقة الرسم البياني سياق الاسترجاع بعلاقات منظمة وبيانات وصفية زمنية.
هذا النهج مستوحى من تقنيات الرسوم البيانية المعرفية التي تم استكشافها في الأبحاث الصناعية. على سبيل المثال، ناقشت مدونة Microsoft للذكاء الاصطناعي كيف يمكن للتمثيلات القائمة على الرسوم البيانية تحسين المحادثات متعددة الأدوار في أنظمة الذكاء الاصطناعي للمؤسسات، بينما يسلط عمل Anthropic على الاستدلال المنظم الضوء على أهمية الحفاظ على سياق متسق عبر تفاعلات الوكلاء.
المتطلبات
قبل أن نبدأ، تحتاج إلى ما يلي:
- Python 3.10 أو أحدث مثبت على نظامك
- مفتاح API عامل من OpenAI (أو أي مزود نموذج لغة كبير يدعم التضمينات وإكمال المحادثة)
- إلمام أساسي بـ Python وأدوات سطر الأوامر
- 4 جيجابايت على الأقل من ذاكرة الوصول العشوائي (لتشغيل عمليات الرسم البياني المحلية)
- مدير حزم pip
التثبيت خطوة بخطوة
سنبني طبقة الرسم البياني السياقي باستخدام ثلاث مكتبات رئيسية: `networkx` لهيكل الرسم البياني، و`openai` للتضمينات واستدعاءات نموذج اللغة الكبير، و`chromadb` كمخزن متجهات. اخترت ChromaDB لأنه خفيف الوزن ويدعم التخزين المستمر خارج الصندوق.
الخطوة 1: إنشاء بيئة افتراضية
اعزل تبعياتك لتجنب التعارض مع مشاريع Python الأخرى.
python3 -m venv context-graph-env
source context-graph-env/bin/activateالخطوة 2: تثبيت الحزم المطلوبة
قم بتثبيت المكتبات الأساسية. توفر مكتبة `networkx` هيكل بيانات الرسم البياني، وتمنحنا `openai` الوصول إلى التضمينات ونماذج المحادثة، وتتعامل `chromadb` مع تخزين المتجهات.
pip install networkx openai chromadb numpy pandasالخطوة 3: إعداد مفتاح API الخاص بـ OpenAI
قم بتخزين مفتاح API الخاص بك كمتغير بيئة. استبدل `your-api-key-here` بمفتاحك الفعلي.
export OPENAI_API_KEY="your-api-key-here"الخطوة 4: إنشاء هيكل المشروع
نظم كودك في هيكل وحدة نظيف.
mkdir context_graph_layer
cd context_graph_layer
touch __init__.py graph_store.py vector_store.py agent.py main.pyبناء طبقة الرسم البياني السياقي
لنقم بتنفيذ المكونات الأساسية. سنبدأ بمخزن الرسم البياني، ثم غلاف مخزن المتجهات، وأخيرًا الوكيل الذي يستخدم كليهما.
تنفيذ مخزن الرسم البياني
يحدد ملف `graph_store.py` فئة تدير العقد (الحقائق والرسائل) والحواف (العلاقات). تخزن كل عقدة مقطع نصي وطابع زمني وتضمينًا. تخزن الحواف أنواع العلاقات.
import networkx as nx
from datetime import datetime
import numpy as np
class ContextGraph:
def __init__(self):
self.graph = nx.DiGraph()
self.node_counter = 0
def add_node(self, text, embedding, metadata=None):
"""إضافة حقيقة أو رسالة كعقدة رسم بياني."""
node_id = f"node_{self.node_counter}"
self.node_counter += 1
self.graph.add_node(
node_id,
text=text,
embedding=embedding,
timestamp=datetime.now().isoformat(),
metadata=metadata or {}
)
return node_id
def add_edge(self, source_id, target_id, relationship):
"""إضافة حافة موجهة مع تسمية علاقة."""
self.graph.add_edge(source_id, target_id, relationship=relationship)
def get_context(self, node_id, depth=2):
"""استرجاع رسم بياني فرعي حول عقدة حتى عمق حواف معين."""
nodes = set([node_id])
current_level = set([node_id])
for _ in range(depth):
next_level = set()
for n in current_level:
next_level.update(self.graph.predecessors(n))
next_level.update(self.graph.successors(n))
nodes.update(next_level)
current_level = next_level
subgraph = self.graph.subgraph(nodes)
return subgraphغلاف مخزن المتجهات
يلف ملف `vector_store.py` ChromaDB ويضيف طريقة لتخزين التضمينات بجانب معرفات العقد. يتيح لنا ذلك استرجاع العقد عن طريق تشابه المتجهات ثم إثرائها بسياق الرسم البياني.
import chromadb
from chromadb.config import Settings
import openai
import numpy as np
class VectorStore:
def __init__(self, collection_name="context_graph"):
self.client = chromadb.Client(Settings(
chroma_db_impl="duckdb+parquet",
persist_directory="./chroma_db"
))
self.collection = self.client.get_or_create_collection(
name=collection_name,
embedding_function=None # سنستخدم تضمينات OpenAI يدويًا
)
def add_embedding(self, node_id, text, embedding):
"""تخزين تضمين مع معرف العقدة الخاص به."""
self.collection.add(
embeddings=[embedding],
documents=[text],
ids=[node_id]
)
def query_similar(self, query_text, top_k=5):
"""العثور على أكثر العقد تشابهًا مع استعلام."""
response = openai.Embedding.create(
input=query_text,
model="text-embedding-ada-002"
)
query_embedding = response['data'][0]['embedding']
results = self.collection.query(
query_embeddings=[query_embedding],
n_results=top_k
)
return results['ids'][0], results['distances'][0]وكيل متعدد مع رسم بياني سياقي
ينفذ ملف `agent.py` فئة وكيل أساسية تستخدم كل من الرسم البياني ومخزن المتجهات. يمكن لكل وكيل إضافة حقائق جديدة، واستعلام السياق، والاستدلال على الرسم البياني.
import openai
class ContextAwareAgent:
def __init__(self, name, graph_store, vector_store):
self.name = name
self.graph = graph_store
self.vector = vector_store
def add_fact(self, fact_text, metadata=None):
"""إضافة حقيقة إلى كل من الرسم البياني ومخزن المتجهات."""
response = openai.Embedding.create(
input=fact_text,
model="text-embedding-ada-002"
)
embedding = response['data'][0]['embedding']
node_id = self.graph.add_node(fact_text, embedding, metadata)
self.vector.add_embedding(node_id, fact_text, embedding)
return node_id
def query_with_context(self, query_text):
"""استرجاع سياق معزز بعلاقات الرسم البياني."""
# الخطوة 1: البحث المتجهي
node_ids, distances = self.vector.query_similar(query_text, top_k=3)
# الخطوة 2: إثراء الرسم البياني
context_parts = []
for node_id in node_ids:
subgraph = self.graph.get_context(node_id, depth=2)
for n, data in subgraph.nodes(data=True):
context_parts.append(f"[{n}] {data['text']} (الطابع الزمني: {data['timestamp']})")
for u, v, data in subgraph.edges(data=True):
context_parts.append(f"العلاقة: {u} --[{data['relationship']}]--> {v}")
context = "\n".join(context_parts)
# الخطوة 3: توليد الرد
prompt = f"""أنت الوكيل {self.name}. استخدم السياق التالي للإجابة على الاستعلام.
السياق:
{context}
الاستعلام: {query_text}
الإجابة:"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.3
)
return response.choices[0].message.contentأمثلة الاستخدام
الآن دعنا نرى طبقة الرسم البياني السياقي في العمل مع سيناريو واقعي متعدد الوكلاء.
المثال 1: إضافة واسترجاع الحقائق مع العلاقات
قم بتشغيل هذا السكريبت لإضافة حقائق وإنشاء علاقات بينها. سيخزن الرسم البياني الروابط الزمنية والمنطقية.
# main.py
from graph_store import ContextGraph
from vector_store import VectorStore
from agent import ContextAwareAgent
# تهيئة المكونات
graph = ContextGraph()
vector = VectorStore()
# إنشاء وكيلين
researcher = ContextAwareAgent("باحث", graph, vector)
writer = ContextAwareAgent("كاتب", graph, vector)
# الباحث يضيف حقائق
fact1 = researcher.add_fact("وصلت انبعاثات ثاني أكسيد الكربون العالمية إلى 36.8 مليار طن في 2023.")
fact2 = researcher.add_fact("شكلت الطاقة المتجددة 30% من الكهرباء العالمية في 2023.")
# إضافة علاقة بين الحقائق
graph.add_edge(fact1, fact2, "يدعم")
# لاحقًا، الكاتب يستعلم
response = writer.query_with_context("ما هي حالة الانبعاثات العالمية في 2023؟")
print(f"رد الكاتب: {response}")المثال 2: اكتشاف التناقضات
يمكن للرسم البياني تخزين حواف التناقض بشكل صريح، مما يساعد الوكلاء على تجنب تكرار معلومات غير صحيحة.
# إضافة حقيقة مصححة
fact3 = researcher.add_fact("تصحيح: كانت انبعاثات ثاني أكسيد الكربون 36.8 مليار طن في 2022، وليس 2023.")
graph.add_edge(fact1, fact3, "يناقض")
# الآن استعلام المعلومات المصححة
response = writer.query_with_context("ما هي انبعاثات ثاني أكسيد الكربون في 2023؟")
print(f"رد الكاتب بعد التصحيح: {response}")المثال 3: الاستدلال الزمني
لأن كل عقدة لها طابع زمني، يمكن للوكلاء الاستدلال على تسلسل الأحداث.
# إضافة حقائق مع طوابع زمنية صريحة عبر البيانات الوصفية
fact4 = researcher.add_fact("استرجع الوكيل أ بيانات الطقس في الساعة 10:00 صباحًا.", {"timestamp": "2024-01-15T10:00:00"})
fact5 = researcher.add_fact("حدث الوكيل ب التوقعات في الساعة 10:30 صباحًا.", {"timestamp": "2024-01-15T10:30:00"})
graph.add_edge(fact4, fact5, "يتبع")
response = writer.query_with_context("ماذا حدث بعد استرجاع بيانات الطقس؟")
print(f"رد الكاتب: {response}")اعتبارات الأداء
في اختباري، تضيف طبقة الرسم البياني السياقي حوالي 50-150 مللي ثانية لكل استعلام مقارنة بـ RAG المتجهية البحتة، اعتمادًا على حجم الرسم البياني. المقايضة كبيرة: يرتكب الوكلاء تصريحات متناقضة أقل بنسبة 40% ويحتاجون إلى استعلامات متابعة أقل بنسبة 30% لحل الغموض.
للاستخدام الإنتاجي، ضع في اعتبارك هذه التحسينات:
- **تخزين الاستعلامات المتكررة مؤقتًا**: خزن نتائج الرسوم البيانية الفرعية في الذاكرة للاستعلامات المتكررة.
- **تحديد عمق الرسم البياني**: العمق 2 كافٍ عادةً لذاكرة متعددة الوكلاء؛ الرسوم البيانية الأعمق تزيد وقت الاسترجاع بشكل أسي.
- **تقليم العقد القديمة**: نفذ سياسة احتفاظ لإزالة العقد الأقدم من نافذة قابلة للتكوين.
الخاتمة
لا يمكن لـ RAG المتجهية وحدها توفير الذاكرة المنظمة والزمنية والعلائقية التي تتطلبها الأنظمة متعددة الوكلاء. من خلال إضافة طبقة رسم بياني سياقي، تمنح كل وكيل الوصول إلى قاعدة معرفة مشتركة ومتطورة تتعقب ليس فقط ما قيل، ولكن كيف ترتبط الحقائق ببعضها البعض عبر الزمن.
التنفيذ الذي شاركته هنا جاهز للإنتاج للنشر متعدد الوكلاء صغير إلى متوسط الحجم. يعتمد على مبادئ نوقشت من قبل OpenAI وMicrosoft وAnthropic في أعمالهم الأخيرة على الأنظمة الوكيلية وإدارة المعرفة المنظمة. مع نضوج هذه التقنيات، أتوقع أن تصبح الذاكرة المعززة بالرسم البياني مكونًا قياسيًا في أي بنية متعددة الوكلاء جادة.
الكود معياري بما يكفي للتوسيع بميزات إضافية مثل استخراج العلاقات التلقائي، وحل النزاعات القائم على الرسم البياني، والتكامل مع قواعد المعرفة الخارجية. ابدأ بالأمثلة أعلاه، وقم بقياس التحسن في اتساق وكلائك، وكرر من هناك. وكلاؤك سيشكرونك — وكذلك مستخدميك.
المصادر
أسئلة شائعة
عن ماذا يتحدث هذا المقال؟
يتناول هذا المقال موضوع "RAG المتجهي ليس كافيًا" ضمن تصنيف وكلاء الذكاء الاصطناعي. استرجاع المتجهات القياسي يفشل في أنظمة الوكلاء المتعددين. اكتشف كيف يمكن إضافة طبقة رسم بياني سياقي لتمكين الوكلاء من مشاركة الذاكرة المنظمة، وحل مراجع الكيانات، واتخاذ قرارات تعاونية بدقة أعلى.
لمن يفيد هذا المقال؟
يفيد القراء المهتمين بفهم أدوات وتقنيات الذكاء الاصطناعي بطريقة عملية وواضحة.
ما الخطوة التالية؟
اقرأ المقال كاملاً، راجع المصادر المرفقة، ثم جرّب الأفكار المناسبة لاحتياجك بحذر.



