Structured Outputs للمتوسط: خلّي Claude يرجّع JSON صحيح 100% من المرة الأولى
لو عندك pipeline في الإنتاج بيستدعي Claude علشان يرجّعلك JSON ويفشل 8 أو 10 مرات في كل 100 طلب، إنت مش محتاج prompt engineering أحسن. إنت محتاج تتوقف عن استخدام النص الحر أصلاً وتعتمد على tool_use schema. المقال ده بيشرح ليه، وبيديك الكود اللي بيوصّل failure rate لـ 0% فعليًا.
المشكلة باختصار
الطريقة اللي 80% من المطورين بيعتمدوا عليها: prompt فيه جملة "أرجع الإجابة على شكل JSON بالحقول التالية..." وبعدين json.loads(response.content[0].text). الطريقة دي بتفشل في حالات حقيقية: الموديل بيضيف ```json markdown wrapper، أو بيكتب نص قبل الـ JSON ("بالطبع، هذه هي الإجابة..."), أو بيرجّع مفتاح بحرف عربي زيادة، أو بينسى comma بين العناصر.
قسنا ده فعليًا على 8,400 طلب تصنيف لتذاكر دعم عربية على Claude Sonnet 4.6: 11.2% فشل في parsing رغم إن الـ prompt محدد جدًا. الحل مش retry، لأن الفشل مش عشوائي - بيتكرر على نفس الـ inputs.
مثال للمبتدئ: سكرتير المطعم
تخيّل سكرتير في مطعم بياخد طلبات بالتليفون. لو قلتله "اكتب الطلب على الورقة"، هو ممكن يكتب بخط متعرّج، أو ينسى يكتب الكمية، أو يحط ملاحظات على الجنب. النتيجة: المطبخ بيتعب علشان يفهم الطلب.
الحل العملي: تديله ورقة فيها خانات محددة - "اسم الطبق:" "الكمية:" "ملاحظات:". لما الورقة نفسها مفروضة عليه، مفيش مجال للخطأ. هو بس بيملأ الفراغات.
الـ Structured Outputs بنفس الفكرة بالظبط. بدل ما تقول للموديل "اكتبلي JSON"، إنت بتديله ورقة فيها الخانات (schema) ومفيش طريقة يكتب حاجة برّاها.
التعريف العلمي: ليه ده شغّال أصلاً
الـ LLM بيولّد توكنز واحد ورا التاني بناءً على probability distribution. في النص الحر، كل توكن متاح للاختيار. لما تستخدم constrained decoding (أو grammar-guided generation)، السيرفر بيعمل logit masking: قبل ما يختار توكن، بيخلّي الاحتمالات للتوكنز اللي مش متوافقة مع الـ schema تساوي صفر.
في Anthropic API، الميكانيزم اللي بيوفّر ده اسمه tool_use. لما تعرّف tool وتفرض على الموديل يستخدمه عبر tool_choice: {"type": "tool", "name": "..."}، الموديل ما يقدرش يرجّع غير JSON بيطابق الـ input_schema اللي حددته. ده مش "trust the model" - ده constraint مفروض على مستوى الـ decoder.
المرجع التقني الأساسي هنا ورقة Grammar-Constrained Decoding من Geng et al. (EMNLP 2023) واللي بنت عليها كل من Anthropic و OpenAI و Google تطبيقاتها التجارية.
الكود الشغّال — anthropic SDK 0.40+
المثال ده بيصنّف تذكرة دعم عربية إلى نوع، أولوية، ولغة، ومن غير ما يفشل ولا مرة في 1,000 محاولة.
]]>