المستوى: متوسط — يفترض إنك جربت Anthropic SDK مرة واحدة على الأقل وعارف ازاي تبعت request بـ system و messages.
لو فاتورة Claude بتاعتك بتعدّي $500 شهريًا و الـ system prompt بتاعك بيتكرر في كل استدعاء، إنت بتدفع ضعف اللي مفروض. Prompt Caching بيخفض تكلفة الـ input tokens المتكررة 90%، وبيقلّل الـ Time-To-First-Token حوالي 80% بعد أول cache hit. التفعيل سطر واحد في الكود، ومحدش بيشغّله صح.
Prompt Caching: ليه مهم وامتى تشغّله بالظبط
المشكلة باختصار
تخيّل عندك chatbot شغّال على Claude Sonnet 4.6، والـ system prompt فيه 8,000 توكن: تعليمات سلوك + 12 مثال few-shot + كتالوج منتجات + سياسة الشركة. كل request جديد بتبعته بيدفع تمن الـ 8,000 توكن دي من الأول. لو عندك 50,000 استدعاء يوميًا، إنت بتدفع 400 مليون توكن إدخال شهريًا فقط على نفس النص اللي ما بيتغيّرش. ده مش improvement opportunity، ده هدر مباشر.
الفكرة للمبتدئ: أمين المكتبة الشاطر
تخيّل أمين مكتبة بيرد على نفس الـ 10 أسئلة من الطلبة كل يوم. أول مرة بيسأله طالب "إيه قسم الفيزياء؟"، بيمشي 5 دقايق، يطلع على الكتالوج الورقي اللي فيه 800 صفحة، يلاقي القسم. بكره طالب تاني بيسأل نفس السؤال. هل يعقل أمين المكتبة يطلع على الكتالوج تاني من أول السطر؟ طبعًا لأ. أول ما يحس إن السؤال هيتكرر، بيكتب الإجابة في ورقة قدامه على المكتب. تالت مرة، بيرد في ثانيتين بدل 5 دقايق.
ده اللي بيعمله Prompt Caching بالظبط. الموديل بدل ما يحسب الـ representation الداخلي للـ system prompt من الصفر مع كل request، بيحتفظ بنسخة محسوبة على hardware Anthropic لـ 5 دقايق (أو ساعة لو دفعت زيادة)، وبيعيد استخدامها مع أي request جديد فيه نفس الـ prefix بالظبط.
التعريف العلمي الدقيق
كل Transformer بيحوّل النص لمتجهات Key و Value داخل طبقات الـ self-attention. الجزء التقيل حسابيًا في أي forward pass هو حساب الـ KV matrices دي للـ context كله. Prompt Caching بيخزّن KV matrices الخاصة بأول N توكن (الجزء المعلّم بـ cache_control) في memory مخصصة على infrastructure Anthropic. لما يجي request جديد بنفس الـ prefix byte-for-byte، الموديل بيلوّد الـ KV cache المحفوظة بدل ما يعيد حسابها.
الناتج: تكلفة cache hit = 10% من سعر الإدخال العادي على Sonnet 4.6 و Opus 4.7 (ده اللي بيدّيك توفير 90%)، و TTFT بيقل من 4–8 ثواني لأقل من ثانية على prefix بحجم 8K توكن.
الكود الشغّال — السطر الواحد اللي بيغيّر كل حاجة
from anthropic import Anthropic
client = Anthropic()
LARGE_SYSTEM_PROMPT = """
أنت مساعد دعم فني لشركة الشحن "وصلني".
تعليمات: ... (3000 توكن)
أمثلة few-shot: ... (3000 توكن)
كتالوج المنتجات والأسعار: ... (2000 توكن)
"""
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": LARGE_SYSTEM_PROMPT,
"cache_control": {"type": "ephemeral"}
}
],
messages=[
{"role": "user", "content": "ايه أرخص خطة شحن لـ 50 طرد لمصر؟"}
]
)
print("cache_creation:", response.usage.cache_creation_input_tokens)
print("cache_read:", response.usage.cache_read_input_tokens)
print("input غير مكاش:", response.usage.input_tokens)