البحث الهجين عمليًا: اجمع BM25 والمتجهات واختبر الاستدعاء
كيف تجمع البحث بالكلمات المفتاحية والمتجهات باستخدام RRF أو الدرجات الموزونة؟ دليل لتطبيق البحث الهجين في مخزنك الحالي وقياس الاستدعاء باستعلامات موسومة.
نُشر في

إذا كان نظام البحث يفهم السؤال لكنه لا يعثر على رمز المنتج، فأضف مسار استرجاع نصي قبل أن تستبدل نموذج التضمين. يجمع البحث الهجين قائمتين (2) من النتائج المرشحة، إحداهما تطابق الكلمات المفتاحية والأخرى تطابق المتجهات، ثم يدمجهما في ترتيب واحد. ابدأ بدمج مقلوب الرتب (RRF)، وضع قواعد صريحة للحفاظ على المعرّفات الدقيقة، ولا تعتمد التغيير إلا إذا أظهرت مجموعة استعلامات موسومة تحسنًا في الاستدعاء من دون إفساد الاستعلامات التي تعمل جيدًا بالفعل.
جرى التحقق من الوثائق في 24 أكتوبر 2026. تستند إرشادات التنفيذ أدناه إلى الوثائق الحالية لكل من Elasticsearch وWeaviate وPinecone. أما إعدادات التقييم فهي بروتوكول مقترح للبدء، وليست تحسينات مقاسة أو نتائج اختبارات أداء صادرة عن المورّدين.
ما هو البحث الهجين؟
يتيح البحث الهجين لكل من الألفاظ الحرفية والمعنى التأثير في المحتوى المسترجع. في البنية التي يتناولها هذا الدليل، ينتج البحث بالكلمات المفتاحية قائمة مرتبة، وينتج البحث المتجهي قائمة أخرى، ثم تجمعهما طريقة للدمج. يوضح شرح Weaviate هذين المسارين وكيفية دمجهما.
تخيّل باحثين يعملان على الإجابة عن سؤال الدعم نفسه. يتحقق أحدهما من الأسماء الدقيقة ونصوص رسائل الخطأ في الفهرس، بينما يبحث الآخر عن الأفكار ذات الصلة، بما فيها الإجابات المصاغة بعبارات مختلفة. تجمع أنت قائمتيهما المختصرتين بدلًا من أن تطلب من أي منهما أداء المهمتين بمفرده.
BM25 دالة لترتيب النتائج نصيًا، تمنح المستندات درجات بحسب كلمات الاستعلام التي تحتويها. يتأثر التقييم بتكرار المصطلحات وطول المستند، ما يجعله أكثر فائدة من مجرد عدّ الكلمات المتطابقة. يستخدم Elasticsearch دالة BM25 افتراضيًا لقياس التشابه النصي. وتشرح وثائق التشابه لدى Elastic هذه العوامل.
يقارن البحث المتجهي التضمينات، وهي تمثيلات رقمية للمحتوى، للعثور على المعاني المتشابهة. فقد يربط عبارة «يتكرر تسجيل خروجي من الحساب» بمستند عن انتهاء صلاحية الجلسة، رغم اختلاف الألفاظ. يشرح دليل البحث الدلالي لدينا هذا المسار في الاسترجاع.
في استعلام توضيحي مثل ERR_SESSION_EXPIRED after login، يتيح المسار النصي لرسالة الخطأ بحروفها الأصلية الوصول إلى النتائج. ويمكن للمسار الدلالي أن يضيف إرشادات حول جلسات المصادقة وتجديدها. ثم يحدد الدمج الترتيب النهائي. هذا المثال يوضح السلوك المستهدف، ولا يعني أن مخزنًا لم تُضبط إعداداته سيُنتج ترتيبًا بعينه.

