
كيف يعمل روبوت RAG حديث
خط أنابيب RAG الجيد أكثر من مجرد «ضع المستندات في قاعدة بيانات متجهية». يبدو التدفق الأساسي هكذا:
خطوة إعادة الترتيب هي الترقية التي تجعل هذا أكثر فائدةً من عرض RAG الأساسي. البحث المتجهي سريع وجيد في إيجاد المقاطع المتشابهة دلاليًا، لكنه قد يُرجع مقاطع قريبة من الموضوع بدلًا من أن تكون مفيدة مباشرة. أما cross-encoder فيقرأ السؤال وكل مقطع مرشح معًا، ثم يسجّل مدى إجابة ذلك المقطع للسؤال فعليًا.
تثبيت التبعيات
سنستخدم OpenAI Python SDK لأن Venice يكشف واجهة متوافقة مع OpenAI. وسنستخدم أيضًا عميل Qdrant بـ Python مع دعم FastEmbed:requirements.txt بنفس الحزم:
اختيار النماذج
أنشئ ملفًا باسمrag_bot.py، ثم ابدأ بإضافة الاستيرادات وهياكل البيانات ورابط API وأسماء النماذج:
base_url ومفتاح API.
يمكنك سرد نماذج Venice المتاحة بـ:
إنشاء عميلَي Venice و Qdrant
أنشئ عميل Venice واحدًا متوافقًا مع OpenAI للتضمينات وإكمال المحادثات معًا:
لروبوت محلي خاص، ابدأ بمسار Qdrant محلي على القرص:
تحميل المستندات وتقسيمها
في هذا الدرس، سنسمح للروبوت باستيعاب ملفات أو مجلدات محلية. ابدأ بملفات.md و.rst و.txt:
1000 حرف مع تداخل 150 حرف هو افتراضي جيد لمستندات Markdown ونصوص مختلطة. التجزئات الأصغر يمكن أن تحسّن الدقّة. التجزئات الأكبر يمكن أن تحافظ على سياق أكبر. الإعداد المناسب سيعتمد غالبًا على نوع المستندات التي تخزّنها.
تضمين المستندات باستخدام Venice
بعد أن تكون لدينا التجزئات، نضمّنها على دفعات:تخزين المتجهات في Qdrant
قبل إدراج النقاط، أنشئ مجموعة Qdrant بحجم متجه صحيح. أسهل طريقة لمعرفة حجم المتجه هي تضمين الدفعة الأولى ثم استخدامlen(embeddings[0]).
source وchunk_index والمحتوى. هذا يجعل الاستيعاب المتكرّر متعاديًا (idempotent) للتجزئات التي لم تتغيّر.
استرجاع التجزئات المرشّحة
عند طرح السؤال، يضمّن الروبوت سؤال المستخدم ويسأل Qdrant عن أعلى المطابقات المتجهية:limit هنا هو عدد المرشحين. ينبغي أن يكون أعلى من عدد التجزئات التي تنوي إرسالها إلى النموذج، لأن الخطوة التالية ستعيد ترتيبها. افتراضي جيّد هو استرجاع 8 مرشحين وإرسال أفضل 4 إلى نموذج المحادثة.
إعادة الترتيب باستخدام FastEmbed
الآن نضيف الجزء الذي يجعل الاسترجاع يبدو أذكى بكثير.- استرجاع مجموعة أكبر من المرشحين بالبحث المتجهي.
- إعادة ترتيب أولئك المرشحين فقط محليًا.
- إرسال أعلى بضع تجزئات إلى نموذج اللغة.
candidate_k=8 وtop_k=4. زِد candidate_k إذا كان المصدر الصحيح قريبًا غالبًا لكنه لا يصل إلى السياق النهائي.
الإجابة باستخدام إكمال محادثات Venice
بعد اختيار السياق، نسّقه بأرقام مصادر:تشغيل الروبوت
بعد أن تجمّع القطع في سكربت، احفظه باسمrag_bot.py. تشغيل أول بسيط يمكنه استخدام بعض المستندات النموذجية المدمجة كي تتحقّق من خط الأنابيب قبل استيعاب ملفاتك الخاصة:
خيارات CLI مفيدة
اكشف مفاتيح الاسترجاع الرئيسية كخيارات CLI حتى تتمكن من ضبط الروبوت دون تعديل الكود:
للتطوير المحلي المتكرّر، التدفق الشائع هو:
ملاحظات الخصوصية
لإعداد RAG خاص، فكّر في كل طبقة على حدة:
أكثر الافتراضات خصوصيةً في هذا الدرس هي Venice للاستدلال، وQdrant محلي على القرص، وإعادة ترتيب FastEmbed محلية. هذا يمنحك روبوت RAG عمليًا دون إرسال حمولات قاعدة البيانات المتجهية إلى متجر متجهات تابع لطرف ثالث.
أخطاء شائعة ينبغي التعامل معها مبكرًا
إذا غيّرت نماذج التضمين، أعد إنشاء مجموعة Qdrant. قد تنتج نماذج التضمين المختلفة متجهات بأبعاد مختلفة، ومجموعات Qdrant تتوقع حجم متجه ثابتًا.
إلى أين تتجه بعد ذلك
بمجرد تشغيل خط الأساس، فإن أكثر التحسينات تأثيرًا تكون عادةً:- إضافة محمّلات خاصة بالمستندات لملفات PDF أو HTML أو التذاكر أو صفحات الويكي الداخلية.
- تخزين بيانات وصفية أغنى مثل العناوين والترويسات والتواريخ والمالكين والروابط.
- ضبط
candidate_kوtop_kوحجم التجزئة والتداخل على أسئلة حقيقية. - إضافة أسئلة تقييم لتتمكن من قياس جودة الاسترجاع قبل التغييرات وبعدها.
- بث إكمال محادثة Venice النهائي لتجربة محادثة تفاعلية أفضل.