المستوى: متوسط
لو الـ system prompt بتاعك 5000 توكن وبيتبعت في كل request لـ Claude، الفاتورة بتكبر بسرعة. Prompt Caching بيخلّي القراءة الثانية والتالتة من نفس البرومبت بـ 10% من السعر الأصلي، وزمن أول توكن (TTFT) بينخفض في حدود 80% على نفس الموديل.
Prompt Caching في Claude: شرح عملي مع كود وأرقام
المشكلة باختصار
لمّا تبني تطبيق AI فيه system prompt كبير — مثلًا بوت دعم فني عنده 8000 توكن من توثيق الشركة، أو agent عنده 12 tool definition — كل request جديد بيدفع تكلفة قراءة الـ context كله من الأول. لو عندك 50,000 طلب يومي على Claude Sonnet 4.6، تكلفة الـ input لوحدها ممكن توصل لـ 900 دولار يوميًا لو الـ system prompt 6000 توكن. ودي تكلفة بتتدفع علشان النموذج بيقرأ نفس النص مليون مرة بدون داعي.
مثال للمبتدئ — أمين المكتبة الكسول
تخيّل إنك بتسأل أمين مكتبة 100 سؤال في اليوم، وكل سؤال بيبدأ بنفس المقدمة الطويلة: "أنا طالب طب في السنة التالتة، عندي امتحان فارماكولوجي بعد أسبوع، الجدول بتاعي كذا وكذا، عايز معلومة عن الدواء الفلاني". لو الأمين في كل مرة قعد يقرأ المقدمة من الأول قبل ما يفهم السؤال نفسه، ده هيضيع منك ساعات كل يوم بدون فايدة.
الأمين الذكي بيعمل العكس: أول مرة بس يقرأ المقدمة كويس، يحفظ السياق في دماغه (ذاكرة قصيرة المدى)، وبعدها لو سألته 99 سؤال في نفس الجلسة بيقفز على المقدمة على طول ويرد على كل سؤال لوحده. Prompt Caching بيدّي Claude نفس السلوك ده، بس على مستوى الـ infrastructure مش الإنسان.
التعريف العلمي — KV Cache في طبقة الـ inference
كل ما Claude بيقرأ توكن، بيحوّله لـ matrix من Keys و Values جوّا كل layer من الـ transformer. الحسابات دي تقيلة computationally، وبتاكل أغلب الـ FLOPs في مرحلة الـ prefill (المرحلة اللي قبل ما يبدأ يولّد كلمة). اللي بتعمله Anthropic مع Prompt Caching إنها بتحفظ النتيجة دي على مستوى الـ servers بتاعتها لمدة افتراضية 5 دقايق (TTL قصير) أو ساعة كاملة (TTL طويل، بسعر write أعلى).
في الطلب الأول، أنت بتدفع write cost ≈ 1.25× سعر الـ input العادي. في الطلبات اللي بعدها وخلال الـ TTL، بتدفع read cost ≈ 0.1× سعر الـ input. ده مش ضغط للنص ولا تلخيص، ده تخطّي للحساب نفسه — النموذج بيكمّل من نقطة محفوظة بدل ما يبدأ من الصفر.
الكود الشغّال — cache_control مع Anthropic SDK
import anthropic
client = anthropic.Anthropic()
system_prompt = open("docs/full_handbook.md").read() # ~6000 token
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": "ايه طريقة استرجاع الفاتورة المرفوضة؟"}
]
)
print(response.usage)
# {
# input_tokens: 12,
# cache_creation_input_tokens: 6043,
# cache_read_input_tokens: 0,
# output_tokens: 180
# }