کش پرامپت یعنی پیشوند ثابت پرامپت را یک بار می‌نویسی و تا نیم ساعت با کمتر از یک‌دهم قیمت می‌خوانی. برای یک اجرای ۲۰ نوبتی ایجنت با پیشوند ۸۰۰۰ توکنی روی GPT-6.1 Sol همین تکنیک هزینه را از $0.40 به $0.1152 می‌رساند. در این نوشته با دو اسکریپت واقعی نشان می‌دهم کش روی کدام بایت قفل می‌شود. لحظه‌ی خواندن: ۲۹ سپتامبر ۲۰۲۶.

سه عددی که تعیین می‌کنند کش کار می‌کند یا نه

OpenAI در ۲۲ سپتامبر ۲۰۲۶ اعلام کرد که سیستم کش پرامپت را روی خانواده‌ی GPT-6 بازنویسی کرده و نرخ اصابت کش به‌صورت پیش‌فرض بالا رفته است [1]. تخفیف روی توکن‌های ورودیِ کش‌شده تا ۹۰ درصد است و فقط برای پیشوندهای مشترکی اعمال می‌شود که در پنجره‌ی ۳۰ دقیقه‌ای دوباره استفاده شوند.

راهنمای رسمی کش پرامپت چهار عدد را دستی‌پسند می‌کند [2]. حداقل طول قابل کش ۱۰۲۴ توکن ورودیِ قابل‌مشاهده است و محتوای سیستمی پنهان جزو این حد شمرده نمی‌شود. هزینه‌ی خواندن از کش ۰٫۱ برابر نرخ ورودیِ بدون کش و هزینه‌ی نوشتن ۱٫۲۵ برابر آن است. عمر ورودی هم با prompt_cache_options.ttl و مقدار "30m" کنترل می‌شود.

اثری که فروشنده‌ها گزارش کرده‌اند از این چهار عدد بزرگ‌تر است. گیت‌هاب می‌گوید سهم توکن‌های پرامپتی که پردازش تازه می‌خواستند بیش از ۵۰ درصد کم شده است. Manus می‌گوید نرخ اصابت کشش در کمتر از یک هفته از حدود ۸۵ درصد به بالای ۹۰ درصد رسیده. Wordsmith هم از ۸۳ درصد به ۹۱ درصد رفته و هزینه‌ی استنتاج ۳۶ درصد افت کرده است. هر سه نقل در همان یادداشت انتشار آمده‌اند [1].

همین مدل‌ها از ۲۲ سپتامبر در کدکس و کوپیلوت هم در دسترس‌اند؛ چانگ‌لاگ گیت‌هاب برای همان روز هم انتشار Claude Opus 5.5 و هم GPT-6 Sol و Luna را در GitHub Copilot ثبت کرده است [9]. یعنی انتخاب مدل و انتخاب روش صورتحساب از آن روز به هم گره خورده‌اند.

کش روی کدام بایت قفل می‌شود

کش روی پیشوند قفل می‌شود، نه روی کل پرامپت؛ یعنی تطبیق باید بایت‌به‌بایت دقیق باشد. کوچک‌ترین تغییر در تعریف ابزارها، ترتیبشان یا متن دستورالعمل‌ها، هش پیشوند را عوض می‌کند. اسکریپت زیر همین را اندازه می‌گیرد.

$ pip install tiktoken
$ python3 cachdemo/prefix_probe.py
== 1. خود پیشوند به تنهایی ==
prefix tokens           : 2106
OpenAI minimum (5.6+)   : 1024
cacheable?              : True

== 2. همان پیشوند، فقط نام یک ابزار عوض شده ==
key before rename       : 41dada6799aa8fd3
key after  rename       : 5bda5208aa663ade
keys equal?             : False
shared leading tokens   : 2024  (96.1% of the prefix)

== 3. همان پیشوند، یک جمله اضافه در انتها ==
key before append       : 41dada6799aa8fd3
key after  append       : 8bc4a9592bf579c5
keys equal?             : False
shared leading tokens   : 2106  (100.0% of the prefix)

== 4. پیشوندی زیر حداقل ==
prefix tokens           : 24
cacheable?              : False

نتیجه‌ی آزمایش دوم همان دلیلی است که راهنمای OpenAI بر ثابت‌ماندن ترتیب ابزارها تأکید می‌کند. تنها نام یک ابزار عوض شده و ۹۶٫۱ درصد توکن‌های مشترک باقی مانده‌اند، اما کلید عوض شده است. ۹۶ درصد اشتراک وقتی شرط تطبیق دقیق باشد بی‌ارزش است.

نتیجه‌ی آزمایش سوم مهم‌تر است. جمله‌ی تازه در انتها اضافه شده، پس ۲۱۰۶ توکن اول همان‌اند و صد درصد مشترک‌اند. ورودیِ قبلاً نوشته‌شده همچنان قابل استفاده است؛ بخش تازه فقط ناحیه‌ای است که هنوز نوشته نشده. قاعده‌ی عملی: محتوای متغیر را انتهای کانتکست بگذار، نه وسطش و نه اولش.

