شیدهوش
فصل ۲ · درس ۱۰ از ۱۳

۱۰. خروجی ساختاریافته

در محصول واقعی خروجی مدل را اغلب برنامهٔ دیگری می‌خواند، پس باید قالب مشخصی داشته باشد. این درس پنج جای پشتهٔ هوش مصنوعی را نشان می‌دهد که می‌شود قالب را آن‌جا تضمین کرد — از چسب زخم تا درمان جدی.

زمان مطالعه: ۱۷ دقیقهمرجع در کتاب: فصل ۲، بخش Structured Outputs — صفحهٔ ۲۰۶

خروجی ساختاریافته

در محصول واقعی خیلی وقت‌ها خروجی مدل باید یک قالب مشخص داشته باشد. دو حالت اصلی هست:

  1. خود کار ساختاریافته است. مثلاً تبدیل زبان طبیعی به یک قالب ماشینی: «میانگین درآمد ماهانه در شش ماه گذشته چقدر بوده؟» ← یک دستور SQL معتبر. یا دسته‌بندی، که خروجی باید دقیقاً یکی از برچسب‌های مجاز باشد.
  2. خروجی را برنامهٔ دیگری می‌خواند. نوشتن ایمیل ذاتاً ساختار نمی‌خواهد، ولی اگر برنامهٔ شما ایمیل را به شکل {"title": ..., "body": ...} لازم دارد، خروجی باید همین شکل را داشته باشد. در ایجنت‌ها (فصل ۶) این حیاتی است، چون خروجی مدل مستقیم ورودی یک ابزار می‌شود.

مهم‌ترین دستهٔ حالت اول تجزیهٔ معنایی (semantic parsing) است: تبدیل زبان طبیعی به قالبی که ماشین بخواند، تا کاربر بتواند با API با زبان خودش کار کند. نمونهٔ کتاب، تبدیل متن به عبارت منظم با GPT-4o است؛ مدل از روی یک مثال، الگوی ایمیل را می‌نویسد:

text
System prompt:
Given an item, create a regex that represents all the ways
the item can be written. Return only the regex.
Example: US phone number -> \+?1?\s?(\()?(\d{3})(?(1)\))[-.\s]?(\d{3})[-.\s]?(\d{4})

