لو تطبيقك بيبعت نفس الـ system prompt الطويل (4000 token مثلاً) في كل request، إنت بتدفع تقريبًا 12 دولار لكل ألف طلب من غير لازمة. Prompt Caching من Anthropic بينزّل الرقم ده لحوالي 1.20 دولار، مع تحسّن في زمن الرد يوصل لـ 85% في الـ TTFT (Time To First Token).
Prompt Caching: ليه 90% من فاتورة Claude بتاعتك ممكن تختفي بسطر واحد
المشكلة باختصار
التطبيقات اللي بتستخدم Claude في الإنتاج غالبًا فيها جزء ثابت كبير: تعليمات النظام، أمثلة few-shot، أو وثيقة مرجعية بتتحط في كل طلب. الجزء ده بيتقري ويتعالج من الصفر في كل request جديد. ده هدر صريح في الفلوس والوقت. Prompt Caching بيخلّي Claude يخزّن النسخة المعالجة لخمس دقايق ويستخدمها مباشرة في الطلبات اللي وراها.
مثال للمبتدئ: قهوجي البيت
تخيّل قهوجي بيعمل قهوة فرنسية. كل زبون لازم يسخّن المياه من أول وجديد، يطحن البن، يعمل الترشيح. لو 50 زبون جم في 5 دقايق، الزبون رقم 50 هياخد 8 دقايق علشان يتقدّم. الـ Prompt Caching هو إن القهوجي يسخّن جالون مياه واحد مرة، ويستخدمه لكل الزبائن خلال الخمس دقايق اللي جايين. الزبون الأول يستنى دقيقتين، الباقيين يستنوا 30 ثانية بس.
المياه الساخنة هي "الـ context المعالج" في Claude. اللي بيدفع وقته كامل هو أول request (cache write). الباقيين بيستفيدوا (cache read) بـ 10% من السعر و 50%-85% من الوقت.
التعريف العلمي بدقة
Prompt Caching بيشتغل على مستوى الـ KV cache في الـ Transformer. لمّا الـ model بيعالج tokens، كل token بيعمل ثلاث matrices: Query و Key و Value. الـ Q بتتغيّر مع كل request جديد، لكن الـ K و V الخاصين بالـ tokens الثابتة في بداية الـ prompt متغيّروش. Anthropic بتخزّن الـ K و V دول في طبقة caching داخلية لمدة 5 دقايق default، أو ساعة كاملة لو فعّلت الـ extended cache (متاح من 2025 بسعر write أعلى).
مع كل cache hit، الـ inference engine بيتجاوز الـ prefill phase الخاص بالجزء المخزّن، ويبدأ مباشرة من أول token جديد في الـ request الحالي. ده بيوفّر computational cost بنسبة تقريبية = (cached_tokens / total_input_tokens).
الكود الفعلي: السطر الجوهري واحد
import anthropic
client = anthropic.Anthropic()
LEGAL_REFERENCE = open("egyptian_civil_code.txt").read() # ~8200 token
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": f"أنت مساعد قانوني مصري متخصص. القوانين المرجعية:\n{LEGAL_REFERENCE}",
"cache_control": {"type": "ephemeral"}
}
],
messages=[
{"role": "user", "content": "ما حكم البيع بالتقسيط في القانون 17 لسنة 1999؟"}
]
)
print(response.usage)
# المرة الأولى:
# cache_creation_input_tokens: 8214
# cache_read_input_tokens: 0
# في الطلبات اللاحقة خلال 5 دقايق على نفس الـ prompt:
# cache_creation_input_tokens: 0
# cache_read_input_tokens: 8214