اختبار الموجّهات

اختبار الموجّهات (Prompt testing) يتحقق من أن الموجّه — أي التعليمات والأمثلة والمتغيرات التي يرسلها التطبيق إلى النموذج اللغوي — يعطي مخرجات مقبولة لمجموعة ثابتة من مدخلات الاختبار، ومن أن كل إصدار جديد منه يحافظ على ما أجاده الإصدار السابق. فأنت تختبره كأي جزء آخر من النظام: مقابل أساس اختبار، وبحالات اختبار مصمَّمة، ونتائج مسجَّلة.

مثال: موجّه مساعد خدمة العملاء في متجر يقول: «أجب بلغة العميل» و«حوّل كل شكوى عن منتج تالف إلى موظف بشري». وتضم مجموعة الاختبار (Test set) سؤالاً بالعربية عن التوصيل، وشكوى بالهندية عن غلاية وصلت مكسورة، وطلباً بالإنجليزية لخدمة لا يقدّمها المتجر. وتنص كل حالة على ما يجب أن تفعله كل إجابة مقبولة، فتُطبَّق التحققات نفسها على الإصدار ⁦3⁩ من الموجّه اليوم وعلى الإصدار ⁦4⁩ غداً.

لماذا يهم

تتغيّر الموجّهات أكثر من أي جزء آخر تقريباً في تطبيق LLM، وتعديل جملة واحدة قد يغيّر السلوك في حالات لا علاقة ظاهرة لها به. ولا يوجد مترجم برمجي ولا فحص للأنواع يراجع تعليمات مكتوبة بلغة طبيعية: فقد يُسقط موجّه أوضح صياغةً شرطاً من شروط السياسة، أو يبدّل لغة الإجابة، أو يتوقف عن تحويل الشكاوى. ومن دون مجموعة اختبار وخط أساس (Baseline) مسجَّل، يصل هذا الانحدار إلى المستخدمين دون أن يلاحظه أحد.

أما للمختبِر، فاختبار الموجّهات يحوّل عبارة «يبدو الموجّه الجديد أفضل» إلى دليل: أي الحالات تحسّنت، وأيها انكسرت، وعلى أي نموذج وإصدار موجّه. كما يجعل إعادة إنتاج عيوب LLM أسهل، لأن التقرير الذي يذكر إصدار الموجّه والنموذج والمدخل يمكن إعادة تشغيله.

ما الذي يخضع للاختبار بالضبط

رأيت في دليل اختبار LLM أن موجّه النظام (System prompt) مواصفة مكتوبة بلغة طبيعية. لكن ما تديره بالإصدارات وتختبره أوسع قليلاً: كل ما يتحكم فيه فريقك ويشكّل الإجابة، تعامله كإعداد واحد بمعرّف واحد، بحيث يمكن تتبّع كل نتيجة إلى ما أنتجها.

وكل تعليمة شرط اختبار (Test condition): اكتب حالة يكون اتباعها فيها مطلوباً، وأخرى يجعل فيها مستخدم عادي اتباعها صعباً. والأقسام والحدود وقواعد القرار من تصميم الاختبار ما زالت صالحة هنا.

  • موجّه النظام: الدور والنطاق والقواعد والنبرة وصيغة المخرجات.
  • القالب ومتغيراته، مثل {customer_name}، التي تُملأ وقت التشغيل؛ فاختبرها فارغةً وطويلةً جداً وبأنظمة كتابة أخرى.
  • الأمثلة المضمَّنة (Few-shot examples)، أي مدخلات نموذجية مع إجاباتها المثالية تُكتب في الموجّه لتوضيح المطلوب: تغييرها أو إعادة ترتيبها تغيير في الموجّه.
  • معرّف النموذج ومعاملاته مثل درجة الحرارة (Temperature): فالنص نفسه قد يتصرف بشكل مختلف مع إصدار آخر من النموذج أو إعدادات أخرى.

بناء مجموعة اختبار من المدخلات

