پرش به محتوای اصلی
پرش به محتوای مقاله

استفاده از MonkeyCode برای شناسایی حذف‌های تصادفی تست در کد

·۲۸ مرداد ۱۴۰۵۵ دقیقه مطالعه
راهنما
مطالعه موردی: مدل رایگان من یک درخواست ادغام حذف‌کننده تست را قبل از ادغام شناسایی کرد
مطالعه موردی: مدل رایگان من یک درخواست ادغام حذف‌کننده تست را قبل از ادغام شناسایی کرد
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

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

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

طبق گزارش این توسعه‌دهنده، او در PR شماره ۴۷ به‌طور تصادفی تست مربوط به پردازش رشته‌های خالی (empty-string parsing) را حذف کرد. این خطا در فایل utils.py رخ داد، جایی که تغییرات اعمال شده در diff، خطوطی از فایل tests/test_utils.py را که به نظر redundant یا زائد می‌رسیدند، حذف کرده بود. این اشتباه تنها زمانی شناسایی شد که یکی از هم‌کلاسی‌هایش در یک بازبینی دیرهنگام در ساعت ۱۱ شب متوجه شد تنها تستی که تابع parse_date را با یک رشته خالی می‌سنجید، حذف شده است. برای جلوگیری از تکرار این اتفاق و پیشگیری از پس‌رفت‌های (regressions) آتی، او ابزاری تخصصی برای ممیزی هوش مصنوعی با استفاده از MonkeyCode ساخت؛ پلتفرمی که ماهانه ۳۰ میلیون توکن (Token) — مثل برش‌های کوچکی از متن که مدل تکه‌تکه می‌خورد — و گزینه‌های سرور رایگان ارائه می‌دهد.

این رویکرد شکافی رایج در خط لوله‌های تولید بازیابی‌افزا (RAG) و سیستم‌های CI (یکپارچه‌سازی مداوم) را پر می‌کند. این موضوع یادآور چالش‌های مدیریت داده در سیستم‌های هوشمند است، به‌ویژه در مواردی که قابلیت انتقال حافظه در عامل‌های هوش مصنوعی مورد بحث قرار می‌گیرد تا تداوم یادگیری و بازبینی تضمین شود. اکثر سیستم‌های CI فقط بررسی می‌کنند که تست‌های موجود پاس شوند؛ آن‌ها زمانی که یک Pull Request (PR) تستی را حذف می‌کند بدون اینکه تستی معادل جایگزین کند، به توسعه‌دهنده هشدار نمی‌دهند. با تکیه بر پوشش قبلی ما درباره‌ی فازینگ (fuzzing) تولید شده توسط AI — جایی که تنها ۷٪ از seedها توانستند پوشش کد (coverage) کسب کنند — این مورد پژوهشی نشان می‌دهد که حفظ مجموعه‌تست‌های مستحکم در محیط‌های کمک‌گرفته از AI همچنان یک چالش جدی است.

مکانیزم پیاده‌سازی

توسعه‌دهنده اسکریپتی به نام diff_audit.py نوشت که تغییرات کد (diff) ذخیره‌شده را خوانده و به یک نقطه اتصال (endpoint) سازگار با چت ارسال می‌کند. این اسکریپت از متغیرهای محیطی برای MC_BASE_URL ،MC_API_KEY و MC_MODEL استفاده می‌کند. این طراحی اجازه می‌دهد ابزار بدون تغییر در کد، هم روی یک سرور محلی و هم روی یک نقطه اتصال رایگان اجرا شود.

این ابزار به‌جای پرسش‌های کلی و مبهم مثل «آیا این کد خوب است؟»، تنها یک سؤال بسیار محدود و متمرکز می‌پرسد: «آیا این diff، تست‌ها را بدون افزودن یک تست معادل، حذف یا تضعیف کرده است؟» این تمرکز خاص باعث می‌شود ارزیابی و عیب‌یابی ابزار بسیار ساده‌تر از یک بازبین کد (code reviewer) عمومی باشد.

جزئیات فنی این پیاده‌سازی عبارت است از:

  • پیکربندی مدل: تنظیم دمای (Temperature) روی ۰.۱ برای تضمین خروجی JSON ثابت. با این حال، چون خروجی JSON در تمام موارد مطلق نبود، یک تجزیه‌کننده پشتیبان (fallback parser) برای مدیریت پاسخ‌های غیر JSON اضافه شد.
  • مدیریت ورودی: تغییرات کد (diffs) تا ۱۲,۰۰۰ کاراکتر کوتاه (truncate) شدند. این کار برای جلوگیری از «سرگردانی» مدل در تحلیل فایل‌های طولانی و همچنین برای سریع و پیش‌بینی‌پذیر نگه داشتن پاسخ‌ها انجام شد.
  • زیرساخت: اسکریپت از محیط محلی به یک سرویس FastAPI منتقل شد که روی uvicorn و سرور رایگان MonkeyCode اجرا می‌شود. استقرار (deployment) این سرویس تنها با دو دستور pip install -r requirements.txt و uvicorn review_api:app --host 0.0.0.0 --port 8000 انجام شد.
  • مدیریت خطا: سیستم ابتدا بررسی می‌کند که آیا فایل diff خالی یا غیرقابل خواندن است تا پیش از مصرف حتی یک توکن، خطا را شناسایی کند و در این صورت وضعیت ریسک را «نامشخص» (unknown) اعلام نماید.