User prompt:  Email address ->
GPT-4o:       [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

پنج جای مختلف در پشتهٔ هوش مصنوعی می‌شود قالب را تضمین کرد. سه‌تای اول بیشتر چسب زخماند و وقتی خوب کار می‌کنند که مدل خودش تقریباً بلد است؛ دو تای آخر درمان جدیاند:

روشچه می‌کندنقطهٔ ضعف
پرامپتدر دستور می‌نویسید «فقط JSON برگردان»هیچ تضمینی نیست؛ چند درصد خروجی خراب برای خیلی کاربردها قابل‌قبول نیست
پس‌پردازشیک اسکریپت اشتباه‌های تکراری را خودکار درست می‌کندفقط وقتی کار می‌کند که اشتباه‌ها کوچک و قابل‌حدس باشند
محاسبه در زمان آزمونآن‌قدر تولید کن تا یک خروجی معتبر بیایدهر تلاش دوباره هزینه و تأخیر دارد
نمونه‌برداری محدودشدهتوکن‌های غیرمجاز اصلاً اجازهٔ انتخاب ندارندبرای هر قالب یک گرامر لازم است؛ ممکن است کندتر شود
تنظیم دقیقمدل را روی نمونه‌هایی با همان قالب آموزش می‌دهیدداده و هزینهٔ آموزش (فصل ۷)

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

پس‌پردازش ساده و ارزان است و به‌طرز عجیبی خوب کار می‌کند. نویسندهٔ کتاب از تجربهٔ تدریسش می‌گوید دانشجوها اشتباه‌های خیلی شبیه به هم می‌کنند؛ مدل‌ها هم همین‌طور. اگر اشتباه رایج را پیدا کنید — مثلاً جا انداختن آکولاد بسته — یک اسکریپت کوچک درستش می‌کند. لینکدین با یک تجزیه‌گر دفاعی برای قالب YAMLYAML Ain't Markup Languageیَمِل، درصد خروجی سالم را از ۹۰٪ به ۹۹٫۹۹٪ رساند. (آن‌ها YAML را به‌جای JSON انتخاب کردند چون کم‌حرف‌تر است و توکن کمتری مصرف می‌کند.)

ابزارهایی که خروجی ساختاریافته را پشتیبانی می‌کنند: guidance، outlines، instructor و llama.cpp. هر ارائه‌دهنده هم روش خودش را دارد؛ OpenAI اولین کسی بود که حالت JSON را به API تولید متن آورد. کتاب می‌گوید بسته به کار و مدل، درصد JSON درست از صفر تا بالای ۹۰٪ دیده است.

نمونه‌برداری محدودشده

یادتان هست مدل برای هر توکن واژگان یک لاجیت می‌دهد؟ نمونه‌برداری محدودشده قبل از قرعه، لاجیت توکن‌هایی را که با قالب سازگار نیستند حذف می‌کند. مدل نه اینکه «قول بدهد» خارج از قالب حرف نزند — نمی‌تواند.

پرامپت: «احساس این نظر را بگو: مثبت، منفی یا خنثی» — مجاز: فقط سه برچسب۲٫۱مثبت۲٫۴عالی۱٫۲منفی۰٫۶خنثی۱٫۹فکر۰٫۳{۱٫۰بلهلاجیت توکن‌های غیرمجاز پیش از softmax حذف می‌شود؛ قرعه فقط بین ستون‌های سبز کشیده می‌شود.«عالی» محتمل‌ترین بود — ولی دیگر شانسی ندارد.
نمونه‌برداری محدودشده برای یک دسته‌بند احساس. محتمل‌ترین گزینهٔ مدل «عالی» بود، ولی چون جزو برچسب‌های مجاز نیست، لاجیتش پیش از softmax کنار گذاشته می‌شود.

در این مثال فیلتر کردن ساده است. ولی برای قالبی مثل JSON باید یک گرامر داشته باشید که بگوید در هر قدم چه چیزی مجاز است — مثلاً بعد از { آکولاد باز دیگری نمی‌تواند بیاید، مگر داخل یک رشته. ساختن این گرامر سخت است و برای هر قالب (JSON، YAML، CSV، عبارت منظم) جدا. بعضی معتقدند این زحمت بهتر است صرف آموزش مدل در پیروی از دستور شود.

تنظیم دقیق روی نمونه‌هایی با قالب دلخواه، مؤثرترین و عمومی‌ترین راه است. برای بعضی کارها می‌شود حتی معماری مدل را عوض کرد: مثلاً برای دسته‌بندی، یک سر دسته‌بند (classifier head) به انتهای مدل می‌چسبانند که فقط و فقط یکی از برچسب‌های مشخص را خروجی می‌دهد. در فصل ۷ به آن برمی‌گردیم.

ورودی متن«این فیلم عالی بود»مدل پایهلایه‌های قبلی، بدون لایهٔ خروجی زبانسر دسته‌بندلایهٔ تازهمثبتمنفیخنثیخروجی فقط یکی از برچسب‌های از پیش تعیین‌شده است؛ قالب را معماری تضمین می‌کند.
سر دسته‌بند: مدل پایه به‌جای توکن، یکی از سه برچسب را خروجی می‌دهد (شکل ۲-۲۲ کتاب).

هنگام تنظیم دقیق می‌شود کل مدل را سرتاسری دوباره آموزش داد یا فقط بخشی مثل همین سر را. آموزش سرتاسری منابع بیشتری می‌خواهد ولی نتیجهٔ بهتری نوید می‌دهد. کتاب پیش‌بینی می‌کند با قوی‌تر شدن مدل‌ها در پیروی از دستور، این فنون کم‌اهمیت‌تر شوند. در درس ۱۳ دو ابزار از همین‌ها را خودتان می‌سازید.

خودآزمایی

یک دسته‌بند احساس دارید که باید فقط «مثبت»، «منفی» یا «خنثی» بگوید، ولی گاهی می‌گوید «عالی». کدام روش تضمین می‌کند هرگز چیزی خارج از این سه نگوید؟
LinkedIn چرا YAML را به JSON ترجیح داد؟
برای کدام حالت، پس‌پردازش کافی است؟

مرور فلش‌کارت‌های این درس

تعریف

نمونه‌برداری محدودشده (constrained sampling) چیست؟

برای دیدن پاسخ کلیک کنید یا Space بزنید

کارت ۱ از ۶

آکادمی هوش مصنوعی شیدهوش — بخشی از shidhoosh.com