البحث الهجين بالمتجهات يحتاج أيضًا إلى قواعد للمطابقة الدقيقة
وجود مسار للكلمات المفتاحية لا يضمن المطابقة الدقيقة للمعرّفات. فتحليل النص، أي تحويل السلاسل النصية إلى وحدات قابلة للبحث، قد يغيّر ما يُفهرس. على سبيل المثال، يقسّم المحلّل القياسي لدى Elastic عبارة تتضمن شرطة وصل في المثال الوارد بوثائقه. تحقّق من كيفية تعامل المحلّل الذي تستخدمه مع رموز المخزون SKU ورموز الأخطاء لديك. راجع وثائق المحلّل القياسي.
احفظ المعرّفات في حقل مخصص للمطابقة التامة عندما تكون حروف المعرّف هي ما يحدد العنصر المطلوب. توثّق Elastic حقل keyword لهذا النوع من القيم المهيكلة. فعند البحث عن رمز المخزون الافتراضي AX-BLUE، ينبغي ألا يتحول الطلب ضمنيًا إلى توصية بـAX-GREEN لمجرد تشابه الوصفين. راجع مرجع حقل Keyword.
قاعدة القرار: وجّه المعرّف الفريد الذي يتعرف عليه النظام إلى بحث بالمطابقة التامة عندما يكون ذلك من السلوك الذي يَعِد به المنتج. واستخدم الترتيب الهجين للأسئلة التي تجمع معرّفًا مع حاجة أوسع، كالبحث عن إرشادات لحل مشكلة في ذلك العنصر.
كيف تدمج النتائج: RRF أم الدرجات الموزونة؟
ابدأ بدمج مقلوب الرتب عندما تحتاج إلى خط أساس لا يتطلب معايرة مقاييس درجات مختلفة. وفكّر في الدرجات الموزونة عندما تتوفر لديك أحكام صلة موسومة لضبط التوازن، ويكون لديك سبب للحفاظ على الفوارق بين الدرجات.
دمج مقلوب الرتب يعتمد على موضع النتيجة
يجمع دمج مقلوب الرتب، أو RRF، مساهمةً من كل قائمة يظهر فيها المستند:
RRF(document) = مجموع 1 / (c + rank) عبر قوائم النتائج المسترجعة.
تبدأ الرتب من الموضع الأول. والمستند الغائب عن قائمة لا يحصل على مساهمة منها. قدّم Gordon V. Cormack وCharles L. A. Clarke وStefan Büttcher طريقة RRF في ورقتهم المنشورة في SIGIR عام 2009، وثبّتوا قيمة الثابت عند 60 في تجاربهم. تسميه الورقة k، بينما نسميه في هذا المقال c لتجنّب الخلط بينه وبين عدد النتائج في recall@k.
تتميز RRF بسهولة استخدامها لأن الدرجة المرتفعة في BM25 لا تحتاج إلى أن تحمل المعنى نفسه الذي تحمله الدرجة المرتفعة في البحث المتجهي؛ ما يهم هو موضع النتيجة فقط. ويوضح تنفيذ RRF لدى Pinecone أن الرتب تبدأ من الواحد وكيف تُعامل المستندات الغائبة.
لكن هناك أثرًا يستحق الاختبار. في مثال افتراضي، يتصدر المستند A قائمة الكلمات المفتاحية ويغيب عن قائمة المتجهات، بينما يحتل المستند B المرتبة الثانية في القائمتين. عند c = 60، يحصل A على 1/61، ويحصل B على 2/62. يتقدم B. هذه نتيجة حسابنا انطلاقًا من المعادلة، وليست نتيجة اختبار أداء للبحث.
الدرجات الموزونة تحافظ على الفوارق بين التقييمات
يجمع الدمج الموزون درجات الصلة بعد تحويل مقاييسها إلى نطاقات قابلة للمقارنة. ومن الصيغ الشائعة:
الدرجة = alpha × درجة المتجه بعد التطبيع + (1 − alpha) × درجة الكلمات المفتاحية بعد التطبيع.
يتحكم الوزن alpha في التوازن. البدء بقيمة 0.5 يمنح الطرفين معاملين متساويين، لكنه لا يثبت تساوي فائدتهما أو أن هذا هو الإعداد الأمثل. وثّق التطبيع والأوزان معًا، لأن تغيير أي منهما قد يغيّر ترتيب النتائج.
يدعم المسترجع الخطي في Elasticsearch مجموعًا موزونًا مع أدوات تطبيع مثل minmax. أما الدمج بالدرجات النسبية في Weaviate فيحافظ على الفوارق النسبية داخل كل مجموعة نتائج، بينما يتجاهلها الدمج القائم على الرتب.
اجعل RRF نقطة المقارنة الأولى، ولا تعتمد الدمج الموزون إلا إذا دعمته نتائج استعلامات الاختبار المحجوزة. لا تجمع درجات BM25 الخام مع درجات التشابه المتجهي وتفترض أن للمجموع دلالة مفيدة. وسجّل أيضًا عمق قائمة النتائج المرشحة؛ فتغيير النتائج التي تدخل قائمة مطبّعة قد يغيّر نطاق درجاتها.
متى يتفوق البحث الهجين على البحث المتجهي وحده؟
يفيد البحث الهجين عندما يسترجع مسار الكلمات المفتاحية محتوى ذا صلة يفوته المسار المتجهي، ويحافظ الدمج على موضع متقدم بما يكفي لهذا المحتوى. هذا شرط يمكن فحصه، وليس ادعاءً بتفوّق مطلق في الدقة.
أبرز الحالات التي تستحق التجربة:
- البحث في الدعم: نصوص أخطاء حرفية وأسماء دوال ومصطلحات حسابات، ممزوجة بوصف الأعراض.
- البحث في الكتالوج: أسماء منتجات أو رموز مخزون دقيقة، مع احتياجات مثل التوافق أو قطع الغيار.
- البحث في المعرفة الداخلية: أسماء مشاريع واختصارات، ضمن أسئلة باللغة الطبيعية.
تذكر نظرة Pinecone العامة على البحث الهجين تحديدًا رموز المنتجات ونصوص الأخطاء والأسماء بوصفها إشارات للكلمات المفتاحية، إلى جانب الاسترجاع بالمتجهات الكثيفة لفهم المعنى.
إذا كانت المهمة مجرد العثور على عنصر بمعرّفه، فابدأ بمطابقة تامة موثوقة. وإذا كان البحث المتجهي يخدم مجموعة المحتوى والاستعلامات لديك جيدًا بالفعل، فانتظر دليلًا على وجود مشكلة في الاسترجاع قبل إضافة مسار آخر.
الحد العملي هو تغطية النتائج المرشحة. لا يستطيع الدمج إلا ترتيب اتحاد المستندات التي استرجعتها مساراته. فإذا لم يعثر أي مسار على المقطع ذي الصلة، فلن يستعيده تغيير طريقة الدمج. أما إذا كان المقطع موجودًا قبل الدمج ثم اختفى من النتائج النهائية، فافحص الترتيب والاقتصار على عدد محدد من النتائج.
أضف البحث الهجين إلى مخزن البيانات الذي تستخدمه
احتفظ بمخزنك الحالي إذا كان يوفر مكونات الاسترجاع الأساسية التي تحتاجها. فتغيير قاعدة البيانات واستراتيجية الاسترجاع معًا يصعّب تحديد سبب التحسن.
توضح المقارنة التالية موضع تنفيذ الدمج، ولا ترتّب المورّدين بحسب الأفضلية.
البحث الهجين في Elasticsearch
يدعم محرك البحث Elasticsearch الاسترجاع النصي والمتجهي، ويمكنه وضع مسترجع نصي من نوع standard ومسترجع متجهي من نوع knn تحت مسترجع rrf. يوثّق المرجع الرسمي لمسترجع RRF هذا الترتيب ونافذة النتائج المرشحة الخاصة به.
في الفهرس القائم، اربط النص القابل للبحث وتضمينه بمعرّف المستند نفسه. نفّذ الاستعلام في المسارين على المحتوى نفسه المسموح بإدراجه، ثم طبّق الدمج. واجعل قيود المستأجر والصلاحيات وإصدار المنتج متسقة بين المسارين.
يمكنك تشغيل الطلب التالي بعد ضبط ES_URL وES_API_KEY. يفترض وجود فهرس اسمه docs، وحقل نصي اسمه text، وحقل متجهات كثيفة اسمه embedding، وملف query-vector.json يحتوي على مصفوفة التضمين الفعلية للاستعلام. أنشئ هذه المصفوفة بالنموذج نفسه المستخدم للمستندات المفهرسة. يتطلب الأمر أداتي jq وcurl.
jq -n --slurpfile v query-vector.json \
--arg q 'ERR_SESSION_EXPIRED after login' \
'{
size: 10,
retriever: {
rrf: {
retrievers: [
{standard: {query: {match: {text: $q}}}},
{knn: {
field: "embedding",
query_vector: $v[0],
k: 50,
num_candidates: 100
}}
],
rank_window_size: 50,
rank_constant: 60
}
}
}' > hybrid-request.json
curl --fail-with-body "$ES_URL/docs/_search" \
-H "Authorization: ApiKey $ES_API_KEY" \
-H 'Content-Type: application/json' \
--data-binary @hybrid-request.jsonهذه إعدادات توضيحية للتقييم. يحدد size عدد النتائج النهائي، ويتحكم rank_window_size في عدد نتائج كل مسترجع فرعي التي يمكن أن تشارك في الدمج. لا تنسخ هذا المثال الخالي من الفلاتر إلى تطبيق تحكمه صلاحيات وصول قبل إضافة قيود المحتوى المسموح به. توثّق Elastic خيار filter على مستوى المسترجع الأب، يسري على المسترجعات الفرعية وفق مواصفاتها.
موضع التعثر: قد تستبعد النافذة الضيقة للمسترجع الفرعي النتيجة نفسها التي كنت تأمل أن يستعيدها البحث الهجين. قارن النتائج المرشحة في المسارين بالنتائج النهائية قبل ضبط الدمج. وإذا انتقلت إلى المسترجع الخطي، فاضبط التطبيع إلى جانب الأوزان.
البحث الهجين في Weaviate
تتيح قاعدة البيانات Weaviate الاسترجاع النصي والمتجهي، وتوفر البحث الهجين عبر collection.query.hybrid. يعتمد مكوّنها النصي على BM25F، وهو المتغير الذي يدعم تعدد الحقول. تغطي وثائق الاستعلام الهجين الخصائص القابلة للبحث، واختيار طريقة الدمج، وشرح الدرجات.
وجّه query_properties إلى الحقول التي تقدم أدلة نصية مفيدة، مثل العناوين ونصوص الأخطاء وأسماء المنتجات. قدّم متجه الاستعلام إذا كان تطبيقك يولّد التضمينات، أو استخدم مسار توليد المتجهات المضبوط للمجموعة. حدّد fusion_type صراحةً عند مقارنة طرق الدمج، واطلب explain_score عند تشخيص سبب تغيّر موضع نتيجة.
حدّد alpha صراحةً أيضًا: تختار القيمة 0 البحث بالكلمات المفتاحية، وتختار القيمة 1 البحث المتجهي. تحذّر الوثائق الحالية من أن الترجيح الفعلي عند إغفال هذا الإعداد يعتمد على العميل. طريقة الدمج الافتراضية هي relativeScoreFusion، وتتوفر أيضًا rankedFusion. راجع مرجع الدمج في Weaviate.
موضع التعثر: لا يستطيع وزنٌ إصلاح حقل غير متاح للبحث أو معرّف تشوّه أثناء التحليل النصي. افحص مساهمة المسار النصي قبل الاستنتاج بأن نموذج التضمين يحتاج إلى الاستبدال. استخدم طرفَي نطاق الوزن، أي البحث المتجهي وحده والبحث بالكلمات المفتاحية وحده، كخطَّي أساس للتشخيص، ثم قيّم الإعداد الذي يجمعهما.
البحث الهجين في Pinecone
توثّق قاعدة بيانات الاسترجاع Pinecone أنماطًا مختلفة للبحث الهجين. اختر النمط قبل نسخ أي مثال، لأن دمج المتجهات الكثيفة والمتناثرة على الخادم ودمج RRF في العميل تنفيذان مختلفان. راجع نظرة Pinecone العامة على البحث الهجين.
لجمع BM25 مع الاسترجاع الكثيف، ينفّذ مسار Documents API بحثًا نصيًا كاملًا وبحثًا بالمتجهات الكثيفة، ثم يدمج قائمتَي معرّفات المستندات المرتبتين باستخدام RRF داخل تطبيقك. يتضمن دليل RRF من Pinecone هذا التنفيذ في العميل.
أما الدمج المدمج للمتجهات الكثيفة والمتناثرة، فتتيح Vectors API تخزين التمثيلين في كل سجل وجمعهما في استعلام واحد. يشترط دليل الفهرس الواحد الإعدادين vector_type="dense" وmetric="dotproduct"؛ ويضرب العميل متجهات الاستعلام في معاملات لضبط تأثيرها النسبي.
المتجه المتناثر صيغة تمثيل، وليس دليلًا على أن BM25 هو الذي أنتجه. اذكر النموذج النصي أو دالة تقييم البحث النصي الكامل بوضوح في توثيق البنية.
موضع التعثر: تطبيق فلتر بالكلمات المفتاحية ثم ترتيب النتائج بالمتجهات الكثيفة يختلف عن إتاحة تأثير الإشارتين معًا في الترتيب. الفلتر يستبعد نتائج مرشحة، ولا يمكنه استعادة تطابق قائم على مرادف سبق أن استبعده. استخدم الفلتر لشرط إلزامي، والدمج عندما تريد السماح لأي من مسارَي الاسترجاع بالمساهمة بنتيجة.
ما دور البحث الهجين في RAG؟
يغيّر البحث الهجين مرحلة الاسترجاع في التوليد المعزّز بالاسترجاع، أو RAG، حيث يزوّد التطبيق نموذجًا لغويًا بمحتوى مصدري مسترجع قبل أن يجيب. وهو لا يحل محل مرحلة التوليد، ولا يثبت صحة الإجابة.
حافظ على اتساق وحدة الاسترجاع. إذا كان مسار الكلمات المفتاحية يعيد مستندات كاملة والمسار المتجهي يعيد مقاطع، فحدّد كيفية الربط بين معرّفاتها قبل الدمج. وإلا فقد تزاحم مقاطع متكررة من مصدر واحد بقية المصادر ذات الصلة وتُخرجها من القائمة المختصرة. يشرح دليل قواعد البيانات المتجهية لدينا أسس التخزين والاسترجاع.
يضيف Agentic RAG قرارات حول إجراء الاسترجاع الذي ينبغي اتخاذه أو الحاجة إلى البحث مجددًا. ويمكن أن يكون الاسترجاع الهجين أحد هذه الإجراءات. إذا كان روبوت الدعم يفوّت رمز خطأ حرفيًا، فأصلح هذا المسترجع وقيّمه قبل إضافة مزيد من تنسيق الإجراءات.
ثبّت النموذج المولّد ونص التوجيه أثناء مقارنة الاسترجاع. وإذا تحسنت فئة المطابقة الحرفية وظل الاسترجاع عند إعادة الصياغة ضعيفًا، فاستخدم الاستعلامات الموسومة نفسها لمقارنة نماذج التضمين. فتغيير التضمين وتقسيم النص والدمج في الوقت نفسه يمنعك من تحديد سبب النتيجة.
قياس recall@k قبل التغيير وبعده
استخدم مجموعة صغيرة من الاستعلامات الموسومة، وقارن الاسترجاع بالكلمات المفتاحية وحدها، وبالمتجهات وحدها، والاسترجاع الهجين، بالرجوع إلى الإجابات نفسها. طلاقة الإجابة المولّدة ليست مقياسًا لجودة الاسترجاع.
Recall@k = عدد المعرّفات ذات الصلة المسترجعة ضمن أول k نتائج ÷ عدد جميع المعرّفات الموسومة بأنها ذات صلة بذلك الاستعلام. احسب متوسط قيم الاستعلامات للحصول على المتوسط الكلي لـrecall@k، المعروف باسم macro recall@k. وإذا كانت وسومك غير مكتملة، فسمِّ النتيجة استدعاءً مقاسًا بأحكام الصلة المعروفة؛ فهي لا تثبت مستوى الاستدعاء عبر كل العناصر ذات الصلة في مجموعة المحتوى.
كوّن مجموعة صغيرة من الاستعلامات
ابدأ بـ60 استعلامًا يمكن الإجابة عنها: 20 للمطابقة الحرفية، و20 بصياغات بديلة، و20 تجمع النوعين. هذه فئات مقترحة لأعباء العمل، وليست ضمانًا لكفاية حجم العينة. استقِ الاستعلامات من عمليات بحث حقيقية متى أمكن، وأدرج الأسماء ورموز المخزون ونصوص الأخطاء التي يفشل النظام حاليًا في العثور عليها.
خصص نصف كل فئة للتطوير، واحجز النصف الآخر للاختبار. وأضف على نحو منفصل 6 استعلامات تتعمد اختيارها بحيث لا يمكن الإجابة عنها؛ راجع سلوك النظام معها، لكن استبعدها من حساب الاستدعاء لأن مجموعة النتائج ذات الصلة فارغة، ومن ثم لا تصلح مقامًا للحساب.
حدّد وحدات الاسترجاع ذات الصلة وضع وسومها
سجّل لكل استعلام معرّفه وفئته ومعرّف كل مستند أو مقطع تستطيع إثبات صلته به. اجمع النتائج المرشحة من طرق الاسترجاع الثلاث، وأضف الإجابات المعروفة التي لم تسترجعها أي منها، ثم احكم على صلتها من دون معرفة الطريقة التي قدمتها. استخدم معرّفات ثابتة، والتزم طوال التقييم بوحدة واحدة: المستند أو المقطع.
ثبّت ظروف المقارنة
استخدم اللقطة نفسها من المحتوى، والصلاحيات نفسها، ونموذج التضمين نفسه، وطريقة تقسيم النص نفسها. ابدأ بقيمة k نهائية تساوي 10، وبـ50 نتيجة مرشحة من كل مسار هجين. هذه إعدادات أولية للفحص، وليست قيمًا مثلى. عطّل إعادة الترتيب في المقارنة الأولى.
صدّر المعرّفات بترتيبها النهائي من كل طريقة. واحفظ أيضًا قائمتَي النتائج المرشحة للكلمات المفتاحية والمتجهات قبل الدمج، حتى تميّز مشكلة غياب النتيجة المرشحة من مشكلة ترتيبها.
اضبط الإعدادات ثم اختبر المجموعة المحجوزة
اضبط الدمج وعمق النتائج المرشحة على النصف المخصص للتطوير. اختر الإعداد، ثم قيّم النصف المحجوز مرة واحدة. اعرض نتائج كل فئة إلى جانب المتوسط العام، وافحص الاستعلامات التي تراجعت نتائجها كلًّا على حدة. التحسن الطفيف في المتوسط سبب لمزيد من الفحص، وليس إثباتًا إحصائيًا.

شغّل أداة تقييم الاستدعاء محليًا
احفظ الشيفرة التالية باسم evaluate_recall.py. وهي تستخدم المكتبة القياسية في Python 3 فقط. يحتوي qrels.jsonl على كائن JSON واحد لكل استعلام، بحقول qid وslice وrelevant. ويربط كل ملف نتائج معرّف الاستعلام بقائمة معرّفات النتائج المسترجعة مرتبةً.
مثلًا، يمكن أن يكون سجل الوسم {"qid":"q-exact","slice":"exact","relevant":["guide-login"]}، ويمكن أن يحتوي ملف النتائج على {"q-exact":["guide-reset","guide-login"]}. هذه أمثلة توضيحية للتنسيق، وليست نتائج بحث من نظام خضع للاختبار. أدرج كل استعلام موسوم في كل ملف نتائج، واستخدم قائمة فارغة عندما لا يعيد الاسترجاع شيئًا.
import json
import sys
from collections import defaultdict
from statistics import mean
qrels_path, bm25_path, vector_path, hybrid_path, cutoff = sys.argv[1:]
k = int(cutoff)
if k < 1:
raise ValueError("k must be positive")
with open(qrels_path, encoding="utf-8") as f:
labels = [json.loads(line) for line in f if line.strip()]
if not labels or len({r["qid"] for r in labels}) != len(labels):
raise ValueError("Labels must be nonempty with unique query IDs")
runs = {}
for name, path in (("bm25", bm25_path), ("vector", vector_path),
("hybrid", hybrid_path)):
with open(path, encoding="utf-8") as f:
runs[name] = json.load(f)
missing = {r["qid"] for r in labels} - runs[name].keys()
if missing:
raise ValueError(f"{name} is missing query IDs: {sorted(missing)}")
groups = defaultdict(list)
skipped = 0
for row in labels:
relevant = set(row["relevant"])
if not relevant:
skipped += 1
continue
scores = {}
for name, run in runs.items():
unique_ids = list(dict.fromkeys(run[row["qid"]]))
scores[name] = len(relevant & set(unique_ids[:k])) / len(relevant)
groups["overall"].append(scores)
groups["slice:" + row["slice"]].append(scores)
if not groups:
raise ValueError("No answerable queries to score")
for group, rows in sorted(groups.items()):
values = {name: mean(r[name] for r in rows) for name in runs}
delta = values["hybrid"] - values["vector"]
report = " ".join(f"{name}={v:.3f}" for name, v in values.items())
print(f"{group} n={len(rows)} recall@{k} {report} delta={delta:+.3f}")
print(f"Excluded no-answer queries: {skipped}")شغّل الأداة على الوسوم والنتائج المصدّرة الخاصة بالمجموعة المحجوزة:
python3 evaluate_recall.py qrels.jsonl bm25.json vector.json hybrid.json 10تحذف الشيفرة المعرّفات المكررة قبل الاقتصار على العدد المحدد من النتائج. طبّق سياسة إزالة التكرار نفسها في التطبيق. وتعرض مقدار تغير الاسترجاع الهجين مقارنةً بالبحث المتجهي، إلى جانب خط أساس الكلمات المفتاحية، حتى لا يُستبعد من المقارنة نظام نصي قوي الأداء.
اعتمد التغيير عندما تتحسن فئات الاستعلامات المعنية وتكون حالات التراجع مقبولة وفق متطلبات منتجك. إذا تحسنت النتائج المرشحة ولم يتحسن الاستدعاء النهائي، فاضبط الدمج أو حدّ النتائج. وإذا تحسن الاستدعاء النهائي، فراجع على نحو منفصل ترتيب النتائج وصحة الإجابات المولّدة وزمن الاستجابة من البداية إلى النهاية. مقياس الاستدعاء لا يقيس أيًا من ذلك نيابةً عنك.
أين تكمن المبالغة، وما الخطوة التالية؟
عبارة «البحث الهجين يجمع أفضل ما في العالمين» تحجب القرار الهندسي وراءها. فقد يوسّع تغطية المحتوى المفيد، لكنه يمنح أيضًا مسار استرجاع إضافيًا تأثيرًا في القائمة النهائية. قد تخفّض RRF ترتيب تطابق دقيق، وقد يرجّح الدمج الموزون كفة أحد المسارين بسبب اختلاف سلوك مقياس الدرجات أو التطبيع. ولا يعوّض أي منهما غياب المحتوى المصدري.
على المطوّرين البدء الآن عندما يكشف الفحص غياب مستندات ذات صلة تتضمن المصطلحات الدقيقة عن قائمة النتائج المرشحة المتجهية. أضف المسار النصي، وحافظ على اتساق هوية المستندات والصلاحيات، ثم نفّذ المقارنة باستخدام الاستعلامات الموسومة.
على فرق التشغيل تأجيل الإطلاق عندما تكون المشكلة الحالية محتوى قديمًا أو صلاحيات مفقودة أو غياب وسوم الصلة. عالج هذه المتطلبات أولًا، ثم قارن استراتيجيات الاسترجاع.
الفرق التي لديها بحث موثوق بالمعرّفات لا تحتاج إلى تغيير ما لم تصبح بحاجة إلى اكتشاف محتوى أوسع. احتفظ بمسار المطابقة الموثوق، وقيّم البحث الهجين بصورة مستقلة لأسئلة اللغة الطبيعية.
خطوتك في بداية الأسبوع: اجمع عمليات البحث التي تفشل، وحدّد مصادر الإجابات المتوقعة وضع لها وسوم الصلة، ثم شغّل المسترجع المتجهي الحالي إلى جانب خط أساس للكلمات المفتاحية. أضف الدمج بعد أن تتضح مساهمة كل مسار، واحتفظ بالإعداد الذي يثبت فائدته على استعلامات الاختبار المحجوزة.
الأسئلة الشائعة
هل تُعد BM25 بحثًا هجينًا؟
لا. BM25 دالة للترتيب النصي. جمع نتائجها مع مسار استرجاع متجهي هو أحد أشكال البحث الهجين.
هل يستخدم ChatGPT البحث الدلالي؟
لا يمكن تحديد خوارزمية الاسترجاع من إجابة مولّدة وحدها. وفي نظام تبنيه حول نموذج لغوي، افحص مسار الاسترجاع المضبوط بدلًا من افتراض أنه يستخدم BM25 أو المتجهات أو RRF.
ما البحث الدلالي؟ وهل من مثال؟
يمكن لاستعلام مثل «يتكرر تسجيل خروجي من الحساب» أن يطابق إرشادات عن انتهاء صلاحية الجلسة رغم اختلاف الألفاظ. هذا استرجاع قائم على المعنى، لكن نص رسالة خطأ بعينه قد يظل بحاجة إلى مطابقة نصية.
ما المثال العملي على البحث الهجين؟
مع الاستعلام ERR_SESSION_EXPIRED after login، استرجع التطابقات الحرفية لنص الخطأ عبر مسار الكلمات المفتاحية، والإرشادات المتعلقة بالجلسة عبر المسار المتجهي. ادمج النتائج المرشحة، ثم تحقّق من المصادر المتوقعة بالرجوع إلى وسوم الصلة لديك.
ما الفرق الأساسي بين البحث الهجين والبحث المتجهي؟
يسترجع البحث المتجهي الخالص النتائج بحسب تشابه التضمينات. أما النهج الهجين الموضّح هنا فيضيف الاسترجاع عبر مسار للكلمات المفتاحية، ويجمع الأدلة في قائمة نتائج واحدة.
هل البحث الهجين هو نفسه البحث الدلالي؟
لا. يمكن أن يكون الاسترجاع الدلالي أحد مكونات البحث الهجين. يصف مصطلح «هجين» الجمع بين إشارات الاسترجاع، ولا يحدد خوارزمية دمج واحدة بعينها.
هل يعتمد Google على البحث الدلالي؟
يستخدم Google Search فهم المعنى ضمن أنظمة الترتيب لديه. ويوثّق Google نظامَي BERT والمطابقة العصبية في دليل أنظمة الترتيب. لكن ذلك لا يثبت أن بنيته الكاملة تتبع تصميم BM25 مع المتجهات الذي يشرحه هذا المقال.
ما الفرق بين RAG والبحث الدلالي؟
يسترجع RAG محتوى مصدريًا ويستخدمه أثناء توليد الإجابة. أما البحث الدلالي فهو نهج استرجاع يمكن أن يوفّر ذلك المحتوى. ويمكن لتطبيق RAG أيضًا استخدام الاسترجاع بالكلمات المفتاحية أو الاسترجاع الهجين.
ما البحث الهجين وكيف يعمل؟
في البنية التي يشرحها هذا الدليل، شغّل الاسترجاع بالكلمات المفتاحية والمتجهات على المحتوى المسموح به، واجمع النتائج المرشحة بحسب معرّفات ثابتة، ورتّبها باستخدام RRF أو طريقة مدروسة للدرجات الموزونة. قيّم النتائج النهائية بالرجوع إلى استعلامات موسومة قبل الإطلاق.
- تاريخ النشر
- التصنيف
- Build
- اللغة