مجموعة اختبار الموجّه ملفٌ تُدار إصداراته ويضم حالات اختبار، لكل منها مدخل وقيم المتغيرات والتحققات التي يجب أن تجتازها كل إجابة مقبولة. وهي من مواد الاختبار (Testware): تُراجَع وتُحفظ في المستودع ولا تتغيّر إلا عن قصد. واحتفظ بجزء محجوز (Held-out) لا يُستخدم إلا لقبول الإصدار؛ فالموجّه الذي يُضبط حتى يجتاز حالات قبوله يبدو على الورق أفضل مما هو عليه.

استمدّ الحالات من عدة مصادر. والمقتطف أدناه بصيغة YAML لسهولة القراءة، وكثيراً ما تحفظ الفرق البنية نفسها بصيغة JSON Lines.

  • التعليمات: حالة تتبع كل تعليمة، وأخرى تضعها تحت الضغط.
  • الطلبات الحقيقية: النوايا المتكررة من السجلات أو تذاكر الدعم، بعد إزالة البيانات الشخصية.
  • التنوّع: صياغة رسمية وغير رسمية، وأخطاء إملائية، والعربية والهندية وأنظمة كتابة مختلطة، ومدخلات قصيرة جداً وطويلة جداً.
  • خارج النطاق: أسئلة يجب أن يعتذر عنها المساعد أو يعيد توجيهها.
  • الحالات الحرجة: قواعد السلامة والخصوصية والتحويل التي يجب أن تنجح في كل مرة.
  • الإخفاقات السابقة: كل عيب في الموجّه تصلحه يصبح حالة.
# support-set v7: 3 of its 40 cases
- id: DEL-004
  input: "متى يصل طلبي رقم 5521؟"
  vars: { order_status: shipped }
  checks: [valid_json, language_is_ar, mentions_order_5521]
- id: CMP-002
  input: "मेरी केतली टूटी हुई आई है"
  checks: [valid_json, language_is_hi, handoff_is_true]
  critical: true
- id: OOS-001
  input: "Can you book me a flight to Riyadh?"
  checks: [valid_json, declines_politely, no_invented_service]

جرّبها: مدقّق JSON Lines جرّبها: مولّد بيانات اختبار متعددة اللغات جرّبها: مولّد مجموعات بيانات Unicode

إدارة إصدارات الموجّهات

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

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

  • تغيير واحد في كل إصدار مع سببه: «v4: اجعل الإجابات أقل من ⁦60⁩ كلمة؛ وجد العملاء الردود طويلة».
  • لا تعدّل إصداراً مقبولاً في مكانه، بل أنشئ الإصدار التالي، فيصبح التراجع مجرد عودة إلى المعرّف السابق.
  • قارن نصّي الإصدارين قبل الاختبار لترى أي التعليمات تغيّرت وأي الحالات يُتوقع أن تتأثر.

جرّبها: مقارنة النصوص (Diff)

انحدار الموجّه: قارن بخط الأساس حالةً بحالة

انحدار الموجّه (Prompt regression) حالةٌ نجحت مع الإصدار المقبول وتفشل مع الإصدار الجديد. وتكشفه بمقارنة الإصدار المرشّح بخط الأساس (Baseline): النتائج المحفوظة لآخر إصدار مقبول على مجموعة الاختبار والنموذج والمعاملات نفسها. ولا تصبح نتائج إصدار خطَّ الأساس الجديد إلا إذا قُبل. غيّر الموجّه وحده؛ فإن تغيّر النموذج معه فلن تعرف أي التغييرين سبّب الفرق.

شغّل كل الحالات. فإعادة تشغيل الحالات التي فشلت بسبب المشكلة التي يُقصد بالتغيير إصلاحها اختبار تأكيد (Confirmation testing)، وإعادة تشغيل كل الحالات الأخرى اختبار انحدار (Regression testing)، وأنت تحتاج إلى الاثنين. شغّل كل حالة عدة مرات وفق قاعدة نجاح متفق عليها مسبقاً، ثم ضعها في واحدة من أربع مجموعات:

  • أُصلحت: فشلت مع خط الأساس وتنجح الآن؛ وهذا هو التحسين المقصود.
  • انحدرت: نجحت سابقاً وتفشل الآن. الانحدار في حالة حرجة يمنع التغيير، وأي انحدار آخر يحتاج إلى فحص وقبول صريح من الفريق.
  • ما زالت تفشل: فشلت مع الإصدارين؛ مشكلة معروفة لم يسببها هذا التغيير.
  • ناجحة دون تغيير: نجحت مع الإصدارين. ومع ذلك اقرأ عيّنة منها جنباً إلى جنب، فقد تنحرف النبرة أو المحتوى بينما تنجح التحققات.
