فاز 19 · درس 86

موتور قوانین بنیادین (Constitutional Rules Engine): اعتبارسنجی و اصلاح خودکار خروجی LLM

نوع
ساختنی
زمان
حدود 90 دقیقه
زبان‌ها
Python, YAML
پیش‌نیاز
درس‌های ایمنی فاز 18، فاز 19 مسیر A درس‌های 25 تا 29
طوماری با قوانین مشخص و نشانگرهای علامت‌گذاری‌شده در کنار یک چرخ‌دنده مکانیکی دقیق
فهرست مطالب
  1. صورت‌مسئله
  2. مفهوم
  3. پیاده‌سازی
  4. استفاده
  5. تحویل
  6. تمرین‌ها
  7. اصطلاحات کلیدی
  8. مطالعه‌ی بیشتر

دسته‌بندهای متنی و مدل‌های یادگیری ماشین برای تشخیص لحن یا محتوای خطرناک عالی هستند، اما در اعمال شروط دقیق، قراردادی و سازمانی عملکرد مطمئنی ندارند. برای مثال، شروطی مانند «هر امتناع باید شامل راه‌حل جایگزین باشد» یا «هیچ اطلاعات حساسی در قالب مثال ظاهر نشود» را نمی‌توان به‌سادگی به یک مدل آماری سپرد؛ این وظایف نیازمند قواعد شفاف، قابل‌تفسیر و قابل‌ویرایش توسط افراد غیرفنی هستند.

در این درس یاد می‌گیرید که چطور یک موتور قوانین بنیادین (Constitutional Rules Engine) را با فایل‌های توصیفی YAML پیاده‌سازی کنید. این موتور علاوه بر ارزیابی گزاره‌های شرطی روی پاسخ مدل، به یک سیستم اصلاح‌گر (Fixer) مجهز است که خطاهای متن را به‌طور خودکار رفع کرده و گزارش تفاوت‌های اعمال‌شده (Diff) را ثبت می‌کند.

یک قانون یعنی یک نام، یک گزاره و یک توضیح. هر چیزی که یکی از این سه مورد را نداشته باشد، صرفاً یک حس‌وحال مبهم است، نه قانون.

صورت‌مسئله

دسته‌بندها (Classifiers) خرابی‌های قابل‌تشخیص را پوشش می‌دهند؛ موتورهای قانون‌محور (Rules engines) به سراغ شروط قراردادی می‌روند. تیمی که یک دستیار کدنویسی می‌نویسد، چنین قیدی می‌خواهد: «هر پاسخی که حاوی کد است، باید یا به یک بلوک کد قابل‌اجرا ختم شود یا به یک فرضِ اعلام‌شده.» تیمی که بات پشتیبانی مشتریان را می‌گرداند، این شرط را می‌خواهد: «در هر امتناع مدل (Refusal)، باید گام بعدی به کاربر پیشنهاد شود.» این قیدها هدفِ مناسبی برای دسته‌بندها نیستند؛ بلکه گزاره‌هایی روی پاسخ، تاریخچه‌ی گفت‌وگو و خط‌مشی سیستم هستند که افراد غیرفنی هم باید بتوانند آن‌ها را بخوانند.

رویکرد صادقانه و درست، استفاده از یک فایل توصیفی است. یک شیوه‌نامه‌ی بنیادین (Constitution) به‌صورت فایل YAML در کنار کدها، در کنترل نسخه (Version Control) و با فرایند بازبینی مجزا قرار می‌گیرد. هر قانون شامل یک name، یک severity (سطح حساسیت)، یک الگوی explanation و گزاره‌ای است که به دو فیلد تقسیم می‌شود: applies_when مشخص می‌کند که آیا قانون در دامنه (Scope) قرار دارد یا خیر، و must شرطی است که پاسخ ملزم به برآورده کردن آن است. موتور قوانین این فایل را بارگذاری می‌کند، تک‌تک قوانین را روی خروجی پیشنهادی می‌سنجد و به‌ازای هر قانونی که فعال شود، یک رکورد ساختاریافته‌ی Violation برمی‌گرداند. موتور قوانین در این پروژه‌ی پایانی، گزاره‌ها را با all_of، any_of و not_ ترکیب می‌کند تا یک قانون واحد بتواند بگوید: «اگر پاسخ شامل کد است، باید به یک بلوک قابل‌اجرا ختم شود و نباید به هیچ کتابخانه‌ی منحصراً داخلی ارجاع دهد.»

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

مفهوم

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

یک قانون چنین ساختاری دارد:

