المستوى المطلوب: متوسط — تحتاج إلمامًا بـ Claude API و Python و مفاهيم الـ pricing الأساسية للـ tokens.
chatbot شركة عقارات بيرد على 20,000 سؤال شهريًا، system prompt حجمه 50,000 token (سياسات + بيانات + few-shot examples). الفاتورة على Claude Sonnet بسعر مايو 2026 = حوالي $3,000 شهر، مع إن 99% من الـ tokens دي ثابتة ومتكررة. Prompt Caching بينزّل الرقم ده لـ $330 بسطرين كود، بدون أي تغيير في جودة الرد.
Prompt Caching في Claude API: ازاي توفّر 89% من فاتورتك في الإنتاج
المشكلة باختصار
Claude API stateless. كل request بيتعامل مع الـ context من الصفر — حتى لو نفس الـ system prompt اتبعت 1000 مرة في ساعة. النتيجة: لو عندك RAG context كبير، أو instructions طويلة، أو few-shot examples، إنت بتدفع نفس فلوس tokenization على كل طلب وتستهلك نفس الـ GPU compute.
الفكرة بمثال أمين المكتبة
تخيّل أمين مكتبة. كل ما طالب يطلب كتاب اسمه "أساسيات الفيزياء"، بيمشي 30 ثانية للـ rack ويرجّعه. لو 50 طالب طلبوا الكتاب في ساعة، أمين المكتبة هيمشي 25 دقيقة في نفس الرف.
أمين مكتبة شاطر بيخلّي الكتب الـ"شائعة الطلب" على المكتب قدامه. أول طالب بيستنّى 30 ثانية (وقت إحضار الكتاب + وضعه على المكتب). كل اللي بعد كده بياخدوه في ثانيتين.
Prompt Caching بيشتغل بنفس المنطق على مستوى GPU memory: أول مرة تكلفة عالية شوية، بعد كده قراءة سريعة ورخيصة.
التعريف العلمي: KV-Cache في الـ Transformer
Claude (زي كل LLM مبني على transformer) بيحوّل كل token لـ Key/Value matrices في كل attention layer. الـ KV-cache هو هيكل بيخزّن الـ matrices دي بعد ما تتحسب أول مرة.
بدون caching: لو بعتت 50K token، الـ GPU بيحسب 50K KV pair من الصفر لكل request. مع caching: أول request بيحسبهم وبيخزّنهم في VRAM لمدة 5 دقايق. الـ requests التالية بتقرأهم مباشرةً من الذاكرة.
تكلفة الـ caching الحقيقية بتيجي من 3 عوامل: الـ vRAM occupancy على الـ GPU، إدارة الـ TTL (time-to-live)، وضمان أن الـ prefix بايت بـ بايت نفسه.
الكود الفعلي على anthropic SDK
import anthropic
client = anthropic.Anthropic()
system_prompt = open("docs/codebase-context.md").read() # ~50K tokens
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": system_prompt,
"cache_control": {"type": "ephemeral"}
}
],
messages=[{"role": "user", "content": "اشرحلي function processOrder()"}]
)
print(response.usage)
# UsageMetrics(input_tokens=18, cache_creation_input_tokens=49872,
# cache_read_input_tokens=0, output_tokens=412)