آزمایش چهارم سقف پایین را نشان می‌دهد. پیشوند ۲۴ توکنی زیر حداقل ۱۰۲۴ است و اصلاً نوشته نمی‌شود. اگر دستورالعمل ایجنت شما کوتاه است، هر چقدر هم درست باشد، کشی اتفاق نمی‌افتد.

حساب واقعی یک اجرای ۲۰ نوبتی

قیمت‌ها را از صفحه‌های خود فروشنده‌ها برداشته‌ام و داخل اسکریپت گذاشته‌ام. اسکریپت زیر یک اجرای ۲۰ نوبتی با پیشوند ۸۰۰۰ توکنی و ۴۰۰ توکن پاسخ در هر نوبت را، با کش و بدون کش، حساب می‌کند.

$ python3 cachdemo/cost_run.py
== Prices the two vendor pages imply ==
GPT-6.1 Sol input, derived from '95% below standard':  $2
same model via the guide's 0.1x read rule:            $0.2
cache read actually quoted in the blog:               $0.1
Opus 5.5 cache read as a share of its input:          0.05x

== One 20-turn run on GPT-6.1 Sol, 8000-token prefix ==
uncached input  20 x 8000 = 160,000 tok  $0.32
uncached output 20 x 400 =   8,000 tok  $0.08
uncached total                                 $0.4

one cache write at 1.25x (8000 tok)           $0.02
19 cache reads                             $0.0152
output, unchanged                             $0.08
cached total                                  $0.1152
saving                                        $0.2848  (71.2%)

== Hit rate is the only variable ==
hit   0%        $0.42    1.05x
hit  50%       $0.268    0.67x
hit  80%       $0.1768    0.44x
hit  90%       $0.1464    0.37x
hit  95%       $0.1312    0.33x
hit 100%       $0.116    0.29x

== The same run on Claude Opus 5.5 ==
uncached  $0.8
cached    $0.2304
ratio     0.288

سطر آخر جدول، پیام اصلی این نوشته است. تا وقتی نرخ اصابت صفر باشد، کار کردن با کش از کار نکردن با آن گران‌تر است، چون ۱٫۲۵ برابر هزینه‌ی نوشتن را هم می‌پردازید. نقطه‌ی سربه‌سر با این اعداد ۱٫۳۲ نوبت است: هر نوبتِ کش‌شده ۰٫۰۱۵۲ دلار می‌نشاند و هزینه‌ی یک‌باره‌ی نوشتن ۰٫۰۲ دلار است.

مدلورودی پایهخواندن از کشنسبت
GPT-6.1 Sol$2.00$0.100.05×
GPT-6 Sol$2.00$0.200.10×
Claude Opus 5.5$4.00$0.200.05×
Claude Opus 5$5.00$0.500.10×

هر عدد خانه‌ی خودش به صفحه‌ای لینک است که از آن آمده؛ قیمت پایه‌ی دو مدل GPT-6 از یادداشت معرفی Sol و Luna آمده است [5]. سطر دوم مشتق است، نه نقل مستقیم: صفحه‌ی GPT-6.1 Sol می‌گوید قیمت ورودیِ کش‌شده‌ی آن ۵۰ درصد کمتر از GPT-6 Sol است [4]، پس چون عدد نوشته‌شده $0.10 است، نصف آن یعنی $0.20 می‌شود و با نسبت ۰٫۱ برابرِ راهنما جور در می‌آید.

اما سطر اول یک تناقض دارد که باید بدانید. همان صفحه می‌گوید ورودیِ کش‌شده ۹۵ درصد ارزان‌تر از ورودیِ استاندارد است، پس $0.10 یعنی ۰٫۰۵ برابر. راهنمای رسمی برای GPT-5.6 و جدیدترها نسبت ۰٫۱ را می‌نویسد که از $2 ورودی، $0.2 می‌دهد. هر دو عدد از خود OpenAI است و حساب @OpenAI هم امروز همان $0.10 را اعلام کرده [10]. برای صورتحساب، عدد مدل را مبنا بگذارید و نه ضریب جدول خلاصه را.

در سمت Anthropic هم همان الگو است. Opus 5.5 با قیمت خواندن $0.20 در برابر ورودی $4 یعنی ۰٫۰۵ برابر، و صفحه‌ی قیمت همین را در پانویس تأیید می‌کند [7]. مدل‌های قدیمی‌تر روی ۰٫۱ برابر مانده‌اند [6]. نکته‌ی جداگانه: مدل‌های Claude 4.7 به بعد توکنایزر تازه دارند که برای همان متن حدود ۳۰ درصد توکن بیشتری می‌سازد [7]. این سی درصد را کنار اختلاف قیمت بگذارید.

یک اثر جانبی هم هست که در چانگ‌لاگ کلاد کد ثبت شده. سطح تلاش استدلالی که پیش از per-model شدن ذخیره کرده بودید دیگر روی مدل‌های تازه اعمال نمی‌شود [8]. یعنی یک تنظیم قدیمی می‌تواند بی‌سروصدا هزینه و کیفیت را عوض کند.