- name: end-with-runnable-or-assumption
  severity: medium
  applies_when:
    contains_regex: '```python'
  must:
    any_of:
      - ends_with_regex: '```\s*$'
      - contains_regex: 'assumption:'
  explanation: "Code responses must end in either a closing fence or an explicit assumption."
  fix:
    append_if_missing: "\n\nAssumption: example inputs are valid."

گزاره‌ها اتمیک هستند: contains_regex، not_contains_regex، ends_with_regex، starts_with_regex، max_words، min_words. عملگرهای ترکیبی نیز شامل all_of، any_of و not_ می‌شوند. موتور ابتدا فیلد applies_when را ارزیابی می‌کند؛ اگر قانون صدق نکند، تخلف در وضعیت not_applicable ثبت می‌شود. در غیر این صورت، موتور فیلد must را ارزیابی کرده و خروجی pass یا violation می‌دهد.

سطوح حساسیت مطابق درس 85 شامل low، medium و high هستند. گیت نظارتی بعدی (درس 87) با نقض یک قانون high دقیقاً مثل نظرِ دسته‌بند در سطح high برخورد می‌کند: مسدودسازی.

اصلاح‌گر فهرستی از عملیات توصیفی است: append_if_missing، prepend_if_missing، replace_regex. هر عملیات، نام یک قانون را به یک تبدیل متنی نگاشت می‌کند. اصلاح‌گر عمداً به ویرایش‌های موضعی محدود شده است؛ بازنویسی‌های ساختاری به لایه‌ی مجزایی از نوع «امتناع و راهنمایی» تعلق دارند که در این درس بررسی نمی‌شود.

تفاوت (Diff) با مقایسه‌ی نسخه‌ی اصلی و بازبینی‌شده محاسبه می‌شود؛ فهرستی از رکوردهای Change با فیلد op (افزودن، حذف، ویرایش) و متن مربوطه. گیت بعدی می‌تواند این تغییرات را ثبت کند تا یک ارزیاب انسانی بتواند رفتار اصلاح‌گر را در طول زمان بررسی و بازرسی کند.

قوانین ساختاری (CONSTITUTIONAL RULES)پیش‌نویس ← اصلاح ← بررسی مجدد
CONSTITUTIONAL RULESA rule is a name, a predicate, and an explanation; anything missing one of those is a vibe. The constitution lives in YAML under version control. The engine flags each violation, the fixer proposes a revision, and a second pass confirms the revision satisfies every rule before the response is accepted or escalated.پیش‌نویسموتور قوانیناصلاح‌کنندهبازبینی‌شدهبررسی دور دوم قوانینحکم نهایینقض: کد فاقد بلوک قابل‌اجرا استپذیرفته شد: بازبینی تمام قوانین را برآورده می‌کند
یک قانون متشکل از نام، یک گزاره و یک توضیح است؛ فقدان هر یک از این‌ها آن را به حدس و حس مبدل می‌کند. منشور قوانین در قالب YAML و تحت کنترل نسخه قرار دارد. موتور هر نقض را مشخص می‌کند، اصلاح‌کننده بازبینی را پیشنهاد می‌دهد، و مرحله‌ی دوم قبل از پذیرش یا ارجاع پاسخ، تأیید می‌کند که بازبینی تمام قوانین را برآورده ساخته است.

پیاده‌سازی

فایل code/rules.yml شیوه‌نامه‌ی بنیادین را در خود نگه می‌دارد. بارگذار موجود در code/main.py هم فایل YAML (در صورت نصب بودن PyYAML) و هم فایل JSON (کتابخانه‌ی توکار) را می‌پذیرد. در این درس فایل rules.yml طوری عرضه شده که تست‌ها آن را از هر دو مسیر پارس می‌کنند. فایل code/main.py کلاس‌های Engine و Fixer و یک تابع diff را تعریف می‌کند. عبارات ترکیبی به‌صورت بازگشتی و با ارزیابی میان‌بُر (Short-circuiting) روی any_of ارزیابی می‌شوند.

شیوه‌نامه‌ی بنیادین ارائه‌شده:

  • no-empty-refusal (سطح medium) - هر امتناع مدل باید شامل یک پیشنهاد یا تغییر مسیر باشد.
  • end-with-runnable-or-assumption (سطح medium) - پاسخ‌های حاوی کد باید با پایانی تمیز و مشخص بسته شوند.
  • no-pii-in-examples (سطح high) - داده‌های نمونه نباید حاوی ساختار ایمیل یا شماره‌تلفن باشند.
  • cite-when-asserting-fact (سطح low) - خطوطی که با «According to» شروع می‌شوند باید ارجاع پرانتزی داشته باشند.
  • no-internal-library-leak (سطح high) - کلمات internal-only و policybot-internal نباید در خروجی ظاهر شوند.
  • bounded-length (سطح low) - طول پاسخ‌ها نباید از 800 کلمه فراتر برود.

