Prompt Engineering

تسلط بر حالت JSON: تضمین خروجی ساختاریافته قابل اعتماد از مدل‌های زبانی بزرگ

در چشم‌انداز به سرعت در حال تحول مدل‌های زبانی بزرگ (LLMs)، توانایی تبدیل متن نامنظم به داده‌های ساختاریافته، قابلیت حیاتی برای توسعه نرم‌افزارهای مدرن است. اگرچه LLMها به طور طبیعی برای تولید متن قابل خواندن توسط انسان طراحی شده‌اند، ادغام آن‌ها در سیستم‌های بک‌اند نیازمند قالب‌های قابل خواندن توسط ماشین و قابل پیش‌بینی است. اینجاست که حالت JSON ضروری می‌شود. این پست به بررسی ظرافت‌های فنی اعمال خروجی JSON، اهمیت آن و نحوه پیاده‌سازی مؤثر آن در استراتژی مهندسی پرامپت شما می‌پردازد.

چالش متن نامنظم

به طور پیش‌فرض، بیشتر مدل‌های زبانی بزرگ با آنتروپی بالا در مورد قالب عمل می‌کنند. اگر از یک مدل بخواهید «نام و ایمیل مشتری را از این متن استخراج کنید»، ممکن است پاسخ دهد: «حتماً! مشتری جان دو است و ایمیل او john@example.com است.» اگرچه یک انسان می‌تواند این متن را پارس کند، اما یک برنامه نمی‌تواند. تلاش برای پارس این پاسخ با استفاده از کتابخانه‌های استاندارد مانند `JSON.parse()` منجر به خطاهای زمان اجرا شده و خط لوله برنامه شما را مختل می‌کند.

الزام LLM به خروجی JSON کاملاً معتبر، نیاز به عبارات باقاعده شکننده یا منطق پردازش پسین پیچیده را از بین می‌برد. این کار تضمین می‌کند که خدمات پایین‌دستی—چه پایگاه‌های داده، چه رابط‌های کاربری پیش‌زمینه، و چه سایر عامل‌های هوش مصنوعی—داده‌ها را در یک طرحواره قابل پیش‌بینی دریافت کنند.

استراتژی‌های پیاده‌سازی

دو روش اصلی برای اعمال حالت JSON وجود دارد: از طریق مهندسی صریح پرامپت یا از طریق محدودیت‌های سطح API. روش دوم به طور فزاینده‌ای به استاندارد صنعت تبدیل می‌شود، زیرا ارائه‌دهندگان مدل از پشتیبانی بومی برای خروجی‌های ساختاریافته استفاده می‌کنند.

1. اعمال در سطح پرامپت

در سطح پرامپت، باید صریح باشید. اضافه کردن ساده «خروجی به صورت JSON» اغلب کافی نیست. شما باید ساختار، انواع داده و محدودیت‌ها را تعریف کنید. استراتژی پرامپت بهبود یافته زیر را در نظر بگیرید:

System: You are a data extraction assistant. Your goal is to extract entities from the user's input.
User: Extract the following fields from the text below: "name", "email", and "subscription_tier". 
Return ONLY a valid JSON object. Do not include markdown formatting like ```json. 

Text: "Hi, I'm Alice Smith, contact me at alice@test.com. I have a premium subscription."
Assistant:

به دستورالعمل خاص برای پرهیز از قالب‌بندی مارک‌داون توجه کنید. بسیاری از مدل‌ها JSON را به طور پیش‌فرض در بلوک‌های کد قرار می‌دهند که پارسرهای سخت‌گیر را مختل می‌کند. ممنوعیت صریح این کار، استحکام را بهبود می‌بخشد.

2. محدودیت‌های سطح API (حالت JSON بومی)

APIهای مدرن (مانند آن‌هایی از OpenAI، Anthropic و Google) اغلب یک پارامتر `response_format` ارائه می‌دهند. با تنظیم این پارامتر روی `{ "type": "json_object" }`، مدل در حین رمزگشایی از نظر فنی محدود می‌شود تا توکن‌هایی را تولید کند که یک ساختار JSON معتبر را تشکیل دهند. این کار احتمال خطاهای نحوی را به طور قابل توجهی نسبت به رویکردهای مبتنی بر پرامپت تنها کاهش می‌دهد.

import openai

client = openai.OpenAI()

response = client.chat.completions.create(
  model="gpt-4",
  messages=[{"role": "user", "content": "Extract data from: John, 30, Engineer"}],
  response_format={ "type": "json_object" }
)

بهترین شیوه‌ها برای حالت JSON مستحکم

  • تعریف یک طرحواره (Schema): هنگام استفاده از حالت‌های JSON بومی، اگر API از آن پشتیبانی می‌کند (مثلاً از طریق فراخوانی تابع یا خروجی‌های ساختاریافته)، یک JSON Schema ارائه دهید. این کار به مدل اجازه می‌دهد تا خروجی خود را قبل از بازگشت، با کلیدها و انواع مورد انتظار شما اعتبارسنجی کند.
  • مدیریت خطاها به صورت ظریف: حتی با حالت JSON، مدل‌ها ممکن است کلیدهای توهمی تولید کنند یا فیلدهای مورد نیاز را از دست بدهند. یک مکانیسم تلاش مجدد با تأخیر نمایی (exponential backoff) در صورت شکست پارس پیاده‌سازی کنید.
  • اعتبارسنجی ورودی: اطمینان حاصل کنید که داده‌های ورودی تمیز هستند. متن مبهم یا پر نویز، احتمال خروجی JSON نامعتبر را افزایش می‌دهد.

نتیجه‌گیری

ادغام LLMها در محیط‌های عملیاتی نیازمند فراتر رفتن از تولید متن ساده است. حالت JSON یک تکنیک اساسی است که شکاف بین درک زبان طبیعی و اجرای برنامه‌ای را پر می‌کند. با ترکیب دستورالعمل‌های پرامپت واضح با محدودیت‌های سطح API، توسعه‌دهندگان می‌توانند برنامه‌های قابل اعتماد و مقیاس‌پذیری بسازند که از قدرت هوش مصنوعی بهره می‌برند بدون اینکه یکپارچگی داده‌ها قربانی شود.

Share: