المستوى: متوسط — يفترض إنك مستخدم Anthropic SDK قبل كده وعارف فكرة الـ system prompt والـ messages.
Prompt Caching في Claude: ادفع 90% أقل لما المستند بيتكرّر في كل طلب
لو عندك PDF بـ 50 صفحة وفريق دعم بيسأل عنه Claude 200 مرة في اليوم، انت بتدفع تكلفة encoding للمستند كاملاً 200 مرة. Prompt Caching بيخزّن النسخة المُحوَّلة لتوكنز لمدة 5 دقائق افتراضيًا (أو ساعة بـ extended TTL) ويخصم 90% من تكلفة الجزء المُكاش. النتيجة على workload حقيقي: فاتورة شهرية بتنزل من $2,400 لحوالي $310 على نفس عدد الطلبات وبنفس جودة الردود.
المشكلة باختصار
كل request بتبعته لـ Claude بيعدي على نفس الخطوات: الموديل بياخد كل التوكنز اللي في الـ system prompt + الـ messages، بيعملها encoding، وبعدين بيولّد الرد. لو 95% من الـ input ثابت (مستند، تعليمات، أمثلة few-shot)، انت بتدفع نفس التكلفة كل مرة على نفس الكلام. ده مش هدر بسيط؛ ده هدر بنسبة 80–95% من فاتورة الـ input لو الـ workload بيعتمد على سياق متكرر.
المثال المبسّط: موظف الاستقبال اللي بيقرا نفس الكتالوج كل مرة
تخيّل موظف استقبال في فندق، كل مرة عميل يسأله عن خدمة، بيفتح كتالوج من 200 صفحة ويقراه من الأول للآخر علشان يجاوب. لو في 200 سؤال يوميًا، هو بيقرا 40,000 صفحة في اليوم. المنطقي: يقرا الكتالوج مرة واحدة الصبح، يحفظ المعلومة في دماغه، وكل سؤال يجاوبه من اللي حافظه.
Prompt Caching بيعمل نفس الفكرة بالظبط مع الموديل. أول مرة بتبعت السياق، الموديل بيـ"يحفظ" التمثيل الداخلي للتوكنز في طبقة كاش على سيرفر Anthropic. أي طلب تاني خلال 5 دقائق بيجيب نفس السياق من الكاش، فبتدفع 10% فقط من تكلفته الأصلية، والـ latency بينزل لأن الـ encoding اتعمل قبل كده.
التعريف العلمي الدقيق
Prompt Caching هو ميكانيزم في Anthropic API بيخزّن الـ KV (Key-Value) cache الناتج عن أول pass للسياق على الموديل. الـ KV cache هو التمثيل الداخلي اللي الـ transformer بيستخدمه في الـ self-attention. لما بتطلب cache hit، الموديل بيتخطى مرحلة الـ prefill كاملة للجزء المُكاش ويبدأ مباشرة من generation phase.
التسعير الرسمي على Sonnet 4.5: cache write = 1.25x من سعر الـ input العادي، cache read = 0.1x. ده معناه إنك بتدفع 25% زيادة في الطلب الأول بس، وبعدها كل قراءة بتوفّر 90%. break-even point بيحصل بعد طلب واحد بس بيقرا من الكاش — أي طلب تاني بقا ربح صافي.
الكود التنفيذي على Anthropic SDK
الفكرة كلها بتشتغل بإضافة cache_control على الـ block اللي عايز تخزّنه. الحد الأدنى للـ cache هو 1024 توكن على Sonnet (2048 على Haiku)، أقل من كده الـ API بيتجاهل الطلب بصمت ومش هيكاش حاجة.
import anthropic
client = anthropic.Anthropic()
LONG_DOCUMENT = open("policy.txt").read() # افترض 30,000 توكن
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system=[
{
"type": "text",
"text": "أنت مساعد دعم فني للشركة. جاوب من المستند فقط."
},
{
"type": "text",
"text": LONG_DOCUMENT,
"cache_control": {"type": "ephemeral"}
}
],
messages=[
{"role": "user", "content": "ايه سياسة الإجازات؟"}
]
)
print(response.usage)
# المرة الأولى: cache_creation_input_tokens=30000, cache_read_input_tokens=0
# المرة الثانية: cache_creation_input_tokens=0, cache_read_input_tokens=30000