أقوم ببناء سير عمل AI يستخدم Vector Store Retriever متصل بـ PGVector

وصف المشكلة/الخطأ/السؤال

أنا أقوم ببناء سير عمل للذكاء الاصطناعي يستخدم Vector Store Receiver متصلاً بـ PGVector. في معظم الأوقات يسترجع المستند الصحيح، لكن في بعض الأحيان يتم ترتيب مستند أقل صلة أعلى من المستند المتوقع فعلياً. لقد تأكدت بالفعل من أن المستندات مُضمنة بشكل صحيح وأن نفس نموذج التضمين يُستخدم للفهرسة والاستعلام. هل هناك أي شيء يجب الانتباه له لتحسين جودة الاسترجاع

ما هو رسالة الخطأ (إن وجدت)؟

يرجى مشاركة سير عملك

(حدد العقد على لوحتك واستخدم اختصارات لوحة المفاتيح CMD+C/CTRL+C و CMD+V/CTRL+V لنسخ ولصق سير العمل.)

شارك الناتج الذي أرجعته العقدة الأخيرة

معلومات حول إعداد n8n الخاص بك

  • إصدار n8n: 1.123.x
  • قاعدة البيانات (الافتراضية: SQLite):
  • إعداد n8n EXECUTIONS_PROCESS (الافتراضي: own, main):
  • تشغيل n8n عبر (Docker, npm, n8n cloud, سطح المكتب):
  • نظام التشغيل:

مرحبا @Oluwanifemi، بينما تنتظر رد، إليك بعض الأشياء التي قد تساعدك:

الموارد المقترحة

تم المطابقة تلقائيًا مع سؤالك.

الوثائق:

المنتدى:

@merarisosa, @jabbson - لقد ساعدتما في حل مشاكل مشابهة من قبل، هل يمكنكما إلقاء نظرة؟

اقتراح تلقائي من بوت مجتمع n8n. إنه اختبار تجريبي - يرجى مشاركة ملاحظاتك هنا.

مرحباً @Oluwanifemi

إذا كانت وثيقة أقل صلة تحتل مرتبة أعلى، فغالباً ما يكون السبب أن الرسالة الأساسية للوثيقة ذات الصلة “مخففة” بواسطة النص المحيط في مقطعها، أو أن المقطع كان صغيراً جداً لتوفير سياق كافٍ.

  • اضبط حجم المقطع والتداخل: في عقدة Text Splitter الخاصة بك، جرب أحجام مقاطع مختلفة. إذا كانت المقاطع كبيرة جداً (مثل >1000 رمز)، فإنها تحتوي على موضوعات متعددة، مما يجعل المتجه “متوسطاً” لمفاهيم غير مترابطة. إذا كانت صغيرة جداً (<200 رمز)، فإنها تفتقر إلى السياق. جرب حجماً بين 400-800 رمز مع تداخل بنسبة 10-20%.
  • أضف سياقاً إلى المقاطع: إذا كنت تقسم ملفات PDF أو markdown كبيرة، أضف عنوان الوثيقة أو رأس القسم في بداية كل مقطع قبل التضمين. يمكنك القيام بذلك باستخدام عقدة Edit Fields (Set) أو عقدة Code مباشرة قبل Vector Store Receiver. هذا يفرض على نموذج التضمين ربط المتجه بسياق الوثيقة/القسم المحدد.

تحسب قواعد بيانات المتجهات المسافة بين النقاط باستخدام صيغ رياضية. إذا كان المقياس لا يطابق كيفية تدريب نموذج التضمين المحدد لديك، فستكون التصنيفات منحرفة.

  • تحقق من عقدة PGVector: في تكوين عقدة Vector Store Tool / PGVector الخاصة بك، تأكد من تعيين مقياس التشابه على Cosine Distance (أو Cosine Similarity). يتم تحسين معظم نماذج التضمين الحديثة (مثل text-embedding-3-* من OpenAI و Cohere و Mistral) لتشابه جيب التمام. إذا تم تعيينها على L2 (Euclidean) أو Inner Product، فقد يؤدي ذلك إلى احصول المستندات غير ذات الصلة على درجات أعلى.

هل هذا يساعدك؟

