Prompt Caching مع Claude: إزاي توفر 90% من تكلفة الـ AI بسطر واحد
لو بتبني تطبيق على Claude API وفاتورتك الشهرية بقت توجع، Prompt Caching ممكن يقلّلها لحد 90% ويخفّض زمن أول توكن بـ 50–80%، وكل ده بإضافة سطر واحد في الـ request بتاعك. المقال ده هيوريك إزاي تعمل ده بالظبط، إمتى يشتغل، وإمتى ميشتغلش.
المشكلة باختصار
لما بتبعت برومبت طويل (تعليمات نظام + وثائق مرجعية + سجل المحادثة) لـ Claude في كل request، أنت بتدفع تكلفة معالجة كاملة كل مرة. لو نفس الـ context بيتكرر في 1000 طلب يوميًا، أنت بالظبط بتدفع 1000 ضعف من غير أي قيمة مضافة. ده بيحصل بشكل صامت في معظم تطبيقات الـ chatbots و agents اللي شفتها.
الفكرة بمثال للمبتدئ جدًا
تخيّل إنك بتروح لنفس المطعم كل يوم. الويتر بيسألك في كل زيارة: "حضرتك مين؟ بتفضل المنيو إيه؟ عندك حساسية من إيه؟ بتدفع كاش ولا فيزا؟". الكلام ده بياخد منه 5 دقايق قبل ما يبدأ ياخد طلبك الفعلي.
Prompt Caching هو إن الويتر يعمل لك "كرت زبون دائم" ويحفظ كل البيانات دي. تاني مرة تدخل، يفتح الكرت في ثانية واحدة، وأنت بس بتقول "نفس طلب امبارح + كمان سلطة". فرّقت في الوقت؟ ده بالظبط اللي بيحصل في الـ API بتاع Claude.
التعريف العلمي الدقيق
Prompt Caching تقنية بتسمح لطبقة الـ inference إنها تخزّن نتيجة معالجة جزء من البرومبت، وبالتحديد الـ KV cache الخاص بطبقات الـ attention في الترانسفورمر. في الطلبات اللاحقة اللي بتشترك في نفس الـ prefix بايت-بايت، الموديل بيتجاوز خطوة إعادة المعالجة ويستخدم الحالة المخزّنة مباشرةً.
اقتصاديات الكاش بسيطة: الكتابة الأولى في الكاش بتكلّف 25% أكتر من الـ input العادي. القراءة من الكاش بتكلّف 10% فقط من تكلفة الـ input. مدة الصلاحية الافتراضية 5 دقايق من آخر استخدام (ephemeral)، وفيه خيار ساعة كاملة في خطط معيّنة.
إزاي تشغّلها فعليًا — كود يشتغل دلوقتي
ركّز في 3 خطوات: حدّد الجزء الثابت، حطّه في البداية، وعلّم عليه cache_control. الجزء المتغيّر (سؤال المستخدم) يتحط بعدين بدون أي علامة.
- قسّم البرومبت لـ "ثابت طويل" (system + docs + tools) و"متغيّر قصير" (سؤال المستخدم).
- الجزء الثابت لازم يكون ≥ 1024 توكن لـ Sonnet/Opus، أو ≥ 2048 توكن لـ Haiku. أقل من كده الكاش مش هيتفعّل أصلًا.
- تأكد إن الـ prefix ما بيتغيّرش ولا بحرف واحد بين الطلبات (حتى الـ timestamp في system prompt هيلغي الكاش).
import anthropic
client = anthropic.Anthropic()
LONG_LEGAL_DOCS = open("contracts.txt").read() # حوالي 50K توكن
response = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
system=[
{
"type": "text",
"text": "أنت مساعد متخصص في تحليل العقود القانونية باللغة العربية."
},
{
"type": "text",
"text": LONG_LEGAL_DOCS,
"cache_control": {"type": "ephemeral"}
}
],
messages=[
{"role": "user", "content": "لخّصلي البند رقم 12 من العقد بنقاط."}
]
)
print(response.usage)
# أول طلب:
# cache_creation_input_tokens: 50000
# cache_read_input_tokens: 0
# الطلبات اللي بعدها (خلال 5 دقايق):
# cache_creation_input_tokens: 0
# cache_read_input_tokens: 50000