المستوى المطلوب: متوسط — تحتاج تعرف Anthropic SDK وأساسيات الـ messages API.
Prompt Caching: ليه فاتورة Claude بتاعتك أعلى 10x من اللازم
لو تطبيقك بيرسل 200 صفحة وثيقة قانونية لـ Claude في كل سؤال جديد، إنت بتدفع ثمن نفس الـ tokens مرة ورا التانية، رغم إنها ما اتغيرتش ولا حرف واحد. Prompt Caching بيحفظ الجزء الثابت من الـ prompt على سيرفرات Anthropic لمدة 5 دقايق، وبيحاسبك بـ 10% بس من السعر الأصلي على كل قراءة بعد كده.
المشكلة باختصار
افتراض إنك بتبني chatbot لشركة قانون مصرية. عندك dataset 50,000 token من العقود والقوانين، وكل مستخدم بيسأل سؤال جديد على نفس الـ dataset. لو بتبعت الـ dataset كامل في كل request بدون caching، الفاتورة بتكبر بشكل غير منطقي:
- 50,000 token × 500 سؤال يومي × 3$/مليون = 75$ يوميًا = 2,250$ شهريًا.
- الفعلي اللي محتاج تدفعه مع caching مفعّل: أقل من 230$ شهريًا.
- الباقي (2,020$) ضايع لأن Claude بيعيد قراءة نفس الوثائق 500 مرة كل يوم من الصفر.
الافتراض هنا إن كل الطلبات الـ 500 بتيجي على فترات أقل من 5 دقايق بين كل واحدة والتانية. لو في فجوات أطول، الأرقام بتختلف وهنرجع لها بعد شوية.
تخيّل المكتبة (شرح بسيط للمبتدئ)
تخيّل أمين مكتبة بيقرا نفس الكتاب من أول صفحة كل ما حد يسأله سؤال عن صفحة معينة. هياخد ساعة عشان يوصل للجزء المطلوب. لو خلّى الكتاب مفتوح على المكتب وحفظ في دماغه فهرس الموضوعات لمدة شوية، أي سؤال جاي هيرد عليه في ثواني، لأن الجهد الكبير اتعمل مرة واحدة في الأول.
Prompt Caching هو نفس الفكرة بالظبط. Anthropic بتحفظ نسخة جاهزة من الجزء المتكرر من الـ prompt بتاعك على السيرفرات بتاعتها لمدة 5 دقايق default، أو ساعة كاملة لو طلبت extended cache. أي طلب جاي في الفترة دي بيقرأ من الـ cache مباشرة، بدل ما الموديل يعيد معالجة كل token من الصفر.
التعريف العلمي الدقيق
الـ cache مش حفظ نص خام في key-value store. هو حفظ للـ KV-cache (Key-Value Cache) اللي الـ transformer بيبنيه أثناء الـ forward pass على كل layer من attention layers. يعني الموديل بيخزّن النتيجة الوسيطة (الـ keys والـ values المحسوبة لكل token) وبيستخدمها مباشرة في الطلبات اللي بعد كده، بدل ما يعيد الحساب الثقيل.
على مستوى الـ API، إنت بتحدد cache breakpoint عبر إضافة cache_control: {"type": "ephemeral"} على آخر block في الـ prompt اللي إنت عايز يتعمله cache. كل اللي قبله بيتخزّن، واللي بعده بيتعامل عادي. عندك حد أقصى 4 breakpoints في الـ request الواحد، فممكن تعمل caching متدرّج (system prompt + tool definitions + few-shot examples).
الحد الأدنى لتفعيل الـ cache
مش أي حاجة بتتخزّن. لازم الـ block يكون 1,024 token على الأقل لـ Sonnet و Opus، و2,048 token لـ Haiku. تحت الحد ده الطلب بيشتغل عادي بدون caching ومش هيرجعلك خطأ، بس الـ cache_control هيتجاهل بصمت. ده سبب شائع لمشكلة "الـ cache مش شغّال" عند المبتدئين.