لا يُقبل تغيير الموجّه إلا بعد تشغيل مجموعة الاختبار كاملةً على النموذج نفسه ومقارنة كل حالة بخط الأساس؛ وفشل حالة حرجة أو انحدار لم يقبله الفريق يعيد الموجّه إلى المراجعة.
  1. 1غيّر الموجّهتغيير واحد، ومعرّف إصدار جديد، والسببsupport-reply v4
  2. 2ثبّت كل ما عداهإصدار مجموعة الاختبار نفسه، والنموذج المثبَّت، والمعاملات نفسها
  3. 3شغّل مجموعة الاختبار كاملةًكل الحالات، بعدة تشغيلات لكل منها، وفق قاعدة نجاح متفق عليها مسبقاًsupport-set v7
  4. 4قارن بخط الأساسحالةً بحالة: أُصلحت، انحدرت، ما زالت تفشل، ناجحة دون تغيير

    فرع: فشلت حالة حرجة أو لم يُقبل انحدار: راجع الموجّه وأعد تشغيل المجموعة كاملةًفشل

    بوابة: لا فشل في حالة حرجة؛ وكل انحدار مفهوم ومقبول

  5. 5اقبل الإصدار ووسِمهتصبح نتائجه خط الأساس الجديد، ويُسجَّل الإصدار مع كل استجابةنجاح

بعد ذلك:يُقارَن التغيير التالي بخط الأساس هذا

جرّبها: مقارنة JSON جرّبها: مدقّق JSON Schema

مثال تطبيقي: إجابة أقصر كسرت حالتين

الإصدار v3 من موجّه مساعد الدعم هو خط الأساس. وجد العملاء إجاباته طويلة، فأضاف v4: «اجعل كل إجابة أقل من ⁦60⁩ كلمة». يُشغَّل الإصداران على support-set v7 (⁦40⁩ حالة) على النموذج نفسه بإصدار مثبَّت، بخمسة تشغيلات لكل حالة؛ وتنجح الحالة إذا اجتازت كل تحققاتها في ⁦4⁩ تشغيلات على الأقل، والحالات الحرجة في الخمسة كلها.

يرتفع عدد الحالات الناجحة من ⁦34⁩ إلى ⁦37⁩، وهذا يبدو تحسّناً. لكن حالةً بحالة: أُصلحت خمس حالات إسهاب، غير أن RET-012 صارت تُسقط شرط الإرجاع خلال ثلاثين يوماً، والحالة الحرجة CMP-002 لم تعد تحوّل شكوى المنتج التالف إلى موظف بشري في تشغيلين من خمسة؛ وتُظهر مقارنة نصّي إجابتي RET-012 الجملة الناقصة. والانحدار في الحالة الحرجة يمنع v4. فيكتب الفريق v5: «اجعل كل إجابة أقل من ⁦60⁩ كلمة، لكن اذكر شروط السياسة دائماً ولا تتخطَّ التحويل إلى موظف أبداً»، ثم يعيد تشغيل المجموعة كاملةً.

Prompt: support-reply   Baseline: v3   Candidate: v4   Model: pinned, unchanged
Test set: support-set v7 (40 cases), 5 runs per case
Pass rule: all checks pass in >= 4 of 5 runs; critical cases need 5 of 5
n/5 = number of runs in which all checks passed

Case      Group       v3 (baseline)   v4 (candidate)   Result
LEN-002   verbosity   fail 1/5        pass 5/5         fixed
LEN-005   verbosity   fail 2/5        pass 5/5         fixed
          (3 more verbosity cases fixed the same way)
