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

یک ابزار تحلیل AST حلقه‌های تکرار بی‌انتها در عامل‌های هوش مصنوعی را افشا کرد

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

معرفی یک سیستم نمره‌گذاری کمی (از ۵- تا ۸+) برای بهداشت کدِ عامل‌های AI که به‌جای تحلیل معنایی، بر اساس ساختار AST و وجود شروط توقف (Stop Conditions) عمل می‌کند.

یک حلقه تکرار بدون سقف می‌تواند یک سرور مشترک را به یک بخاری برقی تبدیل کند. در ۱۲ سپتامبر ۲۰۲۶، چارچوبی فنی منتشر شد تا منطق تکرار را به‌جای یک «حس کلی» از متن چت، به یک اثر قابل اندازه‌گیری تبدیل کند. این سیستم از یک بازدیدکننده AST پایتون استفاده می‌کند تا کدها را در مقیاسی از ۵- تا ۸ نمره دهد و تضمین کند که عامل‌های هوش مصنوعی، شرکت را از طریق تکرارهای بی‌نهایت به ورشکستگی نکشانند.

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

مکانیسم بهداشت حلقه‌ها

هسته این رویکرد یک نمره‌دهنده استاتیک به نام loop_hygiene.py است. این ابزار به‌جای اینکه بپرسد آیا مدل در حال «تفکر» است، یک سؤال ساده‌تر می‌پرسد: «اگر ابزار متوقف شود، آیا این حلقه while هرگز تمام می‌شود؟». این سیستم از یک بازدیدکننده درخت نحو انتزاعی (AST) — شبیه به نقشه‌ای که ساختار گرامری کد را به صورت درختی می‌کشد تا ماشین بتواند آن را بفهمد — استفاده می‌کند تا نشانه‌های ایمنی را بیابد. ابزار تمام متون توضیحی را نادیده می‌گیرد و فقط روی اعداد تمرکز می‌کند.

این ابزار به عنوان یک linter با دیدگاه‌های سخت‌گیرانه طراحی شده است. این ابزار سورس کد پایتون را می‌خواند، در AST گشت می‌زند و یک تابع کمکی تکرار (retry helper) را همان‌طور که یک بازبین سخت‌گیر کد را بررسی می‌کند، نمره می‌دهد: اولویت اول محدود بودن است و شعرپردازی در کد هرگز پذیرفته نیست. هدف این است که حتی اگر تمام نام‌های تجاری را از مقاله حذف کنید، باز هم با ذخیره فایل‌ها به همان اعداد و نمرات برسید. این یک تست واحد (Unit Test) است، نه یک سخنرانی تبلیغاتی.

منطق و معیار نمره‌گذاری

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

  • ۲+ امتیاز برای سقف تعداد تلاش‌ها. بازدیدکننده به دنبال نام‌هایی مانند max_attempts ،max_retries ،retries ،attempts یا n_tries می‌گردد.
  • ۲+ امتیاز برای مهلت زمانی (Timeout) واقعی. ابزار به دنبال timeout ،deadline ،max_seconds ،wall_timeout یا budget_s می‌گردد.
  • ۲+ امتیاز برای کلید یکتایی (Idempotency Key) — مثل یک شماره رسید بانکی که اجازه نمی‌دهد یک تراکنش دو بار ثبت شود — برای جلوگیری از اثرات جانبی تکراری. ابزار مواردی مثل idempotency_key ،idempotency ،request_id یا dedupe_key را علامت‌گذاری می‌کند.
  • ۱+ امتیاز برای عقب‌نشینی نمایی (Exponential Backoff) — شبیه به کسی که بعد از هر بار شکست، فاصله بین تلاش‌هایش را بیشتر می‌کند تا سیستم را خسته نکند. ابزار به دنبال backoff ،backoff_s ،delay یا base_delay می‌گردد.
  • ۱+ امتیاز برای لرزش (Jitter) جهت جلوگیری از مشکل «گله تندرهای خروشان» (Thundering Herd). ابزار به دنبال jitter ،jitter_s یا jitter_ratio می‌گردد.

در مقابل، الگوهای خطرناک به‌شدت جریمه می‌شوند. یک حلقه while True (یا حلقه‌ای که شرط آن یک مقدار ثابت True یا 1 است) بدون بودجه خروج، ۳- امتیاز می‌گیرد. استفاده از time.sleep یا usleep بدون بودجه تعریف شده (بدون سقف تلاش یا مهلت زمانی)، منجر به کسر ۲ امتیاز می‌شود. حلقه‌ای که می‌تواند بیشتر از صبر شما زنده بماند، تاب‌آور نیست؛ بلکه فیوزی است که روکش آن کنده شده است.

