المستوى المطلوب: متوسط — تحتاج خبرة سابقة مع Anthropic SDK وفهم بنية request/response في APIs، ومعرفة سطحية بالـ tokens والتكلفة لكل مليون توكن.
لو فاتورة Anthropic عندك بتعدّي 800 دولار شهريًا، وأكتر من 70% من التكلفة بتروح في إعادة إرسال نفس system prompt الطويل في كل request، Prompt Caching بسطر واحد اسمه cache_control بينزّل الفاتورة دي لـ 80 دولار على نفس الـ workload. التكلفة: أول request يدفع 25% زيادة علشان الكاش يتبني. المكسب: كل request بعد كده طول 5 دقايق بياخد خصم 90% على الجزء المخزّن.
Prompt Caching بدون تعقيد: المنهج على السبورة بدل ما تعيد الشرح كل مرة
المثال البسيط الأول
تخيّل إنك بتدرّس نفس المنهج لـ 30 طالب في اليوم. كل ما طالب يدخل الفصل، انت بتعيد شرح الـ 50 صفحة الأساسية من الأول. ده ضياع 4 ساعات يوميًا. الأذكى: تكتب المنهج على السبورة مرة واحدة الصبح، وكل طالب جديد يقرا منه في 30 ثانية بدل ما تعيد الشرح. الفرق إن السبورة بتاعتك بتتمسح لو محدش جه لمدة 5 دقايق، فلازم الطلاب يتلاحقوا علشان السبورة تفضل شغّالة.
الـ Prompt Caching في Claude بيشتغل بنفس المنطق بالظبط. لو عندك system prompt 12 ألف توكن أو document طويل بتبعته في كل request، انت بتدفع تكلفة كاملة لكل توكن في كل مرة. Anthropic بقت تسمحلك تقول "اللي قبل النقطة دي ثابت، خزّنه على سيرفرك"، فأي request تاني بياخد الجزء المخزّن بـ 10% بس من سعره الأصلي.
التعريف العلمي الدقيق
Prompt Caching هو آلية تخزين server-side للـ KV cache (Key-Value cache) للجزء الثابت من الـ prompt في ذاكرة Anthropic لمدة 5 دقايق افتراضيًا (أو ساعة كاملة في الـ extended cache التجريبي). التخزين بيتم على مستوى الـ tokens المُشفّرة بعد ما تمر على الـ embedding layer، مش على مستوى النص الخام. لما يجي request تاني خلال نافذة الـ TTL، الموديل بيقارن الـ prefix بايت ببايت — لو متطابق، بيقرا الـ KV cache الموجود ويتخطّى مرحلة prefill من جديد، ده بيقطع زمن الـ Time-To-First-Token (TTFT) للنص تقريبًا.
الكود الشغّال على Anthropic SDK 0.40+
import anthropic
client = anthropic.Anthropic()
# system prompt كبير: كتالوج منتجات أو دليل سياسات داخلي
LARGE_CONTEXT = open("policies.md").read() # حوالي 12,000 توكن
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": LARGE_CONTEXT,
"cache_control": {"type": "ephemeral"} # السطر اللي بيغيّر الفاتورة
}
],
messages=[
{"role": "user", "content": "ما هي سياسة الإرجاع للمنتج X؟"}
]
)
print(response.usage)
# أول request:
# cache_creation_input_tokens: 12000
# cache_read_input_tokens: 0
# كل request بعدها خلال 5 دقايق:
# cache_creation_input_tokens: 0
# cache_read_input_tokens: 12000 ← بـ 10% من السعر الأصلي