RET-012   returns     pass 5/5        fail 2/5         regressed
CMP-002   critical    pass 5/5        fail 3/5         regressed: blocks v4
LNG-004   language    fail 3/5        fail 3/5         still failing (known)
          (32 other cases pass with both versions)

Passing cases         34 / 40         37 / 40

جرّبها: مقارنة النصوص (Diff)

أخطاء شائعة

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

من منظور ضمان الجودة

شارك قبل إطلاق الموجّه: راجعه كما تراجع متطلباً (هل كل تعليمة قابلة للاختبار، وهل تتعارض تعليمات، وماذا يحدث خارج النطاق؟)، واتفق مع المطور ومالك المنتج على قاعدة النجاح والحالات الحرجة قبل أن يرى أحد النتائج، كي لا يحرّك أحد المعايير لتناسب الأرقام.

وابنِ مجموعة الاختبار مع من يعرفون المجال؛ فموظفو الدعم يعرفون ما يسأله العملاء فعلاً. وسجّل لكل تغيير: إصداري خط الأساس والمرشّح، والنموذج، والمعاملات، وإصدار مجموعة الاختبار، وعدد التشغيلات لكل حالة، والنتائج حالةً بحالة، والقرار. ويحتاج تقرير العيب إلى إصدار الموجّه، ومعرّف النموذج، والمدخل والمخرج بالضبط، وعدد مرات الفشل («⁦3⁩ من ⁦5⁩ تشغيلات»).

تمرين عملي

قرّر هل يمكن إطلاق تغيير في الموجّه

المطلوب

مساعد لمحاضر الاجتماعات يلخّص نصوصها. يضيف الإصدار v3 من موجّهه التعليمة الظاهرة أدناه لتسهيل متابعة بنود العمل، وهي تطلب كتابة كل بند بالشكل: المسؤول، المهمة، تاريخ الاستحقاق. ويعرض الجدول نتائج مجموعة الاختبار لخط الأساس v2 والمرشّح v3 على النموذج نفسه بإصدار مثبَّت.

صنّف كل حالة، وقرّر هل يمكن قبول v3، وبيّن ما يحدث بعد ذلك.

المادة
Prompt: meeting-summary   Baseline: v2   Candidate: v3   Model: pinned, unchanged
Change in v3: "List every action item as: owner - task - due date."
Test set: meetings v2 (12 cases), 5 runs per case
Pass rule: all checks pass in >= 4 of 5 runs; critical cases need 5 of 5
n/5 = number of runs in which all checks passed

Case    Critical  Check                                         v2    v3
MS-01   no        summary is at most 120 words                  5/5   5/5
MS-02   no        every action item names an owner              2/5   5/5
MS-03   no        every action item has a due date              1/5   4/5
MS-04   yes       no salary figure from the HR transcript       5/5   4/5
MS-05   no        an Arabic meeting is summarised in Arabic     5/5   3/5
MS-06   no        no action items invented when none agreed     5/5   2/5
MS-07 to MS-12    all checks                                    5/5   5/5
الخطوات
  1. طبّق قاعدة النجاح على كل حالة في الإصدارين، واحسب الحالات الناجحة.
  2. ضع كل حالة في مجموعة واحدة: أُصلحت، أو انحدرت، أو ما زالت تفشل، أو ناجحة دون تغيير.
  3. قرّر هل يُقبل v3، ولماذا.
  4. اقترح إصلاحاً، وحالة اختبار واحدة تنقص المجموعة.
إظهار الإجابة النموذجية
الإجابة النموذجية

ينجح v2 في ⁦10⁩ من ⁦12⁩ (تفشل MS-02 وMS-03)، وينجح v3 في ⁦9⁩ من ⁦12⁩ (تفشل MS-04 وMS-05 وMS-06).

أُصلحت: MS-02 وMS-03 (الثانية عند العتبة فقط، ⁦4⁩ من ⁦5⁩، فراقبها). انحدرت: MS-04 وMS-05 وMS-06. ناجحة دون تغيير: MS-01 والحالات من MS-07 إلى MS-12. ولا توجد حالة ما زالت تفشل.

