
كيف يعمل روبوت RAG حديث
خط أنابيب RAG الجيد أكثر من مجرد «ضع المستندات في قاعدة بيانات متجهية». يبدو التدفق الأساسي هكذا:| الخطوة | ما يحدث |
|---|---|
| تحميل | قراءة ملفات Markdown أو نصية أو reStructuredText محلية |
| تقسيم | تقسيم المستندات الطويلة إلى أقسام متداخلة |
| تضمين | استخدام تضمينات Venice لتحويل المقاطع إلى متجهات |
| تخزين | حفظ المتجهات والبيانات الوصفية للمصدر في Qdrant |
| استرجاع | تضمين سؤال المستخدم وتشغيل البحث المتجهي |
| إعادة ترتيب | استخدام cross-encoder لإعادة تسجيل أفضل المرشحين |
| إجابة | إرسال أفضل سياق إلى نموذج محادثة Venice مع تعليمات استشهاد |
تثبيت التبعيات
سنستخدم OpenAI Python SDK لأن Venice يكشف واجهة متوافقة مع OpenAI. وسنستخدم أيضًا عميل Qdrant بـ Python مع دعم FastEmbed:requirements.txt بنفس الحزم:
اختيار النماذج
أنشئ ملفًا باسمrag_bot.py، ثم ابدأ بإضافة الاستيرادات وهياكل البيانات ورابط API وأسماء النماذج:
base_url ومفتاح API.
يمكنك سرد نماذج Venice المتاحة بـ:
إنشاء عميلَي Venice و Qdrant
أنشئ عميل Venice واحدًا متوافقًا مع OpenAI للتضمينات وإكمال المحادثات معًا:| الوضع | متى تستخدمه |
|---|---|
QdrantClient(":memory:") | عروض واختبارات محلية سريعة |
QdrantClient(path="./qdrant_data") | تخزين دائم محلي |
QdrantClient(url=..., api_key=...) | عنقود 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 حتى تتمكن من ضبط الروبوت دون تعديل الكود:| الخيار | الافتراضي | ما يتحكم به |
|---|---|---|
--candidate-k | 8 | عدد نتائج البحث المتجهي المراد إعادة ترتيبها |
--top-k | 4 | عدد التجزئات المُعاد ترتيبها المُرسَلة إلى نموذج المحادثة |
--chunk-size | 1000 | الحجم الأقصى للتجزئة قبل التداخل |
--chunk-overlap | 150 | الأحرف المتكرّرة بين التجزئات المتجاورة |
--embedding-batch-size | 32 | عدد التجزئات لكل طلب تضمينات Venice |
--qdrant-path | غير محدّد | مسار التخزين الدائم المحلي لـ Qdrant |
--qdrant-url | غير محدّد | رابط Qdrant بعيد |
--skip-ingest | false | استعلم من مجموعة موجودة دون إعادة تحميل المستندات |
--recreate-collection | false | احذف وأعد بناء مجموعة Qdrant |
ملاحظات الخصوصية
لإعداد RAG خاص، فكّر في كل طبقة على حدة:| الطبقة | اعتبار الخصوصية |
|---|---|
| تضمينات Venice | تُرسَل مقاطع المستندات إلى Venice لإنشاء المتجهات |
| محادثات Venice | يُرسَل السياق المسترجع إلى Venice للإجابة عن السؤال |
| Qdrant محلي | تبقى المتجهات والحمولات على جهازك |
| Qdrant بعيد | تُخزَّن المتجهات والحمولات حيث يعمل خادم Qdrant |
| مُعيد ترتيب FastEmbed | تعمل إعادة الترتيب محليًا بعد توفّر النموذج |
أخطاء شائعة ينبغي التعامل معها مبكرًا
| العَرَض | ما يعنيه عادةً | ما الذي ينبغي فعله |
|---|---|---|
Set VENICE_API_KEY before running this example. | متغير البيئة مفقود | صدِّر VENICE_API_KEY قبل تشغيل السكربت |
Document path does not exist | مسار مُرَّر إلى --docs خاطئ | تحقّق من مسار الملف أو المجلد |
| نتائج استرجاع فارغة | لم يُستوعَب شيء، أو يُستعلم من مجموعة خاطئة | أزل --skip-ingest أو أكّد --collection و--qdrant-path |
| خطأ في حجم متجه Qdrant | أُنشئت المجموعة بنموذج تضمين مختلف | أعد إنشاء المجموعة بعد تغيير نماذج التضمين |
| إعادة ترتيب أولى بطيئة | قد يكون FastEmbed يقوم بتنزيل أو تهيئة cross-encoder | اترك التشغيل الأول ينتهي، ثم ستكون عمليات التشغيل اللاحقة أسرع |
إلى أين تتجه بعد ذلك
بمجرد تشغيل خط الأساس، فإن أكثر التحسينات تأثيرًا تكون عادةً:- إضافة محمّلات خاصة بالمستندات لملفات PDF أو HTML أو التذاكر أو صفحات الويكي الداخلية.
- تخزين بيانات وصفية أغنى مثل العناوين والترويسات والتواريخ والمالكين والروابط.
- ضبط
candidate_kوtop_kوحجم التجزئة والتداخل على أسئلة حقيقية. - إضافة أسئلة تقييم لتتمكن من قياس جودة الاسترجاع قبل التغييرات وبعدها.
- بث إكمال محادثة Venice النهائي لتجربة محادثة تفاعلية أفضل.