چیت‌شیت

خروجی‌های ساختاریافته و رمزگشایی مقید

Structured Outputs and Constrained Decoding

همیشه JSON معتبر بگیرید. اسکیماها، حالت سخت‌گیرانه، ماسک‌های لاجیت، اعتبارسنج‌ها، تلاش‌های مجدد و پروژه‌ی محافظ خروجی.

  • ۱۲ بخش
  • ۳ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. پایپ‌لاین محافظ خروجی
  2. یک گام رمزگشایی مقید
  3. اجرای پروژه‌ی محافظ خروجی
  4. وظایف در کد
  5. پرسش‌ها
  6. نکات
  7. اسکیمای Pydantic با Instructor
  8. ترمیم محدودشده در TypeScript
  9. سطوح کنترل
  10. پیش‌فرض‌ها و اعداد
  11. عیب‌یابی
  12. کوته‌نوشت‌ها

پایپ‌لاین محافظ خروجی

معماری
رشته‌ی خاماسکیمامقداربدون مشکلمشکلاتIssue[]بودجه مصرف شدتولیدبازخورد، تلاشparseJSONسقف 100_000 بایتcheckSchemaبررسی اولیه، عمق 32اعتبارسنجیIssue[] با مسیرهاپذیرفته‌شدهمقدار به همراه ردگیری محاسباتترمیمبودجه‌ی maxAttemptsپایان‌یافتهثبت همه‌ی تلاش‌ها در ردگیری محاسبات

یک گام رمزگشایی مقید

گام‌به‌گام
  1. مدلیک بردار لاجیت روی کل واژگان (حدود 100k توکن) صادر می‌کند.
  2. FSMتابع fsm.valid_tokens(state, tokenizer) توکن‌هایی را که مسیر پذیرش را حفظ می‌کنند فهرست می‌کند.
  3. ماسکتابع mask_logits مقدار سایر لاجیت‌ها را برابر float("-inf") قرار می‌دهد.
  4. نمونه‌گیریسافت‌مکس همه‌ی احتمال را روی توکن‌های معتبر می‌گذارد. یکی را انتخاب کنید.
  5. پیشرویتابع fsm.transition(state, tok). توقف وقتی fsm.is_accept(state) برقرار باشد.

اجرای پروژه‌ی محافظ خروجی

دستورها
دستورکارکرد
python3 scripts/project_test.py json-schema-output-guard --init <ws>محیط کاری شما را یک‌بار می‌سازد. کد آغازین خام ناموفق می‌شود
python3 scripts/project_test.py json-schema-output-guard --stage 1 --path <ws> --strictنمره‌دهی به یک مرحله، از 1 تا 4
python3 scripts/project_test.py json-schema-output-guard --all --solution --strictنمره‌دهی به راه‌حل مرجع
node cli.ts --schema samples/schema.json --attempts samples/attempts.json --output guard.json --html guard.htmlترمیم ثبت‌شده. تلاش 1 در $/confidence ناموفق می‌شود

وظایف در کد

کار و کد
وظیفهکد
تولید JSON محلی با یک FSMgenerator = outlines.generate.json(model, Review)
Pydantic به همراه تلاش مجدد، با هر ارائه‌دهنده‌ایclient = instructor.from_anthropic(Anthropic())
حالت اسکیمای ارائه‌دهندهclient.beta.chat.completions.parse(..., response_format=Product)
اعتبارسنجی یک دیکشنری`validate_schema(data, schema)` returns a list of errors
تجزیه، اعتبارسنجی، تلاش مجددextract_with_retry(text, schema, max_retries=3)
کنترل‌کننده‌ی سه‌شاخه (three-branch)process_model_output(raw, INVOICE_SCHEMA)
محافظت از یک رشته‌ی خام`guard(raw, schema)` returns `ok`, `value`, `issues`
ترمیم محدودشدهawait repair(generate, schema, maxAttempts)

پرسش‌ها

پرسش و پاسخ
آیا امتناع مدل باید تلاش مجدد را فعال کند؟
خیر. آن را لاگ کنید و یک امتناع تایپ‌شده برگردانید.
آیا رمزگشایی مقید کندتر است؟
اغلب سریع‌تر است. توکن‌های اجباری فرایند تولید را دور می‌زنند.
آیا به مدل بزرگی نیاز دارد؟
خیر. یک مدل 3B مجهز به گرامر از یک مدل 70B با پرامپت‌ها بهتر عمل می‌کند.
آیا پذیرش، درستی پاسخ را ثابت می‌کند؟
خیر. صحت محتوایی و واقعی را تضمین نمی‌کند.
چرا باید اول checkSchema فراخوانی شود؟
یک اسکیمای خراب دیگر نمی‌تواند بودجه‌ی ارائه‌دهنده را هدر دهد.

نکات

نکته‌ها
  • مدل محلی، اسکیمای مسطح: Outlines. اسکیمای بازگشتی: XGrammar یا llguidance.
  • سرور خودمیزبان: vLLM گزینه‌های guided_json، guided_regex و guided_choice دارد.
  • زمانی که مدل باید یکی از چند اسکیما را برگزیند از استفاده از ابزار کمک بگیرید.
  • به‌جای متن آزاد، آرایه‌ی ساختاریافته‌ی Issue[] را به مدل بازگردانید.
  • تمام تلاش‌ها را در ردگیری محاسبات نگه دارید. موفقیت دیرهنگام، شکست‌های قبلی را پنهان نمی‌کند.
  • محافظ $ref، فرمت و ترکیب‌کننده‌ها را رد می‌کند.
  • در دستورات پروژه، <ws> همان learning-artifacts/json-schema-output-guard است.

اسکیمای Pydantic با Instructor

کد
python
class Invoice(BaseModel):
    vendor: str
    total_usd: float = Field(ge=0)  # محدوده‌ی عددی
    line_items: list[str]

client = instructor.from_anthropic(Anthropic())
invoice = client.messages.create(
    model="claude-opus-4-7",
    max_tokens=1024,
    response_model=Invoice,         # تلاش مجدد هنگام نقض اعتبارسنجی
    messages=[{"role": "user", "content": "<text>"}],
)

ترمیم محدودشده در TypeScript

کد
typescript
const schema: Schema = {
  type: "object",
  properties: {
    answer: { type: "string", minLength: 1 },
    confidence: { type: "number", minimum: 0, maximum: 1 },
  },
  required: ["answer", "confidence"],
  additionalProperties: false,                        // ویژگی ناشناخته یک مشکل محسوب می‌شود
};
await repair(async (_, i) => outputs[i - 1], schema)  // وضعیت و ردگیری محاسبات

سطوح کنترل

مفهوم‌ها
مبتنی بر پرامپت
"در قالب JSON معتبر پاسخ دهید". حدود 90% معتبر. بدون اجبار قطعی.
حالت JSON
نحوِ معتبر JSON. بدون ضمانت انطباق با اسکیما.
حالت اسکیما
خروجی با اسکیمای JSON مطابقت دارد. به‌صورت بومی در همه‌ی ارائه‌دهندگان بزرگ موجود است.
رمزگشایی مقید
توکن‌های نامعتبر را ماسک می‌کند. 100% معتبر بر پایه‌ی ساختار.
Instructor
لاجیت‌ها را دستکاری نمی‌کند. تجزیه، اعتبارسنجی و تلاش مجدد انجام می‌دهد.
Outlines
اسکیما یا regex را به یک FSM کامپایل می‌کند. بازگشت نیازمند مسطح‌سازی است.
XGrammar، llguidance
موتورهای CFG. اسکیماهای بازگشتی را پردازش می‌کنند.
حالت سخت‌گیرانه
تمام فیلدها درون required، additionalProperties: false و بدون $ref.

پیش‌فرض‌ها و اعداد

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
max_retries3در extract_with_retry
Instructor retries3هنگام نقض اعتبارسنجی
Retry limit3xتلاش‌های مجددِ بیشتر نشانهٔ یک اسکیمای نامناسب است
maxAttempts3بودجه باید بین 1..10 باشد
Depth limit32checkSchema و validate
Output size cap100_000بایت‌ها، پیش از JSON.parse بررسی می‌شوند
CLI exit code2نتیجه‌ی ردشده یا پایان‌یافته
Prompt-only JSON85 to 95 percentنرخ موفقیت در مدل‌های مرزی

عیب‌یابی

عیب‌یابی
  • JSON معتبر، پاسخ اشتباه

    علت
    answer قبل از reasoning
    راه‌حل
    فیلدهای استدلال را اول قرار دهید
  • مدل تاریخ ساختگی تولید می‌کند

    علت
    گرامر بیش از حد سخت‌گیر است
    راه‌حل
    اجازه‌ی مقدار null یا یک مقدار نشانگر (sentinel) را بدهید
  • تایم‌اوت در enum با 10,000 گزینه

    علت
    enum بسیار بزرگ
    راه‌حل
    موارد k تای برتر را بازیابی و خروجی را به آن‌ها محدود کنید
  • خروجی درختی در Outlines با شکست مواجه می‌شود

    علت
    FSM بازگشت را مسطح می‌کند
    راه‌حل
    از XGrammar یا llguidance استفاده کنید
  • JSON معتبر، ساختار اشتباه

    علت
    حالت JSON بدون اسکیما
    راه‌حل
    همیشه یک اسکیمای کامل ارسال کنید
  • خطای 400 از API

    علت
    نقض قوانین حالت سخت‌گیرانه
    راه‌حل
    اصلاح required، فیلدهای اضافی و $ref
  • نوع داده درست، مقدار ساختگی

    علت
    مقدار توهم‌شده
    راه‌حل
    اسکیما جلوی آن را نمی‌گیرد. مقادیر را اعتبارسنجی کنید
  • فیلد اختیاری حذف شده است

    علت
    فیلد جزو required نیست
    راه‌حل
    آن را اجباری کنید، اما مقدار null را بپذیرید

کوته‌نوشت‌ها

اصطلاح‌ها
FSM
ماشین وضعیت متناهی. جستجوی توکن معتبر بعدی با پیچیدگی $O(1)$.
CFG
گرامر مستقل از متن. ساختارهای بازگشتی را مدیریت می‌کند.
پردازنده‌ی لاجیت
تابع (logits, state) -> masked_logits.
رمزگشایی هدایت‌شده
همان مفهوم در سرور استنتاج.
امتناع مدل
خروجی تایپ‌شده زمانی که ورودی با اسکیما همخوانی ندارد.
خطای تجزیه
خروجی JSON نیست. در حالت سخت‌گیرانه غیرممکن است.
نقض اسکیما
خروجی تجزیه می‌شود اما اسکیما را نقض می‌کند.
مشکل
ساختار { path: string; message: string } در پروژه‌ی محافظ.