بناء مساعد RAG جاهز للإنتاج: التضمينات (Embeddings) وpgvector وإجابات موثَّقة بمصدرها
AI & ML
By Syed Sartaj Ahmed · 6/29/2026 · 6 min read
التوليد المعزَّز بالاسترجاع (Retrieval-Augmented Generation أو RAG) هو أكثر الطرق موثوقيةً التي أعرفها لجعل نموذج لغوي كبير (LLM) يجيب من بياناتك أنت بدلًا من نسج الخيال. وفيما يلي كيف بنيتُ نظامًا يعمل فعليًا في الإنتاج — مساعدًا داخل التطبيق يجيب اعتمادًا على توثيق المنتج نفسه، موثَّقًا بمصدره وقليل الهلوسة.
لماذا RAG بدلًا من الضبط الدقيق (fine-tuning)
يُدمج الضبط الدقيق (fine-tuning) المعرفة داخل أوزان النموذج، بينما يُبقي RAG المعرفة في مخزن يمكنك تحديثه في أي وقت. وبالنسبة لمنتج يتغيّر توثيقه أسبوعيًا، يتفوّق RAG: أعد فهرسة المحتوى المتغيّر فيصبح المساعد محدَّثًا — دون جولة تدريب ودون مخاطرة على النموذج.
خط المعالجة (Pipeline)
أربع مراحل، كلٌّ منها قابلة للاختبار على نحو مستقل:
- التقطيع إلى مقاطع (Chunking). قسّم المستندات المصدرية بحسب العناوين إلى مقاطع صغيرة بما يكفي لتكون محدَّدة، وكبيرة بما يكفي لتحمل السياق. فالإفراط في التقطيع يمزّق المعنى، والتقصير فيه يُضعف الاسترجاع.
- التضمينات (Embeddings). حوّل كل مقطع إلى متجه (vector) باستخدام نموذج تضمين (استخدمتُ نموذج Voyage الخفيف). ويجب أن يُضمِّن النموذج نفسه كلًّا من المستندات وسؤال المستخدم.
- مخزن المتجهات (Vector store). خزّنتُ المتجهات مباشرةً داخل PostgreSQL باستخدام
pgvectorوفهرس IVFFlat، بحيث يعيش الاسترجاع إلى جانب بقية بيانات التطبيق — قاعدة بيانات واحدة، ونسخ احتياطي واحد. - الاسترجاع والتوليد (Retrieval & generation). ضمِّن السؤال، واسحب أقرب المقاطع (top-k)، ومرّرها إلى نموذج اللغة (LLM) بوصفها أساسًا موثِّقًا، مع تعليمات صارمة بالإجابة من السياق المُقدَّم فقط.
الضبط الذي أحدث فرقًا حقيقيًا
مع IVFFlat، يوازن إعداد probes بين السرعة والاستدعاء (recall). فإذا كان منخفضًا جدًا فاتت المساعدَ مقاطعُ ذات صلة، وإذا كان مرتفعًا جدًا ارتفع زمن الاستجابة (latency). لقد ضبطتُ قيمة probes مقابل مجموعة تقييم صغيرة من أسئلة حقيقية، وقِستُ مدى ملاءمة الإجابة لا مجرد مسافة المتجه الخام.
أما الرافعة الكبيرة الأخرى فكانت الفهرسة العَكوسة (idempotent indexing): ربط كل مقطع ببصمة محتوى (content hash) بحيث لا تعيد عمليات التشغيل المتكررة تضمين ما تغيّر فحسب، مع تنظيف المتجهات اليتيمة عند حذف المستندات المصدرية. وهذا يبقي الفهرس أمينًا وزهيد التكلفة في الصيانة.
إبقاء الإجابات موثَّقة بمصدرها
التوثيق بالمصدر انضباطٌ في صياغة التوجيه (prompt) وفي تصميم المنتج، لا سطرٌ واحد. فتوجيه النظام يأمر النموذج بأن يقول “لا أعرف” حين لا يغطي السياق السؤال، وتُظهر واجهة المستخدم المقاطع التي اعتمدت عليها الإجابة. وهذه العادة وحدها — أن تُظهر مصادرك — تفعل للثقة أكثر مما يفعله أي حيلة فك ترميز ذكية.
الخلاصات
- عامِل جودة الاسترجاع بوصفها مقياسًا من الدرجة الأولى، وقيّمها كما تقيّم أي نموذج.
- اجعل المتجهات بجوار بيانات تطبيقك إن استطعت — فإن pgvector كافٍ لمعظم المنتجات.
- اجعل الفهرسة عَكوسة (idempotent) منذ اليوم الأول، فستعيد تشغيلها باستمرار.
ليس RAG سحرًا، بل هو سباكة — سباكة جيدة. أتقِن المراحل الأربع فيبدو المساعد وكأنه قرأ الدليل فعلًا.
Tags: RAG, Embeddings, pgvector, LLM, Vector search