𝗠𝘆 𝗖𝗼𝗱𝗶𝗻𝗴 𝗔𝗴𝗲𝗻𝘁 𝗙𝗶𝗻𝗶𝘀𝗵𝗲𝗱 𝗧𝗵𝗲 𝗧𝗮𝘀𝗸. 𝗪𝗵𝘆 𝗗𝗶𝗱 𝗧𝗵𝗲 𝗧𝗵𝗿𝗲𝗮𝗱 𝗗𝗶𝗲?
بدترین باگ در یک عامل کدنویسی، کرش کردن نیست.
بلکه زمانی است که اولین وظیفه با موفقیت انجام میشود، اما پیام بعدی حس فراموشی دارد. شما یک وظیفه میخواهید. عامل آن را تمام میکند. سپس میگویید: "دکمه را سبز کن."
از نظر شما، این همان گفتگو است. اما از نظر سیستم، اتمام یک وظیفه اغلب به این معناست که نشست (session) تمام شده است. سیستم دوباره از صفر شروع میکند.
هنگام ساخت CliGate، متوجه شدم که سه لایه مختلف را با هم ترکیب کردهام:
- گفتگو (The chat conversation)
- نشست زمان اجرا (The runtime session)
- نوبت اجرای فعلی (The current execution turn)
اینها یکی نیستند.
یک گفتگو، فضایی طولانیمدت برای صحبت کردن است. یک نشست زمان اجرا (runtime session)، رشتهی کاری برای آن گفتگو است. یک نوبت (turn)، یک اجرای واحد در داخل آن نشست است.
وقتی یک وظیفه کامل میشود، فقط نوبت باید تمام شود. نشست باید فعال باقی بماند.
جریانِ خراب به این صورت است: کاربر وظیفهای را میخواهد -> نشست زمان اجرا شروع میشود -> وظیفه تمام میشود -> گفتگو نشست فعال را پاک میکند -> پیگیری بعدی یک نشست کاملاً جدید را شروع میکند.
این موضوع باعث از کار افتادن پیگیریهای کوتاه میشود، مانند:
- دوباره امتحان کن
- همین کار را برای این فایل انجام بده
- خطا را توضیح بده
- ادامه بده
اگر سیستم بلافاصله نشست را قطع کند، باید همه چیز را دوباره بیان کنید. عامل کار میکند، اما گفتگو مصنوعی به نظر میرسد.
من این مشکل را با صریح کردن مدل حل کردم:
- گفتگوها پایدار هستند.
- نشستهای زمان اجرا بهطور پیشفرض متصل (sticky) هستند.
- وظایفِ تمامشده یا شکستخورده فقط نوبت فعلی را میبندند.
- نشستهای جدید فقط در صورتی شروع میشوند که کاربر درخواست کند یا مدل تغییر کند.
من دیگر اتمام وظیفه را به معنای مرگ نشست در نظر نمیگیرم. این تغییر کوچک، حس کل محصول را بهبود میبخشد.
در CliGate، یک نشست جدید فقط در صورتی شروع میشود که:
- هنوز نشستی وجود ندارد.
- کاربر درخواست نشست جدیدی دارد.
- تغییر مدل باعث ناسازگاری نشست قدیمی شود.
این با طرز فکر انسانها مطابقت دارد. کاربر انتظار دارد یک تب چت مانند یک رشتهی گفتگوی مداوم عمل کند. این موضوع در اپلیکیشنهای موبایل مانند Telegram یا Feishu حیاتی است.
منطق جدید ساده است:
- اولین پیام یک نشست زمان اجرا ایجاد میکند.
- پیامهای بعدی همچنان از همان نشست استفاده میکنند.
- اتمام کار باعث قطع رشته گفتگو نمیشود.
- فقط دستورات صریح نشست جدیدی را شروع میکنند.
این کار باعث میشود عامل بیشتر شبیه به یک همکار به نظر برسد تا یک ابزار اجرای دستور.
اگر عاملهای کدنویسی میسازید، این را به خاطر بسپارید: گفتگو، واحد ماندگار است. نشست زمان اجرا، کارگرِ قابل استفاده مجدد است. نوبت، چیزی است که در صورت موفقیت یا شکست تمام میشود.
این سه لایه را از هم جدا کنید. در نهایت، پیگیریهای شما حالت گفتگومحور پیدا خواهند کرد.
منبع: https://dev.to/codekingai/my-coding-agent-finished-the-task-why-did-the-thread-die-2jk2
انجمن یادگیری اختیاری: https://t.me/GyaanSetuAi