چرا کش پرامپت تو ایجنتهای کدنویسی هوش مصنوعی اینقدر شکنندهست؟
خلاصهٔ کاملتر
توی مقالههای LLM معمولاً بهش مثل یه تابع نگاه میکنیم: یه متن میفرستی، یه متن میگیری. اما تو ایجنتهای کدنویسی بیشتر ورودی هر پیام دقیقاً عین پیام قبلیه و فقط یه کم بهش اضافه میشه. کش کردن پرامپت همین قسمت تکراری رو دوباره پردازش نمیکنه، ولی همونقدر که مقرونبهصرفهست، شکننده هم هست: عوض کردن یه ابزار، عوض کردن مدل یا یه تصمیم روتینگ میتونه یه درخواست ارزون رو تبدیل کنه به پردازش کامل کل کانتکست.
تو هر لایه توجه مدل، هر توکن یه key و یه value تولید میکنه که نگه داشته میشن تا توکن بعدی بدون محاسبهی دوبارهی توکنهای قبلی بتونه بهشون توجه کنه؛ به این حافظهی نگهداشتهشده KV cache میگن. مهم اینه که این حالت مال یه پیشوند خاص از توکنهاست: اگه یه توکن وسط پرامپت عوض بشه، هرچی بعدش میاد یه ادامهی متفاوته و کش قبلی دیگه بهکارش نمیاد.
دو مدل اصلی برای نگهداری کش وجود داره: session affinity که کش رو روی همون GPU نگه میداره و درخواست بعدی رو به همون ورکر میفرسته (سریع ولی محدودکنندهی زمانبندی)، و کش توزیعشده که بلاکهای KV رو بین چند ورکر قابلدسترسی میکنه (انعطاف بیشتر ولی خودش یه مسئلهی سیستمیه). APIهای Anthropic از cache_control صریح استفاده میکنن؛ خیلی از ارائهدهندههای دیگه کش پیشوندی خودکار دارن.
یکی از رایجترین دلایل باطل شدن کش، تغییر لیست ابزارهاست: چون تعریف ابزارها معمولاً تو سیستمپرامپت جا میگیره، اضافه یا حذف کردن یه ابزار میتونه اولین نقطهی ناهماهنگی رو ببره نزدیک شروع پرامپت و کل مکالمهی بعدش دوباره پردازش بشه. بعضی مدلهای جدید بارگذاری افزایشی ابزار رو پشتیبانی میکنن که توش ابزار جدید فقط به یه نتیجهی ابزار اضافه میشه بدون اینکه پیشوند قبلی عوض بشه؛ Pi این روش رو برای مدلهایی که پشتیبانی میکنن به کار میبره.
TTL کوتاه هم یه دردسر جدیه: کش پیشفرض Anthropic فقط پنج دقیقه عمر داره، پس یه وقفهی کوتاه مثل رفتن سراغ قهوه میتونه باعث بشه کل تاریخچهی مکالمه دوباره با قیمت کامل حساب بشه. Pi برای کاربرای API همین پنجدقیقه رو رعایت میکنه ولی با متغیر PI_CACHE_RETENTION=long میشه درخواست نگهداری طولانیتر داد. نویسنده اشاره میکنه که یه گیتوی یا واسطه ممکنه از miss شدن کش سود ببره، پس شفافیت آمار کش مهمه.
به همین دلیل Pi ترجیح میده تاریخچه رو stable نگه داره و بهجای حذف مداوم نتیجهی ابزارهای قدیمی، فقط وقتی فشار کانتکست واقعاً لازمش کنه compaction انجام بده. تو نوار وضعیت Pi میتونی نرخ hit کش رو ببینی و دستور /session آمار کامل مصرف و هزینهی از دست رفته بهخاطر miss رو نشون میده.
نکات کلیدی:
- کش کردن پرامپت یعنی بخش تکراری هر درخواست دوباره پردازش نشه، ولی فقط برای پیشوند دقیقاً یکسان کار میکنه.
- تغییر لیست ابزارها، عوض کردن مدل، شاخه رفتن تو مکالمه یا فقط چند دقیقه صبر کردن میتونه کل کش رو باطل کنه.
- Anthropic از کش صریح با نقطههای cache_control استفاده میکنه؛ خیلی از بقیهی APIها کش پیشوندی خودکار دارن.
- بارگذاری افزایشی ابزار و اجتناب از حذف یا بازنویسی مکرر تاریخچه، بهترین راه برای حفظ نرخ کش بالاست.




