لو بتستخرج بيانات منظّمة من نص بـ Claude أو GPT وبتلاقي 1 من كل 10 ردود فيه JSON مكسور بيوقّع التطبيق، المشكلة مش إن الموديل ضعيف. المشكلة إنك بتسيب الموديل يكتب نص حر وبتأمل إنه يطلع JSON. Structured Output بيلغي الأمل ده ويفرض الشكل برمجيًا.
Structured Output: ليه الموضوع ده مهم في 2026
في تطبيقات الـ AI الإنتاجية، 70% من الـ workflows اللي شفتها بتنتهي بخطوة واحدة: استخراج JSON من رد الموديل وحقنه في DB أو API تاني. أي خطأ هنا بيكسر الـ pipeline كله. شركات زي OpenAI وAnthropic وGoogle ضافوا في 2024-2025 ميزة Structured Output علشان السبب ده بالظبط.
المشكلة باختصار
عندك endpoint بيستقبل فاتورة كصورة أو نص، بيبعتها لموديل، الموديل المفروض يرجع JSON بـ 5 حقول. في الإنتاج بنشوف 3 سيناريوهات سيئة بشكل متكرر:
- الموديل بيرجع JSON ملفوف بـ markdown code fence (
```json) فالـjson.loadsبيقع. - الموديل بيكتب جملة مقدمة قبل الـ JSON: "بالطبع، إليك البيانات: { ... }".
- الموديل بيستخدم single quotes بدل double quotes أو بيحط trailing comma.
الناتج: 5% إلى 15% من الطلبات بتفشل. لو عندك 1000 طلب يومي، ده 50–150 retry يومي بتكلفة وزمن إضافيين.
مثال من الواقع: استخراج بيانات فاتورة
تخيّل إن عندك تطبيق محاسبي بيستقبل صورة فاتورة من المستخدم، وعايز يطلع منها: اسم البائع، التاريخ، الإجمالي، العملة، رقم الفاتورة. لو سألت الموديل "استخرج البيانات وارجعهم JSON"، ممكن يردّ بأي شكل من اللي فوق. الفكرة الجوهرية: الموديل ميعرفش schema بتاعك ما لم تفرضه عليه برمجيًا.
التعريف العلمي الدقيق
Structured Output (أحيانًا اسمه Constrained Decoding أو JSON Mode) هو آلية تقيّد عملية sampling في الموديل بحيث الـ tokens اللي بيختارها لازم تنتمي لـ grammar محدد سلفًا (عادةً JSON Schema). على المستوى التقني، الموديل وقت توليد كل توكن بيحسب logits على كامل الـ vocabulary، وبعدين الآلية بتمسح (mask) أي توكن مش متوافق مع الـ schema قبل الـ softmax. النتيجة: الـ output مضمون يكون JSON صالح ومتوافق مع الـ schema 100%.
الفرق بين ده وبين الطلب التقليدي: في الطلب التقليدي بتقول للموديل "ارجع JSON من فضلك" وبتعتمد على إن الـ training داخل الموديل خلاه يميل للـ JSON. ده اسمه best-effort. Structured Output بيشيل الـ best-effort ويحطّ مكانه ضمان رياضي.
الكود الكامل بـ Anthropic SDK + Pydantic
هنا مثال شغّال فعليًا. بنستخدم tool use في Claude علشان نفرض الشكل (ده الطريقة الرسمية في Anthropic SDK لـ structured output حتى أبريل 2026):