مكتبة الأوامر

نُشر في ١٧ سبتمبر ٢٠٢٦

ChatGPT JSON: كيف تحصل على مخرجات JSON منظمة وموثوقة

دليل عملي لصياغة برومبت يجعل ChatGPT يرجع JSON صالحًا ومنظمًا بشكل ثابت، مع شرح الـ schema وJSON Mode وStructured Outputs وقوالب جاهزة.

Promptspillar:prompt-engineeringStructured OutputJSON Prompting
ChatGPT JSON: كيف تحصل على مخرجات JSON منظمة وموثوقة
محتويات المقال

ما هو Structured Output وما علاقته بـ JSON؟

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

تظهر أهمية ذلك عندما تريد استخدام ChatGPT أو أحد نماذج الذكاء الاصطناعي داخل تطبيق أو سكربت أو نظام أتمتة، مثل استخراج البيانات، وتصنيف طلبات الدعم، وتنظيم معلومات المنتجات، أو تمرير النتائج إلى API. وهنا يجب التمييز بين مجرد طلب JSON داخل البرومبت وبين وسائل API التي تفرض قيودًا أقوى على شكل الناتج.

لماذا يفشل مجرد طلب "رد بصيغة JSON" غالبًا؟

قد ينجح طلب مثل "أجب بصيغة JSON" في المهام البسيطة، لكنه لا يفرض وحده schema محددًا أو سلوكًا ثابتًا في كل حالة. عندما تعتمد على البرومبت فقط، قد يفسر النموذج التعليمات بطرق مختلفة أو يضيف عناصر لا تريدها.

  • إضافة مقدمة أو شرح قبل كائن JSON.
  • وضع JSON داخل code fence مثل ```json.
  • تغيير أسماء المفاتيح بين استجابة وأخرى.
  • استخدام null في حالة، و"N/A" أو سلسلة نصية في حالة أخرى.
  • إرجاع رقم كقيمة رقمية في بعض الحالات وكـ string في حالات أخرى.
  • إضافة حقول غير مطلوبة أو حذف حقول متوقعة.

وقد يؤدي ذلك إلى فشل عملية parsing أو validation في التطبيق، حتى لو كان المحتوى نفسه صحيحًا من الناحية البشرية. لذلك، كلما أصبحت المخرجات جزءًا من نظام آلي، يجب التعامل مع البنية كجزء من التصميم وليس كتعليمات شكلية فقط.

بنية برومبت JSON موثوق (Anatomy)

يمكن بناء برومبت واضح للمخرجات المنظمة من خمسة عناصر أساسية: الدور، المهمة، الـ schema، القيود، وقاعدة الإخراج النهائية.

ROLE

حدد وظيفة النموذج في المهمة، مثل محلل بيانات أو محرك استخراج معلومات.

TASK

حدد بدقة ما الذي يجب استخراجه أو تصنيفه أو تحويله.

SCHEMA

حدد أسماء الحقول وأنواع القيم والعلاقة بينها. استخدم مثال JSON واضحًا في البرومبت، أو JSON Schema عندما تستخدم ميزة تدعم ذلك.

CONSTRAINTS

حدد القيم المسموح بها، وما يجب فعله عند غياب البيانات، والحقول المطلوبة، وأي قواعد خاصة.

OUTPUT RULE

حدد الشكل النهائي المطلوب، مثل: أرجع JSON فقط دون مقدمة أو شرح أو code fences.

حدد شكل الـ JSON (Schema) قبل كتابة البرومبت

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

صمّم الـ schema أولًا، ثم اكتب البرومبت. ليس العكس.

هذا الأسلوب يجعل تعديل النظام مستقبلًا أسهل. فإذا احتجت إلى إضافة حقل جديد أو تغيير نوع قيمة، يمكنك تعديل الـ schema والقواعد المرتبطة به بدل الاعتماد على وصف غامض للبنية.

System Prompt مقابل User Prompt في قواعد JSON

في الأنظمة متعددة الرسائل، من المفيد وضع القواعد الثابتة الخاصة بالبنية في التعليمات ذات الأولوية المناسبة للواجهة التي تستخدمها، بينما يحتوي User Prompt عادةً على البيانات المتغيرة التي تريد معالجتها. بهذه الطريقة لا تضطر إلى إعادة تعريف قواعد JSON مع كل طلب.

تقنيات صياغة برومبت تزيد موثوقية JSON

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

JSON Mode وStructured Outputs في OpenAI API

هذا القسم موجّه لمن يبني تطبيقًا أو أتمتة فوق OpenAI API مباشرة. إذا كنت تستخدم ChatGPT فقط داخل المحادثة العادية دون التكامل البرمجي، يمكنك تخطي هذا القسم والانتقال للقوالب الجاهزة أدناه.

إذا كنت تستخدم OpenAI API، فهناك فرق مهم بين JSON Mode وStructured Outputs. JSON Mode مصمم لإخراج JSON صالح نحويًا، لكنه لا يفرض وحده schema محددًا. أما Structured Outputs، فيمكنه تقييد الناتج ليتوافق مع schema مدعوم في الحالات والنماذج التي تدعم هذه الميزة. لذلك، إذا كان تطبيقك يعتمد على حقول وأنواع محددة، فهذه الميزة أقوى من الاعتماد على تعليمات البرومبت وحدها. وتبقى هناك قيود ومتطلبات مرتبطة بالـ schema والميزة المستخدمة. (ملاحظة: "Structured Outputs" هنا اسم ميزة رسمية محددة في OpenAI API، ولا يجب الخلط بينها وبين مصطلح "structured output" العام المستخدم في بقية هذا المقال لوصف فكرة إخراج بيانات منظمة بشكل عام.)

  • البرومبت فقط: يشرح للنموذج الشكل المطلوب، لكنه لا يفرضه تقنيًا.
  • JSON Mode: يركز على أن يكون الناتج JSON صالحًا، لكنه لا يفرض schema محددًا.
  • Structured Outputs: يتيح في الحالات المدعومة تقييد الناتج وفق JSON Schema محدد.
  • Function Calling مع strict: true: يمكنه في الحالات المدعومة فرض توافق arguments مع schema الوظيفة.

قوالب JSON جاهزة للنسخ

يمكنك استخدام القوالب التالية كنقطة بداية ثم تعديل الحقول والقواعد بما يناسب مهمتك. لاحظ أن الأمثلة التي تستخدم كلمات مثل string تمثل نوع القيمة المقصود، وليست بالضرورة القيمة الحرفية التي يجب أن يعيدها النموذج.

🟣 البرومبت
أنت محرك استخراج بيانات. مهمتك استخراج بيانات جهة الاتصال من النص التالي.

أرجع النتيجة باستخدام هذه البنية:
{
  "name": "string",
  "email": null,
  "phone": null,
  "company": null
}

القواعد:
- name يجب أن يكون نصًا.
- email وphone وcompany يجب أن تكون نصًا إذا كانت المعلومة موجودة، أو null إذا لم تكن موجودة.
- استخدم أسماء المفاتيح نفسها تمامًا.
- أرجع كائن JSON صالحًا فقط.
- لا تضف مقدمة أو شرحًا أو code fences.

النص:
[الصق النص هنا]
🟣 البرومبت
صنّف كل عنصر من القائمة التالية إلى فئة واحدة فقط من الفئات التالية بالضبط: "urgent"، "normal"، أو "low_priority" (اترك قيمة category بالإنجليزية كما هي، لأنها ستُستخدم برمجيًا).

أرجع النتيجة كمصفوفة JSON فقط بهذا الشكل:
[
  {
    "item": "example item",
    "category": "urgent"
  }
]

القواعد:
- يجب أن يحتوي كل عنصر على المفتاحين item وcategory.
- يجب أن تكون قيمة category واحدة من القيم الثلاث بالإنجليزية بالضبط: urgent أو normal أو low_priority — بدون ترجمة.
- لا تضف أي نص خارج مصفوفة JSON.

القائمة:
[الصق العناصر هنا]

أخطاء تنسيق JSON الشائعة

  • الفاصلة الزائدة في نهاية آخر عنصر: JSON القياسي لا يسمح بها.
  • استخدام single quotes بدل double quotes للمفاتيح والقيم النصية.
  • وضع أرقام أو قيم منطقية داخل علامات اقتباس عندما يجب أن تكون قيمًا رقمية أو منطقية.
  • استخدام أسماء مفاتيح مختلفة لنفس البيانات.
  • إضافة نص تمهيدي أو تعليق خارج بنية JSON.
  • إضافة حقول غير موجودة في schema المطلوب.

تحقق من صحة JSON والبيانات قبل الوثوق بها

وجود JSON صالح نحويًا لا يعني أن البيانات داخله صحيحة أو أن بنيته تطابق ما يحتاجه تطبيقك. في الأنظمة العملية، من الأفضل التفكير في التحقق على ثلاث طبقات: صحة صيغة JSON، توافق البنية مع الـ schema، ثم صحة البيانات من الناحية المنطقية. في JavaScript يمكنك استخدام JSON.parse، وفي Python يمكنك استخدام json.loads للتحقق من parsing، ثم استخدام أداة schema validation عندما تكون البنية مهمة. وإذا فشل التحقق، يجب أن يتعامل التطبيق مع الخطأ وفق سياسة واضحة بدل تمرير الناتج مباشرة إلى النظام.

  • Syntax validation: هل النص JSON صالح ويمكن تحليله؟
  • Schema validation: هل الحقول والأنواع والقيم تتوافق مع البنية المطلوبة؟
  • Semantic validation: هل البيانات نفسها منطقية وصحيحة بالنسبة للمهمة؟

الأسئلة الشائعة حول ChatGPT وJSON

هل يضمن ChatGPT دائمًا إرجاع JSON صالح؟

لا ينبغي اعتبار البرومبت وحده ضمانًا تقنيًا لصحة JSON في كل حالة. يمكن أن تكون التعليمات الجيدة فعالة جدًا، لكن التطبيقات التي تعتمد على المخرجات آليًا يجب أن تستخدم parsing وvalidation مناسبين. وعند استخدام API، يمكن أن توفر JSON Mode أو Structured Outputs قيودًا أقوى في الحالات المدعومة، مع ضرورة التعامل مع القيود والحالات الاستثنائية الخاصة بكل ميزة.

ما الفرق بين JSON Mode وStructured Outputs؟

JSON Mode يهدف إلى جعل الناتج JSON صالحًا وقابلًا للتحليل، لكنه لا يحدد بمفرده الحقول أو الأنواع التي يجب أن يحتوي عليها الناتج. أما Structured Outputs فهو مصمم للحالات التي تحتاج فيها إلى توافق الناتج مع JSON Schema مدعوم. لذلك فهما ليسا الشيء نفسه: الأول يركز على صيغة JSON، والثاني يضيف قيدًا بنيويًا على schema عندما تكون الميزة مدعومة.

هل أحتاج إلى معرفة البرمجة لاستخدام JSON Prompting؟

لا. يمكنك كتابة JSON Prompt واستخدامه داخل المحادثة دون معرفة البرمجة. لكن معرفة أساسيات JSON وparsing وschema validation تصبح مفيدة جدًا عندما تريد إدخال المخرجات في تطبيق أو قاعدة بيانات أو نظام أتمتة.

اقرأ أيضًا