دستهبندهای متنی و مدلهای یادگیری ماشین برای تشخیص لحن یا محتوای خطرناک عالی هستند، اما در اعمال شروط دقیق، قراردادی و سازمانی عملکرد مطمئنی ندارند. برای مثال، شروطی مانند «هر امتناع باید شامل راهحل جایگزین باشد» یا «هیچ اطلاعات حساسی در قالب مثال ظاهر نشود» را نمیتوان بهسادگی به یک مدل آماری سپرد؛ این وظایف نیازمند قواعد شفاف، قابلتفسیر و قابلویرایش توسط افراد غیرفنی هستند.
در این درس یاد میگیرید که چطور یک موتور قوانین بنیادین (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 (افزودن، حذف، ویرایش) و متن مربوطه. گیت بعدی میتواند این تغییرات را ثبت کند تا یک ارزیاب انسانی بتواند رفتار اصلاحگر را در طول زمان بررسی و بازرسی کند.
پیادهسازی
فایل 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 گرامر قوانین و عملیات اصلاحگر را مستند میکند.
تمرینها
- قانونی اضافه کنید که در صورت اشارهی پرامپت (Prompt) به ایمنی، پاسخ را ملزم کند عبارت «If this is urgent» را در خود داشته باشد. از گزارههای ترکیبی استفاده کنید.
- اصلاحگر رجکس را با یک اصلاحگر مبتنی بر قالب (Templating) با متغیرهای نامگذاریشده جایگزین کنید. نشان دهید یک قانون چگونه با این طراحی جدید بازنویسی میشود.
- یک اندپوینت (Endpoint) برای متریکها بسازید که با دریافت مجموعهای از پیشنویسها، نرخ نقض هر قانون را برگرداند تا تیم ببیند کدام قانون بیشازحد فعال میشود.
اصطلاحات کلیدی
| اصطلاح | کاربرد عام | معنای دقیق |
|---|---|---|
| شیوهنامهی بنیادین (Constitution) | یک سند سیاستگذاری مبهم | یک فایل YAML از قوانین همراه با گزارهها، سطوح حساسیت و توضیحات |
| گزاره (Predicate) | یک بررسی ساده | تابعی با ورودی متن و خروجی بولی؛ بهصورت اتمیک یا ترکیبی با all_of/any_of/not_ |
| نقض قانون (Violation) | یک خطا | یک رکورد ساختاریافته با نام قانون، سطح حساسیت، توضیح و اسپن (Span) متن منطبقشده |
| اصلاحگر (Fixer) | فاینتیون مدل | یک تبدیل قطعی بهازای هر قانون که پیشنویس را به نسخهی بازبینیشده نگاشت میکند |
| تفاوتیاب (Diff) | مقایسهی رشتهها | یک فهرست ساختاریافته از عملیات افزودن، حذف و ویرایش میان پیشنویس و نسخهی بازبینیشده |
مطالعهی بیشتر
در درس 87، این موتور قوانین با آشکارساز سمت ورودی و دستهبند سمت خروجی ترکیب میشود تا یک گیت ایمنی واحد شکل بگیرد.