حساب رسمی OpenAI امروز اعلام کرده که GPT-6.1 Sol در کدکس و ChatGPT Work در دسترس است و به GPT-6 Astra نزدیک می‌شود [11]. اعلام دیگری همان روز حالت Ultrafast را فقط برای GPT-6 Astra در کدکس و API باز کرده و گفته GPT-6.1 Sol بعداً می‌آید [12].

کش را از کجا می‌دهیم و چطور می‌بینیم

OpenAI یک ابزار تشخیص اضافه کرده که دو درخواست را مقایسه می‌کند و می‌گوید چرا پیشوند مورد انتظار بازاستفاده نشد [3]. تطبیق دقیق لازم است و مدل، سطح سرویس و ابزارها هم باید سازگار باشند. قطعه‌ی زیر از مستندات خود OpenAI نقل شده و روی این ماشین اجرا نشده است، چون کلید API اینجا وجود ندارد.

# فایل سیاست باید دست‌کم ۱۰۲۴ توکن باشد، وگرنه کشی ساخته نمی‌شود
from pathlib import Path
from openai import OpenAI

client = OpenAI()
policy = Path("support-policy.txt").read_text()

# درخواست پایه؛ همین یکی بعداً مرجع مقایسه می‌شود
first = client.responses.create(
    model="gpt-6-astra",
    instructions=policy,
    input="Reply with exactly OK.",
    tools=[{"type": "function", "name": "get_time"}],
)

# فقط نام ابزار عوض شده: کل پیشوند دیگر تطبیق نمی‌خورد
second = client.responses.create(
    model="gpt-6-astra",
    instructions=policy,
    input="Reply with exactly OK.",
    tools=[{"type": "function", "name": "get_date"}],
    prompt_cache_options={"comparison_response_id": first.id},
)

diagnostics = second.prompt_cache_diagnostics
if diagnostics is not None and diagnostics.type == "cache_miss":
    print(diagnostics.reason)
    print(diagnostics.comparison_reusable_tokens)
    print(diagnostics.cache_missed_tokens)

خروجی نمونه‌ای که خود OpenAI در همان صفحه نشان می‌دهد همین داستان آزمایش دوم است: دلیل tools_changed و ۵۶۲۹ توکن قابل‌استفاده‌ی دوباره که از دست رفته‌اند. عدد دوم اندازه‌ی آسیب را می‌دهد.

پنج کاری هست که جلوی رایج‌ترین شکست را می‌گیرد. ترتیب ابزارها و متن طرح‌واره‌هایشان را ثابت نگه دارید. به‌جای حذف یک ابزار، آن را با allowed_tools از دسترس خارج کنید، یا وقتی هیچ ابزاری لازم نیست tool_choice را روی none بگذارید. دستور تازه را با یک پیام developer در انتهای کانتکست اضافه کنید تا پیشوند قدیمی سالم بماند. در GPT-6 می‌توانید تلاش استدلال را با یک آیتم configuration_update عوض کنید بدون آنکه کش بشکند. و اگر زمان انتظار کاربر برایتان مهم است، کش را در زمان راه‌اندازی گرم کنید. داشبورد کش پرامپت در پنل OpenAI هم نرخ اصابت و ترکیب توکن‌های ورودی را نشان می‌دهد؛ وقتی ناگهانی افت کرد، اول نمودار ترکیب ورودی را نگاه کنید، نه مدل را.

جمع‌بندی: سه قاعده که فردا اجرا می‌شوند

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

قاعده‌ی دوم: قبل از هر بهینه‌سازی، نرخ اصابت را اندازه بگیرید. با اعداد این پست، نقطه‌ی سربه‌سر ۱٫۳۲ نوبت است. زیر آن، کش فقط پول اضافه است.

قاعده‌ی سوم: ضریب‌های منتشرشده را برای صورتحساب به کار نبرید. دو صفحه‌ی رسمی OpenAI برای همین مدل دو نسبت متفاوت می‌دهند. عدد مدل را بخوانید و نسبتش را بسازید.

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

منابع

  1. Better prompt caching for GPT-6 — OpenAI، ۲۲ سپتامبر ۲۰۲۶
  2. Prompt caching، راهنمای API — OpenAI Developers
  3. Prompt cache diagnostics — OpenAI Developers
  4. Introducing GPT-6.1 Sol — OpenAI، ۲۹ سپتامبر ۲۰۲۶
  5. Introducing GPT-6 Sol and Luna — OpenAI، ۲۲ سپتامبر ۲۰۲۶
  6. Introducing Claude Opus 5.5 — Anthropic، ۲۲ سپتامبر ۲۰۲۶
  7. Pricing — Claude Platform
  8. Claude Code changelog
  9. GitHub Changelog، ۲۲ سپتامبر ۲۰۲۶
  10. اعلام @OpenAI درباره‌ی قیمت ورودیِ کش‌شده، ۲۹ سپتامبر ۲۰۲۶
  11. اعلام @OpenAI درباره‌ی GPT-6.1 Sol، ۲۹ سپتامبر ۲۰۲۶
  12. اعلام @OpenAI درباره‌ی Ultrafast و Pro 500، ۲۹ سپتامبر ۲۰۲۶