استفاده

دستور python3 main.py را اجرا کنید. این دمو سه پیش‌نویس پاسخ را به موتور می‌فرستد، نقض‌ها را چاپ می‌کند، اصلاح‌گر را اجرا می‌کند، تفاوت‌ها را نشان می‌دهد و نتیجه را در outputs/rules_report.json می‌نویسد. یکی از نمونه‌های تستی قانونی دارد که شامل حالش نمی‌شود (هیچ بلوک کدی در پیش‌نویس نیست)؛ گزارش وضعیت not_applicable را برای آن ثبت می‌کند تا تیم ببیند موتور آن را به‌طور صریح ارزیابی کرده است.

تحویل

سند outputs/skill-constitutional-rules-engine.md گرامر قوانین و عملیات اصلاح‌گر را مستند می‌کند.

تمرین‌ها

  1. قانونی اضافه کنید که در صورت اشاره‌ی پرامپت (Prompt) به ایمنی، پاسخ را ملزم کند عبارت «If this is urgent» را در خود داشته باشد. از گزاره‌های ترکیبی استفاده کنید.
  2. اصلاح‌گر رجکس را با یک اصلاح‌گر مبتنی بر قالب (Templating) با متغیرهای نام‌گذاری‌شده جایگزین کنید. نشان دهید یک قانون چگونه با این طراحی جدید بازنویسی می‌شود.
  3. یک اندپوینت (Endpoint) برای متریک‌ها بسازید که با دریافت مجموعه‌ای از پیش‌نویس‌ها، نرخ نقض هر قانون را برگرداند تا تیم ببیند کدام قانون بیش‌ازحد فعال می‌شود.

اصطلاحات کلیدی

اصطلاح کاربرد عام معنای دقیق
شیوه‌نامه‌ی بنیادین (Constitution) یک سند سیاست‌گذاری مبهم یک فایل YAML از قوانین همراه با گزاره‌ها، سطوح حساسیت و توضیحات
گزاره (Predicate) یک بررسی ساده تابعی با ورودی متن و خروجی بولی؛ به‌صورت اتمیک یا ترکیبی با all_of/any_of/not_
نقض قانون (Violation) یک خطا یک رکورد ساختاریافته با نام قانون، سطح حساسیت، توضیح و اسپن (Span) متن منطبق‌شده
اصلاح‌گر (Fixer) فاین‌تیون مدل یک تبدیل قطعی به‌ازای هر قانون که پیش‌نویس را به نسخه‌ی بازبینی‌شده نگاشت می‌کند
تفاوت‌یاب (Diff) مقایسه‌ی رشته‌ها یک فهرست ساختاریافته از عملیات افزودن، حذف و ویرایش میان پیش‌نویس و نسخه‌ی بازبینی‌شده

مطالعه‌ی بیشتر

در درس 87، این موتور قوانین با آشکارساز سمت ورودی و دسته‌بند سمت خروجی ترکیب می‌شود تا یک گیت ایمنی واحد شکل بگیرد.

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسچرا به جای بررسی‌های موردی در کد، از یک ساختار اعلانی YAML استفاده می‌شود؟
  2. پیش از درسهر قانون حداقل باید شامل چه فیلدهایی باشد؟
  3. حین درسموتور چگونه گزاره‌ها را ترکیب می‌کند؟
  4. حین درسنقش applies_when چیست؟
  5. حین درسبخش Fixer چه کاری انجام می‌دهد؟
  6. پس از درسچرا در دمو موتور برای بار دوم پس از fixer اجرا می‌شود؟

سؤالات متداول

تفاوت موتور قوانین با دسته‌بندهای ایمنی چیست؟

دسته‌بندها موارد آسیب‌زای عمومی را بر مبنای احتمال و الگوهای آماری می‌سنجند، اما موتور قوانین قیود صریح و قراردادی کسب‌وکار را بر اساس گزاره‌های قطعی متن بررسی می‌کند.

یک قانون در این موتور از چه بخش‌هایی تشکیل شده است؟

هر قانون شامل نام، سطح حساسیت (Severity)، توضیح و یک گزاره در دو فیلد است: applies_when (دامنه اعمال قانون) و must (شرطی که باید برقرار باشد).

اصلاح‌گر (Fixer) در این سیستم چه نقشی دارد؟

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

ما رو توی گوگل بیشتر ببین

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