استراتيجية Output Specifications
تحديد مواصفات المخرجات
النموذج لا يقرأ نيتك عن الشكل الذي تريده؛ يقرأ ما كتبته فقط. تحديد المواصفات هو ما يحوّل الرد من فقرة تُقرأ إلى بيانات تُستخدم. نطبّقه على فرز طلبات التوظيف وعلى بناء بنك أسئلة.
- المدة: 40 دقيقة
- المستوى: متوسط – متقدم
- المنصة: OpenAI Platform – Playground
- المجالات: موارد بشرية · تعليم
أهداف المحاضرة
- تحديد ستة محاور لأي مواصفة مخرجات: الصيغة، الطول، البنية، لغة الحقول، سلوك النقص، وما يُمنع.
- كتابة مخطط JSON صارم يمنع النموذج من اختراع حقول أو قيم خارج القائمة المسموحة.
- التعامل مع البيانات الناقصة بقاعدة صريحة بدل ترك النموذج يخمّن.
- تفعيل Structured Outputs في OpenAI Platform وربطه بالمواصفة المكتوبة في الأمر.
الفكرة في سطور
لماذا تفشل الأوامر بلا مواصفة؟
حين تكتب «استخرج بيانات هذا المتقدم»، فأنت تركت للنموذج ستة قرارات: هل يكتب فقرة أم قائمة؟ عربية أم إنجليزية؟ ماذا يفعل حين لا يجد سنوات الخبرة؟ هل يضيف تعليقًا افتتاحيًا؟ كل تشغيل قد يجيب عن هذه الأسئلة إجابة مختلفة، وهنا ينهار أي نظام يعتمد على الناتج.
المواصفة عقد لا اقتراح
المواصفة الجيدة تصف الناتج بدقة تكفي لأن يكتبه شخصان مختلفان بنفس الشكل. وأهم بند فيها هو أقلّها كتابةً: ماذا تفعل حين تنقص المعلومة. من دون هذا البند، يملأ النموذج الفراغ بتخمين معقول الشكل — وهذا أخطر أنواع الخطأ لأنه لا يبدو خطأ.
محاور المواصفة الستة
| المحور | السؤال الذي يجيب عنه | مثال صياغة |
|---|---|---|
| الصيغة | نص، قائمة، جدول، JSON، CSV؟ | «أخرج JSON صالحًا فقط، بلا أي نص خارجه». |
| البنية | ما الحقول؟ وما ترتيبها؟ وما نوع كل حقل؟ | «الحقول: full_name نص، years_experience عدد صحيح». |
| الطول | كم عنصرًا؟ كم كلمة في كل حقل؟ | «ثلاث نقاط، كل نقطة لا تتجاوز 15 كلمة». |
| القيم المسموحة | هل الحقل مفتوح أم من قائمة مغلقة؟ | «level من: junior أو mid أو senior فقط». |
| سلوك النقص | ماذا يفعل حين تغيب المعلومة؟ | «اكتب null ولا تخمّن ولا تستنتج». |
| الممنوعات | ما الذي يجب ألا يظهر إطلاقًا؟ | «بلا مقدمة، بلا اعتذار، بلا شرح، بلا علامات ```». |
التطبيق الأول: فرز طلبات التوظيف
المجال: الموارد البشرية. المطلوب تحويل سيرة ذاتية نصية إلى صف بيانات يدخل جدول المتقدمين مباشرة. الفرق هنا ليس في جمال الرد، بل في كونه صالحًا للتحليل البرمجي أم لا.
استخرج أهم البيانات من السيرة الذاتية التالية: محمد عبد الرحمن — مهندس برمجيات. عملت 4 سنوات في تطوير الواجهات باستخدام React وTypeScript، وسنتين قبلها في الدعم الفني. حاصل على بكالوريوس حاسبات 2018. متاح للعمل عن بُعد. للتواصل: 0100xxxxxxx
- أضاف «Senior» من عنده، ولم يرد في النص إطلاقًا.
- خمّن مهارات (JavaScript، HTML/CSS) بصيغة «ربما» — بيانات ملوّثة.
- «6 سنوات تقريبًا» نص لا رقم، لا يصلح للفرز أو الترتيب.
- مقدمة وخاتمة وسؤال ختامي تكسر أي محاولة لتحليل الناتج برمجيًا.
استخرج بيانات المتقدم من النص داخل <السيرة> وأخرجها بهذه المواصفة: الصيغة: JSON صالح فقط. لا نص قبله ولا بعده، ولا علامات تنسيق. الحقول بالترتيب: full_name (نص) · title (نص) · total_years (عدد صحيح) · skills (مصفوفة نصوص، 5 عناصر كحد أقصى) · degree_year (عدد صحيح) · remote_ok (منطقي) · seniority (من: junior / mid / senior فقط) · contact_email (نص) · contact_phone (نص) قواعد: — أي حقل غير مذكور صراحةً في النص = null. لا تستنتج ولا تخمّن ولا تُكمل من معرفتك العامة. — skills تُدرج كما وردت حرفيًا في النص فقط. — total_years = مجموع سنوات الخبرة المذكورة عدديًا فقط. — seniority: أقل من 3 = junior، من 3 إلى 7 = mid، أكثر من 7 = senior. <السيرة> محمد عبد الرحمن — مهندس برمجيات. عملت 4 سنوات في تطوير الواجهات باستخدام React وTypeScript، وسنتين قبلها في الدعم الفني. حاصل على بكالوريوس حاسبات 2018. متاح للعمل عن بُعد. للتواصل: 0100xxxxxxx </السيرة>
- JSON صالح يدخل قاعدة البيانات دون معالجة وسيطة.
- null صريحة للبريد بدل تخمين أو جملة اعتذار.
- seniority محسوبة بقاعدة مكتوبة، لا بانطباع النموذج.
- أنواع البيانات منضبطة: العدد عدد، والمنطقي منطقي.
التطبيق الثاني: بنك أسئلة
المجال: التعليم. المطلوب بنك أسئلة اختيار من متعدد يُستورد إلى منصة تعليمية. هنا لا يكفي ضبط الصيغة؛ يجب ضبط خصائص المحتوى نفسه: عدد البدائل، وتوزيع الإجابة الصحيحة، ومنع الأنماط التي تفضح الحل.
اكتب 3 أسئلة اختيار من متعدد عن دورة المياه في الطبيعة.
- الإجابة الصحيحة هي «أ» في الأسئلة الثلاثة — نمط يفضح الحل.
- بدائل غير معقولة (الشمس، الرياح كأشكال هطول) تجعل السؤال بلا قيمة تمييزية.
- ثلاثة بدائل فقط بدل أربعة، بلا التزام بمواصفة.
- كل الأسئلة من مستوى التذكر، ولا يوجد تصنيف يمكن الفرز به.
أنشئ ثلاثة أسئلة اختيار من متعدد عن دورة المياه، بهذه المواصفة: الصيغة: مصفوفة JSON فقط، بلا نص خارجها. حقول كل عنصر: id (عدد) · stem (نص، لا يتجاوز 20 كلمة) · options (أربعة نصوص) · answer_index (0–3) · rationale (نص، جملة واحدة) · bloom_level (من: تذكر / فهم / تطبيق فقط) قواعد المحتوى: — البدائل الثلاثة الخاطئة يجب أن تكون معقولة وتنتمي لنفس المجال، لا كلمات عشوائية. — يجب أن تتوزع answer_index على ثلاث قيم مختلفة بين الأسئلة الثلاثة. — يُمنع أن يكون الخيار الصحيح أطول من غيره بأكثر من ثلاث كلمات. — يُمنع استخدام «كل ما سبق» أو «لا شيء مما سبق». — سؤال واحد على الأقل من مستوى «تطبيق».
- توزيع الإجابة الصحيحة على 1 و2 و0 يمنع التخمين بالنمط.
- البدائل الخاطئة كلها مصطلحات حقيقية من نفس المجال.
- تصنيف Bloom يتيح بناء اختبار متوازن آليًا.
- JSON جاهز للاستيراد إلى المنصة التعليمية دون تفريغ يدوي.
التطبيق في OpenAI Platform
في الـ Playground، المواصفة تُكتب في مكانين لا مكان واحد: نصًّا داخل رسالة النظام حتى يفهم النموذج المنطق، ومخططًا في Response format حتى يُفرض عليه الشكل. النص وحده يُخالَف أحيانًا، والمخطط وحده يعطيك شكلًا صحيحًا بمحتوى ضعيف.
{
"name": "applicant",
"strict": true,
"schema": {
"type": "object",
"properties": {
"full_name": { "type": ["string", "null"] },
"total_years": { "type": ["integer", "null"] },
"skills": { "type": "array", "items": { "type": "string" }, "maxItems": 5 },
"remote_ok": { "type": ["boolean", "null"] },
"seniority": { "type": "string", "enum": ["junior", "mid", "senior"] },
"contact_email": { "type": ["string", "null"] }
},
"required": ["full_name", "total_years", "skills", "remote_ok", "seniority", "contact_email"],
"additionalProperties": false
}
}- فعّل Response format ثم اختر json_schemaستجده في العمود الجانبي للـ Playground. الوضع الافتراضي نص حر، ووضع json_object يضمن JSON صالحًا فقط دون ضمان الحقول، أما json_schema فهو الذي يفرض بنيتك أنت حرفًا بحرف.
- اضبط strict على trueهذا هو البند الذي يحوّل المخطط من رجاء إلى إلزام. بدونه قد يخرج النموذج حقلًا إضافيًا أو يبدّل نوع قيمة، وستكتشف ذلك بعد أن يسقط نظامك على سيرة رقم 400.
- أغلق الباب أمام الحقول المخترعةadditionalProperties: false تمنع أي حقل خارج قائمتك، و enum تحصر القيم في مجموعة مغلقة. هذان السطران يوفّران عليك نصف شفرات التحقق التي كنت ستكتبها لاحقًا.
- اجعل الحقول الناقصة null صراحةًاستخدم النوع المزدوج ["string", "null"] وضع الحقل في required. بهذا يظهر الحقل دائمًا بقيمة null بدل أن يختفي — والفرق كبير: الحقل المفقود يكسر الكود، والقيمة الفارغة يتعامل معها الكود بسهولة.
- صفّر درجة الحرارةمهام الاستخراج والتنسيق لا تحتاج تنوعًا. الصفر مع مخطط صارم يعطيك أقرب ما يكون إلى ناتج قابل للتكرار، وهو ما يسمح لك بمقارنة نسختين من الأمر مقارنة عادلة.
- اختبر على الحالة الفارغةشغّل الأمر على نص ناقص عمدًا (سيرة بلا سنوات خبرة ولا بريد). النموذج الذي يخترع رقمًا هنا سيخترعه في الإنتاج. هذا الاختبار الواحد يكشف أضعف بند في مواصفتك: بند سلوك النقص.
أخطاء شائعة
| الخطأ | لماذا يضر | التصحيح |
|---|---|---|
| «أخرج النتيجة بشكل منظم» | «منظم» صفة انطباعية يفسّرها النموذج كل مرة تفسيرًا مختلفًا. | سمِّ الصيغة والحقول والأنواع. |
| إغفال سلوك النقص | يملأ النموذج الفراغ بتخمين معقول الشكل، وهو خطأ لا يُكتشف بالنظر. | «غير المذكور صراحةً = null». |
| الاعتماد على وصف نصي للـ JSON فقط | يظل احتمال المخالفة قائمًا، خصوصًا مع المدخلات الغريبة. | اجمع الوصف النصي مع json_schema وstrict. |
| ترك القيم مفتوحة | «senior» و«Senior» و«كبير» ثلاث قيم مختلفة في قاعدة بياناتك. | enum بقائمة مغلقة. |
| نسيان منع المقدمات | «بالتأكيد! إليك...» تكسر أول محاولة لتحليل الناتج. | «لا نص قبل الناتج ولا بعده». |
التكليف العملي
حوّل مخرَجًا نصيًا إلى بيانات
- اختر مهمة من عملك تُخرج نصًا حرًا اليوم (تقييم، فرز، تلخيص، تصنيف).
- اكتب مواصفة تغطي المحاور الستة، ولا تترك محور «سلوك النقص» فارغًا.
- حوّل المواصفة إلى مخطط json_schema وفعّله في الـ Playground مع strict: true.
- شغّل الأمر على ثلاثة مدخلات: مدخل كامل، ومدخل ناقص، ومدخل مشوّش أو خارج المجال.
- سجّل: هل تغيّر شكل الناتج؟ هل اخترع النموذج قيمة؟ ماذا فعل مع المدخل خارج المجال؟
- سلّم: المواصفة، والمخطط، والنواتج الثلاثة، وسطرين عن البند الذي اضطررت لإضافته بعد الاختبار.
خلاصة المحاضرة
- المخرَج غير المحدد المواصفات ليس خطأ النموذج، بل فراغ تركته أنت فملأه هو.
- ستة محاور تضبط أي مخرَج: الصيغة، البنية، الطول، القيم المسموحة، سلوك النقص، الممنوعات.
- أخطر بند هو سلوك النقص، لأن التخمين المعقول لا يبدو خطأً حتى يتراكم.
- اكتب المواصفة نصًّا وافرضها مخططًا: النص يشرح المنطق، والمخطط يضمن الشكل.
- هذه الاستراتيجية هي الجسر بين «أستخدم النموذج» و«بنيت به نظامًا».