خروجی ساختاریافته هوش مصنوعی؛ ساخت قرارداد JSON برای متن فارسی
با دو فایل schema.json و cases.json، قرارداد استخراج نام کالا، قیمت و شاهد متنی را بسازید و تفاوت اعتبار ساختار با صحت اطلاعات هوش مصنوعی را بررسی کنید.
در این مقاله میخوانید ۶ بخش
قرارداد داده چه چیزی را تضمین نمیکند؟
برای خروجی ساختاریافته هوش مصنوعی، ابتدا مشخص کنید پاسخ باید چه شکلی داشته باشد و اطلاعات نامعلوم چگونه ثبت شوند. در این تمرین دو فایل میسازید: schema.json برای تعریف قرارداد و cases.json برای ورودیهای نمونه و پاسخهای مورد انتظار. هیچ API یا مدلی اجرا نمیشود؛ نتیجه، یک قرارداد و مجموعه آزمون اولیه است، نه استخراج آزمایششده.
طبق مستندات OpenAI، JSON mode برای تولید JSON معتبر است؛ Structured Outputs در حالت و مدل سازگار، خروجی را با Schema تعیینشده منطبق میکند. بااینحال، خروجی ساختاریافته همچنان ممکن است اشتباه داشته باشد. عددی میتواند از نظر نوع درست باشد، اما در متن ورودی هیچ شاهدی نداشته باشد.
پیشنیاز این پروژه فقط ویرایشگر متن، امکان ذخیره فایل متنی و آشنایی مقدماتی با JSON است. حساب کاربری، اشتراک یا کلید API لازم نیست.
۱. سه ورودی ساختگی و قواعد استخراج را آماده کنید
نمونههای زیر تألیفی و ساختگیاند. قرارداد تمرین را محدود کنید: هر ورودی حداکثر یک کالا دارد؛ قیمت فقط زمانی ثبت میشود که مبلغ و واحد تومان صریحاً آمده باشند. تبدیل واحد یا حدس قیمت انجام نمیدهیم.
ورودی اول: «نام کالا: دفتر آبی. قیمت: 85000 تومان.» ورودی دوم: «نام کالا: چراغ رومیزی. قیمت هنوز اعلام نشده است.» ورودی سوم: «فروشگاه جمعه تعطیل است.»
سه فیلد خروجی را product_name، price و evidence بنامید. نام و قیمت نامعلوم باید null باشند. evidence یک شاهد عیناً برگرفته از ورودی است که اطلاعات استخراجشده را پوشش میدهد؛ اگر هیچ اطلاعاتی درباره کالا استخراج نشده، آن هم null میشود.
این سیاست برای جلوگیری از پرکردن اجباری پاسخ با اطلاعات ساختگی طراحی شده است. راهنمای OpenAI نیز توصیه میکند رفتار مدل برای ورودی نامرتبط مشخص شود؛ وگرنه مدل ممکن است برای تکمیل ساختار، اطلاعاتی بسازد.
۲. قرارداد را در schema.json بنویسید
در ویرایشگر، فایل جدیدی باز کنید و متن زیر را با نام schema.json ذخیره کنید:
{ "type": "object", "properties": { "product_name": {"type": ["string", "null"]}, "price": {"type": ["number", "null"]}, "evidence": {"type": ["string", "null"]} }, "required": ["product_name", "price", "evidence"], "additionalProperties": false }
properties فیلدها و نوعشان را تعریف میکند، اما حضورشان را اجباری نمیکند. required میگوید هر سه کلید باید وجود داشته باشند؛ حتی وقتی مقدارشان null است. additionalProperties با مقدار false کلیدهای اضافی، مانند توضیح یا میزان اطمینان، را ممنوع میکند.
در این قرارداد، 85000 یک عدد است، اما "85000" رشته محسوب میشود و برای price پذیرفته نیست. همچنین price با مقدار null با حذف کامل price تفاوت دارد: اولی اطلاعات نامعلوم را صریح ثبت میکند، دومی قرارداد را نقض میکند.
این یک قرارداد JSON Schema برای تمرین است. آن را بدون بررسی به API منتقل نکنید؛ Structured Outputs در OpenAI فقط زیرمجموعهای از JSON Schema را میپذیرد و سازگاری به مدل و حالت انتخابشده وابسته است.
۳. پاسخهای مورد انتظار را در cases.json ثبت کنید
فایل دوم را با نام cases.json بسازید و این مجموعه آزمون پیشنهادی را در آن ذخیره کنید:
[ { "input": "نام کالا: دفتر آبی. قیمت: 85000 تومان.", "expected": { "product_name": "دفتر آبی", "price": 85000, "evidence": "نام کالا: دفتر آبی. قیمت: 85000 تومان." } }, { "input": "نام کالا: چراغ رومیزی. قیمت هنوز اعلام نشده است.", "expected": { "product_name": "چراغ رومیزی", "price": null, "evidence": "نام کالا: چراغ رومیزی. قیمت هنوز اعلام نشده است." } }, { "input": "فروشگاه جمعه تعطیل است.", "expected": { "product_name": null, "price": null, "evidence": null } } ]
schema.json برای بررسی هر شیء داخل expected طراحی شده، نه کل فایل cases.json. آرایه بیرونی فقط ظرف نگهداری آزمونهاست. این پاسخها انتظارهای تعریفشده برای تمریناند و خروجی یک مدل نیستند.
۴. پرامپت پیشنهادی را از قرارداد جدا نگه دارید
پرامپت تألیفی و آزمایشنشده پیشنهادی:
«از متن ورودی، نام یک کالا و قیمت صریح آن به تومان را استخراج کن. فقط یک شیء JSON با کلیدهای product_name، price و evidence برگردان. هر سه کلید باید حاضر باشند. برای اطلاعات نامعلوم null بنویس. price باید عدد یا null باشد؛ واحدها را تبدیل نکن و قیمت را حدس نزن. evidence باید بخشی عیناً از متن باشد که مقادیر استخراجشده را پوشش دهد. اگر متن اطلاعات کالا ندارد، هر سه مقدار را null قرار بده. کلید اضافه تولید نکن. متن ورودی: [متن تمرین را اینجا قرار دهید]»
این پرامپت رفتار مطلوب را توضیح میدهد، اما جای تنظیم قابلیت Structured Outputs در API را نمیگیرد. اگر بعداً مدل را اجرا کردید، ابتدا پاسخ را با قرارداد و سپس با متن اصلی مقایسه کنید. برای اصلاح خطای استخراج، قاعده مبهم را روشنتر کنید یا نمونه مناسب اضافه کنید؛ صرفاً اصرار بر «JSON درست» صحت اطلاعات را تضمین نمیکند.
۵. سه خطا را جدا بررسی کنید و فایلها را تحویل بگیرید
حذف فیلد: اگر price وجود ندارد، پاسخ با required ناسازگار است. وقتی قیمت معلوم نیست، شکل درست در این تمرین حضور کلید با مقدار null است.
نوع اشتباه: اگر price برابر "85000" باشد، عدد داخل رشته قرار گرفته است. این خطای ساختاری را از اشتباه در خود مبلغ جدا کنید.
عدد بیشاهد: اگر برای ورودی دوم price برابر 85000 باشد، نوع داده درست است و ممکن است بررسی Schema را بگذراند؛ اما متن چنین قیمتی ندارد. حتی وجود فیلد evidence کافی نیست: باید بررسی کنید شاهد واقعاً از ورودی آمده و مقدار را پشتیبانی میکند. این تفکیک به منطق راستیآزمایی خلاصه هوش مصنوعی نیز نزدیک است: ادعا را جدا از شاهد بسنجید.
در پایان، هر دو فایل را بهصورت متن ساده با رمزگذاری UTF-8 و پسوند .json ذخیره کنید؛ مراقب باشید پسوند نهایی .json.txt نباشد. فایلها را دوباره باز کنید و کاملبودن محتوا را ببینید. این بازبینی بصری جای اعتبارسنجی خودکار را نمیگیرد. اگر بعداً API اضافه شد، پاسخ امتناع و خروجی ناقص نیز مسیر مدیریت جداگانه میخواهند.


هنوز دیدگاهی منتشر نشده است. اولین نفر باشید.