Prompt Engineering

حرفه‌ای شدن در حالت JSON: خروجی ساختاریافته برای یکپارچه‌سازی‌های قابل اعتماد LLM

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

حالت JSON چیست؟

حالت JSON یک ویژگی است که توسط بسیاری از APIهای مدرن LLM (مانند OpenAI، Anthropic و Google) پشتیبانی می‌شود و مدل را مجبور می‌کند پاسخی تولید کند که به‌طور سخت‌گیرانه JSON معتبر باشد. برخلاف اتکا به پرامپت‌های سیستمی که صرفاً درخواست خروجی JSON می‌کنند، حالت JSON یک محدودیت سخت است. مدل از نظر فنی از شامل کردن بلوک‌های کد مارک‌داون، متن توضیحی یا هر کاراکتر غیر-JSON دیگری در پاسخ نهایی خود جلوگیری می‌شود.

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

چگونه حالت JSON را فعال کنیم

فعال‌سازی حالت JSON معمولاً از طریق پارامترهای API ساده است. در زیر یک مثال عملی با استفاده از Python و کتابخانه OpenAI آورده شده است.

import openai
import json

client = openai.OpenAI()

completion = client.chat.completions.create(
    model="gpt-4o",
    response_format={"type": "json_object"},
    messages=[
        {
            "role": "system",
            "content": "You are a helpful assistant that extracts structured data."
        },
        {
            "role": "user",
            "content": "Extract the name, age, and occupation from this text: 'My name is John Doe, I am 30 years old, and I work as a Software Engineer.'"
        }
    ]
)

print(json.dumps(json.loads(completion.choices[0].message.content), indent=2))

در این مثال، پارامتر response_format روی {"type": "json_object"} تنظیم شده است. این دستور به API می‌گوید که اطمینان حاصل کند خروجی یک شیء JSON معتبر است.

تعریف اسکیم با پرامپت‌های سیستم

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

بهترین روش‌ها برای تعریف اسکیم

  • صریح باشید: تمام فیلدهای مورد نیاز را فهرست کنید.
  • انواع را مشخص کنید: روشن کنید که آیا یک فیلد رشته، عدد صحیح، بولی یا آرایه است.
  • نمونه ارائه دهید: یک خروجی JSON نمونه را در پرامپت سیستم گنجانده تا مدل را هدایت کنید.
system_prompt = """
You are a data extraction engine. Extract user information from the provided text.
Return a JSON object with the following structure:
{
    "name": "string",
    "age": "integer",
    "occupation": "string"
}
If a field is missing, use null.
"""

مدیریت اعتبارسنجی و موارد حاشیه‌ای

حتی با حالت JSON، باید همچنان اعتبارسنجی سمت کلاینت را با استفاده از کتابخانه‌هایی مانند Pydantic (Python) یا Zod (JavaScript) پیاده‌سازی کنید. این به عنوان یک توری ایمنی در برابر موارد حاشیه‌ای عمل می‌کند که در آن مدل ممکن است JSON ساختاری معتبر اما داده‌های معنایی نادرست تولید کند (مثلاً سن ۲۰۰ یا کلیدی که وجود ندارد).

from pydantic import BaseModel, ValidationError

class UserData(BaseModel):
    name: str
    age: int
    occupation: str

try:
    user_data = UserData(**json.loads(completion.choices[0].message.content))
    print("Validation passed:", user_data)
except ValidationError as e:
    print("Validation failed:", e)

تله‌های رایج و راه‌حل‌ها

۱. تله "Null"

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

۲. پیچیدگی تودرتو

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

نتیجه‌گیری

حالت JSON فقط یک ویژگی راحتی نیست؛ بلکه یک سنگ بنای یکپارچه‌سازی قابل اعتماد LLM است. با ترکیب حالت JSON با تعاریف صریح اسکیم در پرامپت‌های سیستم و اعتبارسنجی سخت‌گیرانه سمت کلاینت، می‌توانید برنامه‌های مستحکمی بسازید که از هوش LLMها بهره می‌برند بدون اینکه از یکپارچگی داده‌ها بگذرند. چه در حال ساخت یک ربات پشتیبانی مشتری هوش مصنوعی، یک خط لوله استخراج داده یا یک موتور جستجوی معنایی باشید، خروجی ساختاریافته کلید مقیاس‌پذیری مؤثر ویژگی‌های هوش مصنوعی شماست.

Share: