هزینه هوش مصنوعی شما یک‌شبه سه برابر شد. مدل، حجم ترافیک و حتی متن پرامپت‌ها ثابت ماند؛ مقصر تنها یک خط کد بود که قابلیت prompt cache شرکت OpenAI را از کار انداخت.

چرا کش (cache) اهمیت دارد

قابلیت prompt cache ارائه‌دهنده با صرف‌نظر از پردازش مجدد هر درخواستی که با یک پیشوند کاملاً یکسان (byte-for-byte) شروع می‌شود، در هزینه‌های شما صرفه‌جویی می‌کند. اگر توکن‌های اول با فراخوانی قبلی مطابقت داشته باشند، ارائه‌دهنده از نمایش (representation) از پیش محاسبه‌شده‌ی آن توکن‌ها استفاده می‌کند و فقط برای پسوند (suffix) جدید هزینه دریافت می‌کند. این قانون بسیار سخت‌گیرانه است: مطابقت باید دقیق باشد، نه صرفاً مشابه. حتی یک توکن متفاوت در ابتدا، کل فرآیند کش را از کار می‌اندازد.

اشتباهی که نرخ موفقیت کش (hit rate) را از بین برد

ما در عامل (agent) خود، یک برچسب زمانی (timestamp) فعلی را در بالاترین قسمت سیستم پرامپت قرار دادیم تا به مدل حس «زمان حال» را بدهیم. از آنجایی که برچسب زمانی هر ثانیه تغییر می‌کند، توالی اولین توکن‌ها برای هر درخواست منحصربه‌فرد بود. کش هرگز موردی برای مطابقت پیدا نمی‌کرد، بنابراین هر فراخوانی هزینه کامل ۱۸,۰۰۰ توکن ثابت بعدی را شامل می‌شد؛ یعنی طرح‌های ابزار (tool schemas)، قطعات مستندات، مثال‌های few-shot و دستورالعمل‌های ثابت. نتیجه، نرخ موفقیت کش ۰٪ و فاکتوری بود که سه برابر شده بود.

بازآرایی برای قابلیت کش شدن

راه حل ساده است: هر چیزی را که هرگز تغییر نمی‌کند در ابتدای پرامپت نگه دارید و هر داده‌ی متغیری را به انتهای آن منتقل کنید.

پیشوند ثابت (قابل کش شدن)

  • تعاریف ابزارها (Tool definitions)
  • اسناد بازیابی شده (Retrieval documents)
  • مثال‌های few-shot
  • دستورالعمل‌های ثابت سیستم

پسوند متغیر (غیرقابل کش شدن)

  • زمان فعلی
  • شناسه‌های نشست (Session identifiers)
  • پیام‌های کاربر
  • بافت (context) زنده

اگر مدل به زمان نیاز دارد، آن را به جای قرار دادن در ابتدا، بعد از بلوک ثابت اضافه کنید. در این صورت، کش می‌تواند بخش سنگین و ثابت را مجدداً استفاده کند، در حالی که شما همچنان بافت جدید را در انتها ارائه می‌دهید.

قاتلان پنهان در پشته (stack)

حتی زمانی که قالب درست به نظر می‌رسد، میان‌افزارها (middleware) یا SDKها ممکن است به‌طور بی‌صدا متادیتاهایی مانند شناسه‌های درخواست (request IDs)، برچسب‌های زمانی یا سایر هدرها را قبل از رسیدن محتوا به API به ابتدای آن اضافه کنند. برخی از خط لوله‌های استقرار (deployment pipelines) نیز در هر بار انتشار، تعاریف ابزار را جابه‌جا می‌کنند. این تغییرات نامرئی، توالی بایت‌ها را تغییر داده و بدون هیچ تغییری در کدِ سازنده پرامپت شما، کش را مختل می‌کنند.

نرخ موفقیت کش را زیر نظر داشته باشید

نرخ موفقیت کش (cache hit rate) را به عنوان یک معیار اصلی سلامت برای هر عامل هوش مصنوعی در نظر بگیرید. یک افت ناگهانی نشان می‌دهد که چیزی در بایت‌های ابتدایی درخواست تغییرپذیر شده است. ابزارهای نظارتی که درصد موفقیت را نمایش می‌دهند، به شما اجازه می‌دهند ناهنجاری‌های هزینه را پیش از انفجار آن‌ها شناسایی کنید.

نتیجه‌گیری

قابلیت کش کردن پرامپت (Prompt caching) به یک پیشوند تغییرناپذیر وابسته است. هر چیزی که تغییر کند — حتی یک برچسب زمانی واحد — در ابتدای هر درخواست، کش را باطل کرده و می‌تواند هزینه شما را سه برابر کند. محتوای ثابت را در ابتدا، محتوای متغیر را در انتها قرار دهید، زنجیره ابزار خود را برای یافتن افزودنی‌های پنهان بازرسی کنید و نرخ موفقیت کش را زیر نظر بگیرید. یک چیدمان منضبط در پرامپت، هم از عملکرد و هم از سود خالص شما محافظت می‌کند.