آزمایش روی کاندیداهای هوش مصنوعی

برای کالیبره کردن ابزار، چهار نمونه کد (fixture) متمایز برای نمایش سطوح مختلف کیفیت استفاده شد. این‌ها به‌گونه‌ای طراحی شدند که اگر تمام نام‌های تجاری را از مقاله حذف کنید، باز هم با ذخیره فایل‌ها به همان اعداد و نمرات برسید. نتایج نشان‌دهنده تفاوت‌های فاحشی است که ممکن است یک بازبین انسانی در یک بررسی سریع (PR scan) متوجه نشود:

  • نمونه «بارانی» (۵-): در فایل fixtures/a_trench_coat.py یافت می‌شود. از while True با یک time.sleep(1) ساده استفاده می‌کند. این مورد به دلیل خطرناک بودن بنیادین، نمره منفی می‌گیرد.
  • نمونه «محدوده لخت» (۲): در فایل fixtures/b_range_but_naked.py یافت می‌شود. از for _ in range(max_attempts) استفاده می‌کند اما مهلت زمانی و لرزش را فراموش کرده است. این کد تا زمانی که متوجه نشوید یک درخواست ممکن است دو بار هزینه شود، محدود به نظر می‌رسد.
  • حلقه بودجه‌بندی شده (۶): در فایل fixtures/c_budget.py یافت می‌شود. این نسخه پذیرفته است که زمان وجود دارد؛ از time.monotonic() برای ردیابی مهلت زمانی استفاده کرده و عقب‌نشینی نمایی را با یک لرزش تصادفی کوچک پیاده کرده است.
  • حلقه یکتا (۸): در فایل fixtures/d_idempotent.py یافت می‌شود. این استاندارد طلایی است. اگر کلیدی ارائه نشود، یک uuid.uuid4() تولید کرده و در هر تلاش هدر Idempotency-Key را ارسال می‌کند.

در یک ماشین محلی، نمره‌دهنده این امتیازات را چاپ می‌کند: ۵-، ۲، ۶، ۸. نمونه «بارانی» فقط شلخته نیست، بلکه نمره منفی دارد. حلقه-محدوده (range-loop) که بازبین‌ها اغلب دوست دارند، نمره ۲ می‌گیرد چون سقف تلاش را به یاد آورده اما زمان، لرزش و اثرات جانبی تکراری را فوراً فراموش کرده است. این پراکندگی ثابت می‌کند که آزمایش در حال کار است. اگر یک خط‌کش نتواند تفاوت فیوز را با بخاری تشخیص دهد، فقط در حال جمع‌آوری حکایات است.

فراتر از تحلیل استاتیک

نمرات استاتیک سقف‌های گم‌شده را می‌گیرند، اما نمی‌توانند تشخیص دهند که آیا سقف در برابر تأخیرهای دنیای واقعی شکست می‌خورد یا خیر. یک لپ‌تاپ اغلب شاهد بدی است زیرا بیش از حد سریع است و با توسعه‌دهنده «مهربان» است. برای حل این مشکل، یک پروب (Probe) دینامیک معرفی شده است.

این پروب از یک سرور شبیه‌ساز (SlowTool) استفاده می‌کند که تأخیرها را افزایش می‌دهد: ابتدا ۰.۲۵ ثانیه، سپس ۱ ثانیه، ۳ ثانیه و در نهایت هرگز پاسخ نمی‌دهد. حلقه مورد آزمایش باید هم به max_attempts و هم به ساعت واقعی احترام بگذارد. اگر پردازش بعد از مهلت ۱۰ ثانیه‌ای watchdog زنده بماند، یعنی حلقه سقف ندارد.

این تست دینامیک برای اجرا در محیط‌های مشترک، مانند سرور رایگان MonkeyCode طراحی شده است. در یک باکس مشترک، یک توقف ۳ ثانیه‌ای با سایر پردازش‌ها و نویزهای زمان‌بندی برخورد می‌کند. تأخیر یک شاهد است؛ یک SSD ساکت، دوست متهم است. نتیجه این پروتکل این است: یا پردازش قبل از watchdog خارج می‌شود، یا شما شاهد حلقه‌ای هستید که برق دیگران را مصرف می‌کند.

چرخش در نحوه پرامپت‌نویسی

این متدولوژی نحوه تعامل توسعه‌دهندگان با مدل‌های زبانی بزرگ (LLM) — مثل کتابخانه‌داری که میلیاردها صفحه را خوانده و حالا با همان لحن جواب می‌دهد — را تغییر می‌دهد. وقتی نویسنده در ساعت ۱۱ شب به یک حلقه کاندید نیاز دارد، از یک مدل رایگان از طریق MonkeyCode درخواست می‌کند، خروجی را در fixtures/ می‌اندازد و تا زمانی که نمره‌دهنده امتیاز را چاپ نکند، به آن اعتماد نمی‌کند. گزینه سرور رایگان یک نماد نیست؛ بلکه نیمه دوم آزمایش است، جایی که time.sleep با نویز زمان‌بندی ملاقات می‌کند.

به‌جای درخواست «کد تاب‌آور» (که معمولاً مدل «بارانی» تولید می‌کند)، از یک پرامپت مبتنی بر قرارداد استفاده می‌شود:

«یک تابع پایتون call_tool(url, timeout=8.0, idempotency_key=None) بنویس که fetch() شکست‌خورده را تکرار کند. الزامات: max_attempts یک سقف عددی باشد؛ timeout یک بودجه زمانی با استفاده از time.monotonic() باشد؛ عقب‌نشینی نمایی به همراه لرزش داشته باشد؛ در هر تلاش Idempotency-Key ارسال شود؛ از while True استفاده نشود. فقط تابع را برگردان.»

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

محدودیت‌ها و ریسک‌ها

بازدیدکننده AST یک چراغ‌قوه است، نه یک حسابرسی کامل. نقاط کور مشخصی دارد:

  • تکرارهای پنهان: نمی‌تواند تکرارهایی را که داخل exec()، دکوراتورهای سفارشی که صراحتاً نام‌گذاری نشده‌اند، یا زیرپردازش‌هایی (subprocesses) که خودشان را دوباره اجرا می‌کنند (چون کسی فکر کرده این معماری است) پنهان شده‌اند، ببیند.
  • اعتبار هدر: نمی‌تواند تأیید کند که آیا سرور گیرنده واقعاً هدر Idempotency-Key را درست مدیریت می‌کند یا خیر. یک بازدیدکننده AST نمی‌تواند یک درخواست POST غیر-یکتا را که پشت یک نام هدر زیبا پنهان شده است، تشخیص دهد.
  • تغییرات محیطی: خروجی مدل‌های رایگان تغییر می‌کند و سرورهای رایگان SLO ندارند. برای هویت مدل‌های پین‌شده یا CPUهای رزرو شده، یک نقطه اتصال (endpoint) پولی مورد نیاز است.

برای محیط‌های حساس مانند پرداخت، بهداشت یا تکرارهای مربوط به هزینه‌های غیر-یکتا، نمره ۸ جایگزینی برای حسابرسی PCI نیست. این ابزار برای فیلتر کردن موارد آشکارا خراب است، نه برای گواهینامه امنیتی.

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

گام بعدی شما

  • کدهای تولیدشده توسط AI را به‌جای بررسی بصری، با یک اسکریپت ساده برای یافتن while True بدون سقف بررسی کنید.
  • در پرامپت‌های خود به‌جای کلمات کیفی مثل «Robust»، الزامات کمی مثل «Wall-clock timeout» را تعریف کنید.
  • برای تست واقعی، کد را در محیطی با تأخیر مصنوعی (Latency Injection) اجرا کنید تا از وجود سقف زمانی مطمئن شوید.

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

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

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

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

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

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

جایگزینی «حس» با «عدد» در ارزیابی کد AI، نقطه عطفی در گذار از Vibe Coding به مهندسی دقیق است. این رویکرد نشان می‌دهد که برای مهار توهمات عملیاتی مدل‌ها، نباید روی بهبود استدلال آن‌ها حساب کرد، بلکه باید لایه‌های نظارتی (Guardrails) استاتیک و دینامیک را در خط لوله CI/CD قرار داد. در واقع، اعتماد به AI در محیط عملیاتی، تنها زمانی منطقی است که خروجی آن از یک فیلتر ریاضی عبور کند، نه یک بررسی انسانی سریع.

منابع

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

گفتگو

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

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

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

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

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

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

دات‌هوش

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

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