تصور کنید تغییری ساده در یک کلمه از پرامپت، بدون آنکه هیچ خطای برنامهنویسی ایجاد کند، دقت عامل هوشمند شما را بهشدت پایین بیاورد و شما این افت را تنها زمانی بفهمید که کاربران در محیط واقعی شکایت کنند. این چالش دقیقاً همان دلیل بروز خطاهای پنهان در مقیاس تولید است که اغلب از رشتههای متنی ساده در پرامپتها نشأت میگیرند. Evalgate، ابزاری که توسط توسعهدهنده royalpinto007 منتشر شده است، این «پوسیدگی خاموش پرامپت» (Prompt Rot) را به یک خطای سخت در سیستم ساخت (Build Failure) تبدیل میکند. این ابزار با کیفیت پرامپت به عنوان یک مصنوع نسخهبندی شده (Versioned Artifact) برخورد میکند که پیش از ادغام در شاخه اصلی، باید از یک تست رگرسیون عبور کند.
در دنیای توسعه نرمافزار، تستهای واحد (Unit Tests) برای شناسایی کرشها یا خطاهای تجزیه (Parsing) طراحی شدهاند، نه برای تشخیص افت جزئی در لحن یا دقت پاسخ. وقتی توسعهدهندهای مدل را عوض میکند، در پرامپت سیستمی (System Prompt) تغییری ایجاد میکند یا ابزار (Tool) جدیدی اضافه میکند، ممکن است خروجی JSON همچنان معتبر باشد و هیچ تستی قرمز نشود، اما خروجی در واقعیت بدتر شده باشد. در چرخه فعلی توسعه هوش مصنوعی، توسعهدهندگان اغلب رگرسیونهای کیفی را تنها پس از گزارش کاربران در محیط عملیاتی کشف میکنند. Evalgate با انتقال مرحلهی «قضاوت» به خط لولهی یکپارچهسازی مداوم (Continuous Integration یا CI)، این شناسایی را به مراحل ابتدایی توسعه (Shift-Left) منتقل میکند.
مکانیزم خط پایه (The Baseline Mechanism)
فلسفه اصلی Evalgate این است که اتوماسیون نمیتواند به سؤال «آیا این پرامپت خوب است؟» پاسخ دهد، زیرا این پرسش ذهنی است و در یک دروازه اتوماتیک، پاسخی قطعی ندارد. در عوض، ابزار میپرسد: «آیا این نسخه از آنچه در شاخه اصلی (Main) بود، بدتر است؟» این یک سؤال عینی و پاسخدادنی است.
این ابزار از توسعهدهنده میخواهد یکبار امتیاز خط پایه (Baseline Score) را ثبت کند. از آن نقطه به بعد، هر درخواست تغییر (Pull Request) بهجای سنجش با یک مفهوم مطلق از «خوبی»، به عنوان یک دلتا (تفاضل) نسبت به این خط پایه قضاوت میشود. با مقایسه شاخه فعلی (Head) در برابر «پایه» ذخیره شده، ابزار دقیقاً شناسایی میکند که چه زمانی یک تغییر باعث افت کیفیت شده است.
شبیهسازی قطعی (Deterministic Mocking)
برای حذف نوسانات و هزینههای فراخوانیهای زنده LLM در طول CI، Evalgate با یک ارائهدهنده شبیهساز قطعی (Deterministic Mock Provider) عرضه میشود. این قابلیت اجازه میدهد کل مجموعه تستها بهصورت آفلاین و بدون نیاز به کلیدهای API اجرا شوند. خود این پروژه ۶۷ تست داخلی دارد که هیچکدام به شبکه متصل نمیشوند و تضمین میکنند که هر ویژگی پیش از نهایی شدن، در حالت شبیهساز بهدرستی کار میکند.
این رویکرد «ابتدا شبیهساز» (Mock-first) به ارزیابهای پیچیدهتر نیز گسترش مییابد. برای مثال، در حالی که llm-judge بهطور معمول برای دریافت پاسخ JSON حاوی {score, reason} یک ارائهدهنده واقعی را فراخوانی میکند، ارائهدهنده شبیهساز بهجای آن، یک امتیاز بازپذیری بر اساس همپوشانی کلمات (Word-overlap score) محاسبه میکند. این امر تضمین میکند که مجموعههای تست استفادهکننده از داوران و امبدینگها، در هر ماشینی بدون دسترسی به شبکه، نتایج کاملاً یکسانی تولید کنند.
امتیازدهی و اعتبارسنجی (Scoring and Validation)
کاربران مجموعههای تست (Suites) خود را در فایلهای YAML یا JSON تعریف میکنند که در کنترل نسخه (Version Control) در کنار کدهای مربوطه قرار میگیرند. هر مورد تست شامل یک ورودی، یک مقدار مرجع مورد انتظار و یک یا چند ارزیاب (Scorer) است. یک مورد تنها زمانی پاس میشود که تکتک ارزیابهای آن پاس شوند و امتیاز عددی آن به عنوان میانگین وزنی امتیازات ارزیابهای مجزا محاسبه میشود.
Evalgate ۱۰ ارزیاب داخلی در کاتالوگ خود دارد تا نیازهای متنوع خروجی را پوشش دهد:
- بررسیهای سطح رشته (String-level): شامل تطابق دقیق (
exact-match)، عبارتهای منظم (regex)، بررسی شمول (contains) و عدم شمول (not-contains). ارزیابcontainsبهگونهای طراحی شده که برای وجود چندین زیررشته، امتیاز جزئی (Partial Credit) اعطا کند. - اعتبارسنجی ساختاری: استفاده از
json-schemaبرای تأیید اینکه مدل یک JSON معتبر و مطابق با یک شمای مشخص باز میگرداند. - معناشناسی (Semantic): استفاده از
embedding-similarityبا بهرهگیری از شباهت کسینوسی (Cosine Similarity). این ارزیاب اگر متدembed()ارائهدهنده در دسترس باشد از آن استفاده میکند، و در غیر این صورت به یک امبدینگ محلی پایدار از نوع Bag-of-hashed-words باز میگردد. - قضاوت مبتنی بر معیار: ابزارهای
llm-judgeوrubricبرای ارزیابیهای نرمتر و مبتنی بر معیارهای کیفی. - درگاههای عملکردی: مانیتورهای تأخیر (
latency) و هزینه (cost) برای جلوگیری از عبور تغییراتی که عامل هوشمند را بیش از حد کند یا گران میکنند.
جریان کاری CI (The CI Workflow)
این ابزار از طریق سه دستور اصلی برای مدیریت چرخه عمر یک پرامپت عمل میکند:
۱. npx @royalpinto007/evalgate run suite.eval.yaml — اجرای مجموعه تستها.
۲. npx @royalpinto007/evalgate baseline suite.eval.yaml --out baseline.json — ذخیره یک خط پایه مرجع.
۳. npx @royalpinto007/evalgate compare suite.eval.yaml --base baseline.json --tolerance 0.01 — بررسی وجود رگرسیونها.
اگر دلتای کیفیت از حد تحمل تعریفشده توسط کاربر (مثلاً ۰.۰۱) بیشتر شود، دستور compare با یک وضعیت غیرصفر (non-zero status) خارج شده و بهطور مؤثر باعث شکست عملیات CI میگردد. این حد تحمل (Tolerance) حیاتی است زیرا خروجی مدلها کاملاً پایدار نیست و اجازه یک رانش (Drift) کوچک، از شکست ساخت به دلیل تفاوتهای جزئی و بیاهمیت جلوگیری میکند.
یکپارچگی با Pull Request
بهجای اینکه یک درخواست تغییر (PR) را با کامنتهای جدید پر کند، اکشن گیتهابِ مرتبط، یک کامنت واحد و در حال تکامل را بهروزرسانی (Upsert) میکند و با هر Push، همان کامنت را ویرایش میکند. این کامنت یک جدول دقیق از دلتاها ارائه میدهد. برای مثال، اگر یک عامل پشتیبانی شکست بخورد، گزارش افت کلی امتیاز را نشان میدهد؛ مثلاً از ۹۴.۲٪ (پایه) به ۶۰.۱٪ (هد)، که یک رگرسیون ۳۴.۲ واحدی (pp-) است، همراه با تفکیک هر مورد:
- refund-intent-json: ۱۰۰.۰٪ $\rightarrow$ ۰.۰٪ (۱۰۰.۰- pp)
- order-id-format: ۱۰۰.۰٪ $\rightarrow$ ۰.۰٪ (۱۰۰.۰- pp)
- greeting-exact: ۱۰۰.۰٪ $\rightarrow$ ۶۶.۷٪ (۳۳.۳- pp)
- judge-helpfulness: ۷۳.۶٪ $\rightarrow$ ۶۹.۱٪ (۴.۵- pp)
انعطافپذیری معماری
منطق این ابزار بهصورت یک کتابخانه ارائه شده است که به توسعهدهندگان اجازه میدهد توابعی مانند loadSuite ،runSuite ،compareRuns و renderCompareMarkdown را برای یکپارچهسازیهای سفارشی خارج از GitHub Action وارد کنند. هر دو بخش ارزیابها (Scorers) و ارائهدهندهها (Providers) قابل ثبت (Registrable) هستند، به این معنی که تیمها میتوانند منطق ارزیابی اختصاصی خود را در حالی که موتور اصلی رگرسیون حفظ میشود، به سیستم متصل کنند.
محدودیتهای شناخته شده
Evalgate به عنوان یک آشکارساز تغییر عمل میکند، نه یک پیشگو (Oracle). این ابزار به شما میگوید که امتیاز تغییر کرده است، اما نمیگوید که آیا امتیاز جدید واقعاً صحیح است یا خیر. اگر یک پرامپت واقعاً بهبود یابد اما انتظارات مرجع قدیمی شده باشند، ابزار همچنان یک دلتا را گزارش میکند. در چنین مواردی، توسعهدهنده باید بهصورت دستی خط پایه را بهروزرسانی کند.
علاوه بر این، ارزیابهای مدلمحور مانند llm-judge و embedding-similarity تنها به اندازه مدل داور و معیارهای ارائه شده قابل اعتماد هستند. یک مجموعه تست سبز (پاس شده) که بر اساس معیارهای ضعیف ساخته شده باشد، حس امنیت کاذبی ایجاد میکند. برای کاهش این ریسک، توصیه میشود توسعهدهندگانی برای الزامات سختگیرانه بر ارزیابهای exact ،regex و schema تکیه کنند و امتیازات مدلمحور را به عنوان سیگنالهای جهتدار (Directional Signals) تلقی نمایند.
برای توسعهدهندگان، این یک تغییر رویکرد از مهندسی پرامپت «بر اساس حس» (Vibes-based) به یک رویکرد منظم مهندسی نرمافزار است. در این راستا، استفاده از ابزارهایی نظیر PromptForge Core برای تبدیل پرامپتهای شکننده به کد تایپسیف میتواند در کنار Evalgate، لایه جدیدی از امنیت ساختاری را فراهم کند. یکپارچهسازی این درگاهها به این معنی است که توسعهدهنده نمیتواند یک پرامپت «سریعتر» را ادغام کند اگر باعث افت ۱۰ درصدی در دقت شود.
برای شروع، میتوانید سورس کد را در گیتهاب به آدرس https://github.com/royalpinto007/evalgate بررسی کنید یا پکیج را از طریق npm از آدرس https://www.npmjs.com/package/@royalpinto007/evalgate نصب کنید تا درگاههای کیفی را در خط لوله LLM خود پیادهسازی نمایید.
گام بعدی شما
- اگر از GitHub Actions استفاده میکنید، Evalgate را برای جلوگیری از رگرسیون کیفیت در پرامپتها جایگزین تستهای دستی کنید.
- برای هر پرامپت حساس، یک فایل Baseline دقیق ایجاد کنید تا تغییرات کوچک مدل در آینده اثرات مخرب خود را سریعتر نشان دهند.
- ترکیبی از ارزیابهای سختگیرانه (Schema) و سیگنالهای جهتدار (LLM-judge) را برای ایجاد یک درگاه کیفی جامع تعریف کنید.
اما تأثیر این ابزارها بر هزینههای استنتاج در مقیاس میلیونی حتی حیاتیتر است — به تحلیل ما درباره هزینه استنتاج در مدلهای زبانی مراجعه کنید.




گفتگو