شيء جدير بالتحقق منه هو نوع الفهرس الموجود على عمود PGVector الخاص بك؟ إذا كان ivfflat أو hnsw، فهذا يعني أنك تقوم بالفعل بحث الجار الأقرب التقريبي. إذا كنت تستخدم الإعدادات الافتراضية، فقد يعني “التقريبي” أنه يتم فقدان المطابقة الفعلية الأقرب وليس مجرد إعادة تصنيفها.

بالنسبة إلى ivfflat، تحقق من عدد قائمتك وزيادة “probes” في وقت الاستعلام. المزيد من probes أقرب إلى البحث الدقيق ولكن حتى عدد probes أعلى لا يضمن التكافؤ. بالنسبة إلى hnsw، تحقق من “ef_search”. هذا شيء سريع للقضاء عليه قبل محاولة إعادة ترتيب البحث، خاصة لأنه يمكن أن يكون تغييراً بسيطاً في سطر واحد من SQL.

مرحبا @Oluwanifemi
عقدة مخزن المتجهات لديها أوضاع الإدراج والحصول والاسترجاع لكن لا توجد أوضاع الاستبدال أو الحذف، لذلك في كل تشغيل لسير العمل الخاص بك يتم إضافة نسخة جديدة من كل جزء بدلاً من تحديث الصفوف الموجودة بالفعل. تتنافس النسخ الأقدم المتطابقة تقريباً مع الجزء الحالي وقد تحتل أفضل المواضع في المسترجع، الأمر الذي يظهر بالضبط كمستند خاطئ عرضي يفوز. عد الصفوف وقارنها مع ما يجب أن ينتجه تمرير إدراج واحد:

SELECT count(*) FROM your_table;

إذا كان الناتج مضاعفاً لما تتوقعه، امسح الجدول، وفهرس مرة واحدة، وحذف الصفوف لمصدر قبل إعادة فهرسته من الآن فصاعداً.

مزيد من المعلومات حول إعداد RAG الأوسع هنا:
https://axshul.site/n8n/guide/vector-stores-and-rag/

إذا كنت قد استبعدت بالفعل عدم تطابق نموذج الدمج، فيجب أن تنظر في كيفية تقسيم المستندات. الكثير من مشاكل الاسترجاع تأتي من أجزاء تحتوي على مواضيع متعددة، مما يجعل الدمج أقل تركيزاً

شيء آخر يجب التحقق منه هو ما إذا كانت مستنداتك تحتوي على الكثير من الصياغة المتكررة أو القوالب. إذا كان كل سجل يبدأ بنفس الفقرات، فإن الدمجات تنتهي بها أقرب بعضها من بعض أكثر مما تتوقع، مما يجعل من الصعب على PGVector ترتيب أفضل مطابقة

أخيراً، لا تعتمد كثيراً على درجة التشابه نفسها. قارن النتائج الخمس الأولى بدلاً من ذلك. إذا كان المستند الصحيح يظهر بشكل متسق بالقرب من الأعلى لكن ليس أولاً، فإنها عادة ما تكون مشكلة في جودة البيانات وليست مشكلة في PGVector

مرحباً @Oluwanifemi

هذا ليس خطأ برمجي. هذا هو السلوك الطبيعي للبحث المتجهي أحادي المرحلة: يقيس تشابه جيب التمام التشابه الموضوعي، وليس الملاءمة. عندما تكون كتل نصية ضمن ~0.03 مسافة جيب التمام، فأي منها يحتل المرتبة الأولى يعتبر في الأساس ضوضاء. عدم وجود أخطاء في تضمينات الكلمات لا يمنع هذا.

الحل (5 دقائق، أصلي في n8n منذ الإصدار 1.98):

  1. في عقدة PGVector Vector Store، اضبط Limit على 20 (الافتراضي هو 4).
  2. Options → Add option → Rerank Results → فعّل.
  3. يظهر موصل Reranker في أسفل العقدة — أرفق عقدة فرعية Reranker Cohere، النموذج rerank-v3.5.
  4. اترك توصيلات Vector Store Retriever والسلسلة كما هي.

لماذا يعمل: نموذج التضمين الخاص بك قام بترميز المستندات دون أن يرى الاستعلام أبداً. معيد الترتيب هو محول تقاطعي — يقرأ الاستعلام والكتلة معاً ويسجل الملاءمة الفعلية. بطيء جداً للمجموعة الكاملة، مثالي لأكثر من 20 مرشح.

اضبط Limit كرقم عادي، وليس كتعبير — n8n#14151 يتجاهل التعابير بصمت هناك ويعود إلى 4.