عامِل الفهرسة كانتقال بين حالات
مهمة الفهرسة ليست مجرد حلقة تقرأ الملفات وتكتب المتجهات. إنها تغيّر نسخة المعرفة التي يُسمح للاسترجاع باستخدامها، ولهذا فحدّ التفعيل أهم من الحلقة نفسها.
إن حلّت المقاطع الجديدة محل القديمة واحدًا بعد آخر، فقد يستعلم المستخدمون مجموعة نصف محدّثة: مستند بنص جديد وبيانات وصفية قديمة، أو مستند لم يُكتب إلا بعض مقاطعه. النظام يعمل تقنيًا، لكن إجاباته صعبة التصديق.
النموذج الأسلم يفصل الإعداد عن التفعيل. ابنِ النسخة التالية من المستند بعيدًا عن النسخة النشطة، وتحقق منها، ثم أجرِ تغييرًا صغيرًا واحدًا في الحالة يخبر الاسترجاع أي نسخة هي الحالية.
أعطِ كل مصدر هوية ثابتة
أسماء الملفات معرّفات ضعيفة: تتغير، وتتكرر، ولا تقول شيئًا عن تغيّر المحتوى فعلًا. احتفظ بسجل فهرسة صغير لكل مصدر، حتى تتخذ المهمة قرارًا مقصودًا قبل أن تستدعي محللًا أو نموذج تضمين مكلفًا.
في Project Pavilion كل مصدر سجلّ، كمتطلب أو مهمة، ومفتاحه نوع السجل ومعرّفه. ومعرّف النقطة في Qdrant يُؤخذ من أول 16 بايت من SHA-256 لهاتين القيمتين، وكل سجل نقطة واحدة، فإعادة فهرسته تكتب فوق النقطة نفسها. يرى الاسترجاع المتجه القديم أو الجديد، لا خليطًا منهما ولا نسختين.
- مفتاح المصدر. معرّف ثابت من نظام العمل، أو من كائن التخزين، أو من قاعدة بيانات المستندات.
- بصمة المحتوى. بصمة (hash) للبايتات أو للنص بعد توحيده. التواريخ تبقى تلميحات، لا دليلًا على التغيير.
- نسخة المسار. المحلل، وقواعد التقسيم، ونموذج التضمين، ومخطط الفهرس التي أنتجت النسخة النشطة.
- حالة دورة الحياة. مكتشَف، أو قيد المعالجة، أو مجهَّز، أو نشط، أو فاشل، أو محذوف. لا ينبغي أن تخمّن المهمة أبدًا أين توقفت.
source_key
content_hash
pipeline_version
active_version
staged_version
status
last_error
updated_at أبسط سجل للفهرسة استخدم حدًّا للتفعيل
نموذج التخزين قد يختلف، لكن الخاصية المفيدة واحدة: يرى الاسترجاع المستند القديم كاملًا أو الجديد كاملًا، لا خليطًا منهما.
- الاكتشاف. اقرأ البيانات الوصفية للمصدر وقارنها بسجل الفهرسة. علّم المصادر المختفية كمرشحة للحذف، لكن لا تحذفها بعد.
- الإعداد. حلّل المستند المتغير، ووحّده، وقسّمه، وأثرِه. واحفظ المقاطع الناتجة تحت معرّف نسخة جديد.
- التضمين والتجهيز. اكتب المتجهات والبيانات الوصفية كاملة دون أن تغيّر النسخة النشطة.
- التحقق. تأكد أن النسخة المجهزة تحمل هوية المستند المتوقعة، ونصًا غير فارغ، ومتجهات صالحة، والبيانات الوصفية التي يحتاجها الاسترجاع.
- التفعيل. بدّل النسخة النشطة بعملية واحدة دائمة. وإن لم يستطع محرك التخزين فعل ذلك ذريًا، فاستخدم اسمًا بديلًا (alias) أو ملف بيان (manifest) منفصلًا يقرؤه الاسترجاع أولًا.
- التنظيف. احذف المتجهات المستبدلة لاحقًا. التنظيف لا ينبغي أن يقع على المسار الحرج لتفعيل ناجح.
التشغيل المحدود قرار منتج
التشغيل المحدود يُقرَّر قبل الانقطاع. وإلا صار كل عطل في خدمة تعتمد عليها اختيارًا مرتجلًا بين أن تعيد خطأً وأن تعيد إجابة مبنية على بيانات ناقصة.
أسلم بديل غالبًا هو آخر فهرس سليم. قد يكون قديمًا، لكن حدوده واضحة، ويمكن أن يُوسم بأنه قديم. أما الفهرس الجديد المكتوب جزئيًا فلا يملك أيًّا من الصفتين.
Project Pavilion يحسم قرارين من هذه في الكود. إن فشل التضمين أثناء فهرسة سجل، تُتخطى الكتابة ويبقى المتجه القديم. وإن وصل سؤال والتضمين متوقف، يعيد الاسترجاع سياقًا فارغًا بدل خطأ، وتُبنى الإجابة دونه، وتعود أداة البحث في المحادثة إلى استعلام SQL حين تعرف نوع السجل الذي تبحث عنه.
| الفشل | سلوك الإدخال | سلوك الاسترجاع |
|---|---|---|
| خدمة التضمين غير متاحة | أبقِ المصدر معلّقًا، وأعد المحاولة بحدود. | قدّم الفهرس النشط، ولا تفعّل متجهات فارغة. |
| المحلل يرفض مستندًا واحدًا | اعزل هذا المصدر، وأبقِ نسخته النشطة القديمة. | استمر في تقديم المستندات الأخرى، وأظهر المصدر الفاشل لفريق التشغيل. |
| مخزن المتجهات بطيء | أوقف الدفعات الجديدة حين تبلغ مهلة محددة. | أعد فشلًا مؤقتًا واضحًا، أو استخدم مسار بحث بديلًا مختبَرًا إن وُجد. |
| مخزن البيانات الوصفية غير متاح | لا تبدأ مهام لا تستطيع تسجيل حالتها. | استمر في قراءة الفهرس النشط فقط إن بقيت ملكيته ونسخته واضحتين. |
أعد محاولة العملية، لا الغموض
إعادة المحاولة مفيدة لأعطال الشبكة والخدمات المؤقتة، وخطرة حين يُحتمل أن الكتابة نجحت فعلًا والعملية غير آمنة عند التكرار. أعطِ كل مهمة، وكل نسخة مستند، وكل مقطع مفتاحًا ثابتًا لا يتغير بين المحاولات، حتى يمكن تكرار العمل نفسه دون نسخ مكررة.
الملف المشوّه ليس فشلًا مؤقتًا. بعد عدد قليل من المحاولات، أخرجه من الطابور العادي، وسجّل من السياق ما يكفي لإصلاحه. مصدر واحد سيئ لا ينبغي أن يحجز كل المصادر السليمة خلفه.
- ضع حدودًا وتفاوتًا عشوائيًا لإعادة المحاولة. الحلقات التي لا تنتهي تخفي الحوادث وتستهلك العمّال.
- أبقِ العمل الفاشل مرئيًا. طابور رسائل ميتة بلا مالك ليس إلا مكانًا آخر تضيع فيه المستندات.
- اجعل الإلغاء آمنًا. البيانات المجهزة قد تبقى للتشخيص، لكن يجب ألا تصبح نشطة بالخطأ.
- في Project Pavilion يُعاد استدعاء التضمين ثلاث مرات بانتظار يتضاعف وتفاوت عشوائي، خلف قاطع دائرة (circuit breaker). وعميل Qdrant يتوقف عن استدعائه خمس دقائق بعد فشلين عابرين متتاليين، ولا يُعدّ الطلب المشوّه فشلًا عابرًا.
سجّل رحلة المستند
لوحة الإدخال لا تحتاج عشرات الرسوم البيانية. تحتاج أن تجيب بسرعة عن أسئلة تشغيلية قليلة: ما الذي تغيّر، وما النشط، وما الذي فشل، وهل يستخدم الاسترجاع بيانات قديمة.
- اربط مفتاح المصدر، ومعرّف المهمة، ونسخة المسار، ونسخة المستند المفعّلة.
- عُدّ المصادر المكتشفة، والمتخطاة، والمجهزة، والمفعّلة، والمعزولة، والمحذوفة، كلًّا على حدة.
- سجّل زمن استجابة الخدمات التي تعتمد عليها وأعطالها، دون تسجيل نص المستندات أو أي محتوى حساس.
- أظهر لفريق التشغيل حداثة الفهرس ووقت آخر تفعيل ناجح.
- Project Pavilion يسجّل كل طلب فهرسة بمعرّف ربط قصير (correlation id)، ومصدر الطلب، ونوع العقدة، ومعرّف السجل، فتُنسب إعادة فهرسة السجل الواحد مرارًا إلى ما طلبها.
قبل الإصدار التالي للفهرسة
- هل يمكن إعادة معالجة مستند دون أن تتكرر مقاطعه النشطة؟
- هل يستطيع الاسترجاع أن يحدد نسخة نشطة واحدة كاملة؟
- هل تترك النسخة الجديدة الفاشلة النسخة السابقة صالحة للاستخدام؟
- هل يتأخر الحذف والتنظيف حتى يصبح التفعيل آمنًا؟
- هل يستطيع فريق التشغيل إيجاد مصدر فاشل واحد دون قراءة سجلات التطبيق سطرًا سطرًا؟
- هل تقول الواجهة متى قد تكون النتائج قديمة؟