اعتبارسنجی و عملکرد واقعی

برای اعتبارسنجی ابزار، توسعه‌دهنده آن را با ورودی‌های معتبر و نامعتبر تست کرد. برای مثال، اجرای دستور echo "not a diff" > fake.diff باعث فعال شدن سیستم پشتیبان (fallback) شد، در حالی که یک فایل خالی به‌درستی وضعیت ریسک «نامشخص» را برگرداند. این اطمینان داد که ابزار به‌جای تولید یک پاسخ با اعتماد کاذب از ورودی‌های بی‌معنی، به‌صورت «fail closed» عمل می‌کند.

در یک دوره توسعه (Sprint) شامل سه PR، ابزار با دستور git diff main..pr-47 > pr_47.diff تست شد و نتایج به این ترتیب بود:

  • PR #47: وضعیت «ریسک بالا»؛ مدل به‌درستی شناسایی کرد که تست رشته خالی parse_date بدون جایگزین حذف شده است.
  • PR #52: وضعیت «ریسک پایین»؛ چون تغییرات شامل افزودن یک تابع کمکی جدید به همراه تست مربوط به آن بود.
  • PR #58: وضعیت «ریسک متوسط» (مثبت کاذب)؛ مدل یک حذف گسترده و غیرمرتبط در یک فایل lockfile تولیدشده را مشکوک دانست.

این مثبت کاذب یک بهینه‌سازی حیاتی را آشکار کرد: نیاز به پیش‌فیلتر کردن فایل‌های تولیدشده (generated files) پیش از ارسال diffها به مدل زبانی بزرگ (LLM) — مثل کتابخانه‌داری که میلیاردها صفحه را خوانده و حالا با همان لحن جواب می‌دهد. همچنین تأخیر در راه‌اندازی سرد (Cold Start) سرور رایگان وجود دارد که برای بازبینی‌هایی که تنها چند بار در روز اجرا می‌شوند قابل تحمل است، اما برای مسیرهای حساس به تأخیر (latency-sensitive) مناسب نیست.

برای یک توسعه‌دهنده، این یعنی AI زمانی بیشترین بازدهی را دارد که به‌عنوان «نظر دوم» عمل کند، نه دکمه‌ی اصلی ادغام کد. این آزمایش ثابت می‌کند که پرسش‌های محدود و شبه‌قطعی، ریسک توهم (Hallucination) — وقتی مدل با اطمینان چیزی می‌گوید که وجود ندارد — را در بازبینی کد کاهش می‌دهند.

محدودیت‌های استفاده

در موارد زیر از این الگو استفاده نکنید:

  • کدهای محرمانه: هرگز diffهای بدون سانسور (unredacted) را به نقاط اتصال شخص ثالث ارسال نکنید.
  • نیازمندی‌های قطعی: اگر به یک قانون سخت‌گیرانه نیاز دارید (مثلاً «هر خط حذف شده از تست باید منجر به شکست شود»)، به‌جای مدل زبانی از یک اسکریپت Regex سنتی استفاده کنید.
  • حفاظ‌های تولیدی (Production CI Gates): تکیه بر لایه‌های رایگان به‌عنوان یک گیت دائمی در CI ممکن است به دلیل تغییرات ناگهانی در سهمیه (quota) یا محدودیت نرخ درخواست (rate limits) منجر به توقف فرآیند شود.

گام بعدی شما

  • یک شرط شکست بسیار محدود (Narrow Failure Condition) برای کدهای خود تعریف کنید.
  • این شرط را روی یک diff ذخیره‌شده تست کنید و سپس آن را به سرور منتقل کنید.
  • فایل‌های اتوماتیک (مانند lockfiles) را از لیست ورودی‌های مدل حذف کنید تا نرخ مثبت کاذب کم شود.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره‌ی تراشه‌های Blackwell مراجعه کنید.

چرا این موضوع مهم است؟

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

تأثیر برای ایران

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

·نگاه ما
تحریریه دات‌هوش

جایگزینی بازبینی‌های کلی با «گیت‌های تک‌سؤالی» (Single-question gates) یک چرخش هوشمندانه در استفاده از AI است. این رویکرد ثابت می‌کند که برای کاهش نرخ توهم، باید فضای پاسخ مدل را به‌شدت محدود کرد تا مدل به‌جای حدس زدن کیفیت کلی، روی یک معیار اندازه‌پذیر تمرکز کند.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.