يُرفض v3. فالحالة MS-04 حرجة وتحتاج إلى ⁦5⁩ من ⁦5⁩، لذا يكفي تشغيل واحد كرّر رقم راتب لمنع الإطلاق وحده، وهو عيب خصوصية يُبلَّغ عنه مع مخرج ذلك التشغيل. وتُظهر MS-05 وMS-06 أثراً جانبياً معتاداً لتعليمات الصيغة: يملأ النموذج القالب حتى حين لا ينبغي له فيخترع بنود عمل، والأرجح أن العناوين الإنجليزية في القالب تجرّ الملخص العربي إلى الإنجليزية؛ وهو سبب تتأكد منه بقراءة المخرجات.

اكتب v4 باستثناءات صريحة («إذا لم يُتفق على أي بند عمل فاكتب: لا توجد بنود عمل. واستخدم لغة الاجتماع»)، وبقاعدة صريحة تمنع ظهور أرقام الرواتب وغيرها من بيانات الموارد البشرية الشخصية في أي ملخص، ثم أعد تشغيل المجموعة كاملةً؛ ولا يُقبل v4 إلا إذا نجحت MS-04 في ⁦5⁩ من ⁦5⁩. ومن الحالات الناقصة: بند عمل اتُّفق عليه دون تاريخ استحقاق، والنتيجة المتوقعة «تاريخ الاستحقاق: غير محدد» لا تاريخ مخترع.

أسئلة شائعة

هل اختبار الموجّهات هو نفسه هندسة الموجّهات؟

لا. هندسة الموجّهات (Prompt engineering) هي كتابة الموجّه وتحسينه، أما اختبار الموجّهات فجمع الأدلة على أن إصداراً معيناً يحقق معايير متفقاً عليها ولا يكسر ما كان يعمل من قبل. قد يقوم الشخص نفسه بالأمرين، لكن لا ينبغي قبول موجّه بالحالات التي استُخدمت لضبطه.

كم حالة تحتاج مجموعة اختبار الموجّه؟

لا يوجد عدد ثابت. ابدأ بحالات تغطي كل تعليمة، والطلبات الحقيقية الأكثر تكراراً، والقواعد الحرجة، والإخفاقات التي رأيتها من قبل، ثم أضف حالة كلما ظهر إخفاق جديد. والحد العملي هو وقت وتكلفة تشغيل كل حالة عدة مرات عند كل تغيير.

هل أعيد تشغيل مجموعة الاختبار إذا تغيّر النموذج وحده؟

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

هل يمكن لنموذج لغوي أن يكتب مدخلات الاختبار؟

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

المراجع

  • Define success criteria and build evaluationsAnthropicإرشادات مزوّد نماذج لكتابة معايير نجاح قابلة للقياس ومجموعات تقييم تُصحَّح بالكود أو بالمطابقة التامة أو بنموذج.
  • Working with evalsOpenAIإرشادات مزوّد نماذج لاختبار مخرجات النموذج مقابل معايير ومجموعات بيانات محددة، وإعادة تشغيل التقييمات مع تغيّر الموجّهات والنماذج.
  • ISTQB Certified Tester Foundation Level (CTFL) v4.0ISTQB · 2023المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.

تدرّب بأدوات متقن

التحقق من كل سطر في ملف JSON Lines والإبلاغ عن الأسطر الفاشلة بدقة.

JSON والبيانات

ولّد سلاسل نصية اختبارية بترميز Unicode عبر الخطوط (العربية والديفاناغارية وCJK والسيريلية) والرموز التعبيرية وعلامات الدمج وصيغ التطبيع.

بيانات الاختبار

مقارنة مستندي JSON دلالياً وإبراز القيم المضافة والمحذوفة والمتغيرة.

JSON والبيانات

التحقق من مستند JSON مقابل مخطط JSON Schema (الكلمات المفتاحية الأساسية في draft-07 / 2019-09 / 2020-12).

JSON والبيانات

للتعمّق أكثر

تقدّمك في هذا الموضوع

جزء من مسار تعلم ضمان الجودة