بسیاری از سیستمهای مبتنی بر مدلهای زبانی هنگام ارزیابی و اصلاح خودکار متن، به نقدهای متنی آزاد و بازنویسیهای کلی متکی هستند. این رویکرد معمولاً باعث رفتارهای نوسانی، اصلاح یک بخش به قیمت خراب شدن بخش دیگر، یا گرفتار شدن در حلقههای تکرار بیپایان میشود؛ چرا که ناقد هیچ متریک ساختاریافتهای برای تشخیص بهبود واقعی ارائه نمیدهد.
در این درس یاد میگیرید که چگونه یک حلقه ناقد (Critic Loop) مهندسیشده بسازید که بهجای اظهارنظرهای کلی، کیفیات متن را در قالب بردارهای امتیازی چندبُعدی بررسی کند. با جداسازی شفاف وظایف میان ناقد، بازنگر و بستر آزمایشی (harness)، سیستم قادر خواهد بود با قوانینی صریح میان رسیدن به هدف، توقف روی فلات و پایان بودجه تصمیم بگیرد.
پیادهسازی ارائهشده در این درس کاملاً قطعی و بدون نیاز به فراخوانی مدلهای ابری یا کارت گرافیک است و بهراحتی روی پردازنده شخصی اجرا میشود؛ ازاینرو دغدغهای بابت هزینههای پرداختی ارزی یا اختلال در دسترسی به APIهای خارجی وجود ندارد.
ناقدی که بار اول بگوید «خوب به نظر میرسد»، به درد نمیخورد. ناقدی هم که همیشه بگوید «نیاز به کار دارد»، باز هم ناکارآمد است. ناقد به دردبخور ناقدی است که همگرا شود، و این همگرایی را شما باید مهندسی کنید.
اهداف یادگیری
- امتیازدهی به پیشنویس مقاله در پنج بُعد مشخص: شفافیت (clarity)، نوآوری (novelty)، شواهد (evidence)، روششناسی (methodology) و پیشینه پژوهش (related-work).
- اعمال نقدِ هر دور در قالب تفاوتهای ساختاریافتهی بازنگری (revision diff)، به جای بازنویسی آزاد و ساختارنیافته.
- تشخیص همگرایی با مقایسهی امتیازات در طول دورها؛ توقف هنگام رسیدن به حالت یکنواخت (plateau)، تحقق هدف، یا پایان بودجه.
- محدود کردن تعداد دورها با یک سقف تکرار (budget)، تا ناقدی که همگرا نمیشود تا ابد اجرا نشود.
- تولید یک ردگیری محاسبات (trace) در هر دور، تا داشبورد یا مرحلهی بعدی بتواند مسیر کامل اجرا (trajectory) امتیازات را رسم کند.
چرا پنج بُعد مشخص؟
ناقد آزاد مدلی است که صرفاً یک پاراگراف پیشنهاد تحویل میدهد. در دور بعد، فرایند بازنگری به آن پاراگراف فقط به چشم یک بستر متنی کلی نگاه میکند. در این حالت نمیشود فهمید آیا بازنویسی اصلاً نقدها را برطرف کرده یا نه، چون خودِ نقد از اول هیچ ساختاری نداشته است.
این پنج بُعد یک قرارداد مشخص به بستر آزمایشی (harness) میدهند.
امتیاز نهایی یک بردار است. بستر آزمایشی تکتک ابعاد را در طول دورها زیر نظر میگیرد. بازنگری جدیدی که شفافیت متن را بالا ببرد اما به شواهد ضربه بزند، یک پسرفت در شواهد است و بررسی همگرایی متوجه آن میشود. ناقدی که صرفاً متکی به مدل زبانی باشد، نمیتواند چنین تضمینی بدهد.
ساختار نقد
هر پیشنهاد مشخص میکند که کدام بُعد را بهبود میدهد، کدام بخش از مقاله را هدف میگیرد و شامل یک دستور edit است که بازنگر (reviser) میتواند آن را اعمال کند. بازنگر خودش یک شیء قابل فراخوانی (callable) است. در این درس، یک بازنگر قطعی (deterministic) ارائه دادهایم که دستور ویرایش را به شکل عملیاتِ الحاق به بخش مربوطه تفسیر میکند. بازنگری که متکی به مدل زبانی باشد، همین فیلد را به چشم یک پرامپت میبیند؛ قرارداد میان اجزا هیچ تغییری نمیکند.
قوانین همگرایی، به ترتیب اولویت
حلقهی ناقد با رخ دادن هر کدام از این سه شرط متوقف میشود:
رسیدن به هدف، سختگیرانهترین حالت است: تمام این پنج بُعد (clarity ،novelty ،evidence ،methodology ،related_work) باید به امتیاز target_score =< (پیشفرض 8.0) برسند تا حلقه وضعیت موفقیت را برگرداند. میانگینِ بالا وقتی حتی یکی از ابعاد ضعیف باشد کافی نیست. در مرحلهی بعد، تشخیص حالت یکنواخت، میانگین دور فعلی را با میانگین دور قبل مقایسه میکند. اگر میزان پیشرفت برای دو دور پیاپی کمتر از plateau_epsilon (پیشفرض 0.1) باشد، حلقه با وضعیت plateau خارج میشود. بودجه هم یک سقف سختگیرانه روی تعداد دورها است (پیشفرض 5) که با رسیدن به آن، حلقه با وضعیت budget به پایان میرسد.
ترتیب اولویتها مهم است: رسیدن به هدف بر حالت یکنواخت اولویت دارد و حالت یکنواخت بر پایان بودجه. اگر در دور سوم به هدف برسید و همان تکرار شرطِ حالت یکنواخت را هم فعال کند، نتیجه target خواهد بود، نه plateau.
چرا تشخیص حالت یکنواخت طی دو دور بررسی میشود؟
یکنواخت ماندن در یک دور، صرفاً نویز است. حتی روی یک پیشنویس ثابت، یک ناقد واقعی در هر تکرار امتیاز متفاوتی میدهد؛ چون امتیازدهی قطعی هم به این بستگی دارد که کدام پیشنهادها و با چه ترتیبی اعمال شدهاند. شرط گذاشتن برای دو دور پیاپیِ یکنواخت، این نویز را فیلتر میکند. اگر بستر آزمایشی وضعیت یکنواخت را گزارش کند، یعنی پیشرفت پیشنویس واقعاً متوقف شده است.
ناقد قطعی در این درس
در این درس هیچ مدلی فراخوانی نمیشود. ناقدی که پیاده کردهایم یک شیء قابل فراخوانی است که پیشنویس را بر اساس سه سیگنال امتیازدهی میکند: میانگین طول متن بخشها (شفافیت)، تعداد نمودارها و ارجاعات (شواهد)، و یک فیلد originality_tag در متادیتای مقاله (نوآوری). بازنگر دقیقاً میداند چطور هر امتیاز را push کند و بالاتر ببرد.
clarity grows when the average section body length increases
novelty grows when originality_tag is set to "high"
evidence grows when a section's figure_refs is non-empty
methodology grows when a section titled "Method" exists with body
related-work grows when a section titled "Related Work" exists with body
بازنگر هر پیشنهاد را مثل یک الحاق هدفمند تفسیر میکند. بعد از دور اول، بستر آزمایشی میتواند بالا رفتن امتیاز را ببیند. در تستها از همین ویژگی استفاده میکنیم تا مطمئن شویم حلقه دارد فاصلهی امتیاز تا هدف را کم میکند.
قرارداد کامل حلقه
بستر آزمایشی مدیریت شمارندهی دورها، ردگیری محاسبات و بررسی همگرایی را بر عهده دارد. امتیازدهی دست ناقد است، و اعمال تغییرات (diff) هم دست بازنگر. هیچکدام از این سه جزء به وضعیت داخلی دیگر اجزا کاری ندارند.
خروجی ردگیری محاسبات
هر دور یک رویداد ردگیری محاسبات ثبت میکند که شامل شمارهی دور، بردار امتیازات، تعداد پیشنهادها و حکم همگرایی است. کل ردگیری محاسبات در کنار پیشنویس نهایی برگردانده میشود. داشبورد مراحل بعدی میتواند نمودار امتیاز به ازای هر دور را رسم کند. در درس بعد، اسکژولر تکرار (iteration scheduler) این ردگیری را میخواند تا تصمیم بگیرد آیا branch ارزش نگه داشتن دارد یا نه.
بودجههایی برای مهار ناقدهای بدقلق
ناقدی که پیشنهادهایش هیچوقت امتیاز را بالا نبرند، حلقه را تا سقف حداکثر تکرار پیش میبرد. ردگیری محاسبات این مشکل را کاملاً مشخص میکند: پنج دور، امتیازهای دستنخورده، حکم نهایی budget. کاربر این را ناشی از باگ ناقد میداند، نه باگ خودِ پیشنویس. اگر فقط پیشنویس نهایی را نشان دهیم، این عیبیابی عملاً ناممکن میشود. طراحی ردگیریمحور (trace-first) این ایراد را آشکارا جلوی چشم میآورد.
راهنمای خواندن کد
فایل code/main.py شامل تعاریف Critique ،Suggestion، پروتکل Critic، پروتکل Reviser، کلاس CriticLoop و فکتوریِ make_deterministic_critic_pair است که جفت ناقد قطعی و بازنگر متناسب با آن را برمیگرداند. یک ساختار حداقلی از Paper هم اضافه شده است تا این درس کاملاً مستقل و خودکفا اجرا شود.
فایل code/tests/test_critic_loop.py این سناریوها را پوشش میدهد: بهبود یکنواخت پس از دور اول، همگرایی به هدف روی پیشنویس تنظیمشده، تشخیص حالت یکنواخت پس از دو دور بدون رشد، تمام شدن بودجه در صورت عدم پیشرفت با پیشنهادها، نحوهی اعمال پیشنهادها توسط بازنگر، و ساختار خروجی ردگیری محاسبات.
گام بعدی
در یک پیادهسازی واقعی دو توسعه مد نظر قرار میگیرد. اول، وزندهی به ابعاد: برای مقالهای که به یک کارگاه فرستاده میشود، نوآوری وزن بیشتری نسبت به روششناسی دارد؛ در ژورنالها قضیه برعکس است. در این حالت، بررسی همگرایی به یک میانگین وزنی تبدیل میشود. دوم، ناقدهای جفتی: یک ناقد امتیاز میدهد و ناقد دوم پیشنهادها را پیش از رسیدن به دست بازنگر بررسی و غربال میکند. هر دو مورد ارزشافزوده دارند و هر دو روی همان ساختار Critique سوار میشوند.
برگ برندهی این طراحی، بردار امتیازات است. وقتی نقد ساختاریافته باشد، همهی اجزای دیگر — از قوانین همگرایی و داشبوردها گرفته تا ناقدهای جفتی — بدون دست زدن به حلقهی اصلی، خیلی راحت به سیستم اضافه میشوند.
