cd ../back to blog
$Guide//June 4, 2026//8 min read

التخزين المؤقت للـ prompt بعمق: كيف تخفض تكلفة المدخلات بنسبة 90%

دليل عملي للتخزين المؤقت للـ prompt على Brievio: أسلوب cache_control من Anthropic، والتخزين التلقائي بأسلوب OpenAI، والنقاط الفاصلة المتعددة، والمزالق التي تُبطل الـ cache بصمت، وكيف تتحقق من معدّل الإصابة وأسعاره الصادقة.

إذا كنت ترسل system prompt طويلاً — سياق RAG، أو فهرس أدوات، أو قواعد لوكيل، أو أمثلة — فأنت على الأرجح تدفع سعر المدخلات الكامل في كل نداء. التخزين المؤقت للـ prompt من Anthropic يخفّض ذلك إلى 10% من السعر على الجزء المخزَّن. وOpenAI تفعل الشيء نفسه ضمنياً. تجد معظم الفرق أن الأمر يستحق 30 دقيقة من العمل لأنه يقتطع بثبات من 60 إلى 90% من بند تكلفة المدخلات.

يمرّر Brievio كلا الأسلوبين دون تغيير، مقابل النموذج الأصلي. أسلوب Anthropic عبر cache_control يعمل على Messages API؛ والتخزين المؤقت التلقائي بأسلوب OpenAI يعمل على Chat Completions API. يشرح هذا المقال كليهما، والمزالق التي تُبطل الـ caches بصمت، وكيف تتحقق من معدّل الإصابة لديك.

قبل وبعد

حلقة ساذجة ترسل system prompt نفسه بحجم 18 ألف توكن عشر مرات:

naive.py
# ما يبدأ به معظم الناس: كل نداء يعيد دفع ثمن الـ prompt بالكامل.
import anthropic

client = anthropic.Anthropic(
    api_key="sk-brievio-...",
    base_url="https://api.brievio.com",
)

SYSTEM = open("system-prompt.md").read()        # 18,000 توكن من القواعد + الأمثلة

# 10 أسئلة مستخدم في جلسة واحدة. كل نداء يرسل كتلة system بحجم 18 ألف توكن.
for question in questions:
    resp = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=600,
        system=SYSTEM,
        messages=[{"role": "user", "content": question}],
    )

# التكلفة لكل نداء (المدخلات فقط): 18,000 × $3 / 1M = $0.054
# 10 نداءات: $0.54 في المدخلات وحدها.

والآن علّم كتلة system بأنها قابلة للتخزين المؤقت — حقل إضافي واحد:

cached.py
# الحل: علّم البادئة الثابتة بأنها قابلة للتخزين المؤقت. بعد النداء الأول،
# تدفع النداءات اللاحقة خلال ~5 دقائق 10% من سعر المدخلات على الجزء
# المخزَّن. الجواب نفسه، بأرخص بنسبة 89%.
resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=600,
    system=[
        {
            "type": "text",
            "text": SYSTEM,
            "cache_control": {"type": "ephemeral"},  # علّمها قابلة للتخزين المؤقت
        }
    ],
    messages=[{"role": "user", "content": question}],
)

# النداء الأول (كتابة الـ cache):  18,000 × $3   / 1M = $0.054
# النداءات 2–10 (إصابة الـ cache):  18,000 × $0.30 / 1M = $0.0054 لكل واحد
# الإجمالي: $0.054 + 9 × $0.0054 = $0.103  (كان $0.54 — توفير 81%)

لقد وفّرت للتو 81% من تكلفة المدخلات في هذه الجلسة. النداء الأول هو في الواقع أغلى قليلاً من النسخة الساذجة (نحو 1.25× من سعر المدخلات لكتابة الـ cache). والنداءات من 2 إلى 10 تدفع 10% من السعر. نقطة التعادل عند النداء الثاني — وبحلول النداء الثالث تكون قد سبقت. وبحلول النداء العاشر يصبح الفارق ساحقاً.

أسلوب OpenAI: لا شيء عليك فعله

إذا كنت تستخدم OpenAI SDK، فإن Chat Completions يخزّن مؤقتاً بادئة أي prompt يتجاوز 1,024 توكن تلقائياً. لا علم، ولا إعداد. النموذج نفسه خلف Brievio ينال الخصم سواء استخدمت مسار Anthropic أو OpenAI في:

openai_style.py
# أسلوب OpenAI Chat Completions — التخزين المؤقت تلقائي للـ prompts ≥1024 توكن.
# لا علم يُضبط. كائن "usage" يخبرك بما جرى تخزينه مؤقتاً.
from openai import OpenAI

client = OpenAI(
    api_key="sk-brievio-...",
    base_url="https://api.brievio.com/v1",
)

resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[
        {"role": "system", "content": LONG_SYSTEM_PROMPT},  # >1024 توكن
        {"role": "user", "content": "Latest question…"},
    ],
)

# في الاستجابة:
#   resp.usage.prompt_tokens_details.cached_tokens  →  17,800
#   resp.usage.prompt_tokens                        →  18,200
# 17.8K/18.2K = 98% من المدخلات جاءت من الـ cache. الفاتورة تعكس ذلك تلقائياً.

اقرأ usage.prompt_tokens_details.cached_tokens لترى مقدار ما قُدّم من الـ cache. بادئة ثابتة أكبر = توفير أكبر. القاعدة العملية: إذا كان system prompt الخاص بك أقصر من محتوى المستخدم المتغيّر، فإن التخزين المؤقت لا يحقّق الكثير. أعد تشكيل الـ prompt بحيث تكون الأجزاء الثابتة كبيرة وفي المقدمة.

التخزين المؤقت متعدد الطبقات — حتى 4 نقاط فاصلة

في حلقات الوكلاء حيث تتغير بعض الطبقات أسرع من غيرها، اضبط عدة نقاط فاصلة لـ cache_control. كل واحدة هي لقطة لكل شيء حتى تلك النقطة:

breakpoints.py
# يدعم Anthropic ما يصل إلى 4 نقاط فاصلة للتخزين المؤقت لكل طلب — استخدمها
# لإبقاء الـ cache ساخناً حتى مع تغيّر الطبقات اللاحقة.
client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=600,
    system=[
        {"type": "text",
         "text": ROLE_AND_RULES,                      # ~3,000 توكن
         "cache_control": {"type": "ephemeral"}},     # النقطة الفاصلة 1
        {"type": "text",
         "text": LARGE_KNOWLEDGE_BASE,                # ~15,000 توكن، نادراً ما تتغير
         "cache_control": {"type": "ephemeral"}},     # النقطة الفاصلة 2
    ],
    messages=[
        {"role": "user",
         "content": [
             {"type": "text",
              "text": CONVERSATION_HISTORY,           # تنمو في كل دور
              "cache_control": {"type": "ephemeral"}}, # النقطة الفاصلة 3
             {"type": "text", "text": new_question},
         ]},
    ],
)

# عندما تتغير CONVERSATION_HISTORY، تظل النقطتان الفاصلتان 1+2 تصيبان الـ cache.
# النقطة الفاصلة 3 + السؤال الجديد فقط هما من يدفعان سعر المدخلات الكامل.

مفتاح الـ cache هو البادئة بأكملها. أضِف توكناً عند الموضع N وكل نقطة فاصلة عند N أو بعدها تُبطل. الترتيب مهم: المحتوى الأكثر ثباتاً أولاً. ينبغي أن تتغير طبقة القواعد نادراً؛ وقاعدة المعرفة تتحدّث أسبوعياً؛ والمحادثة تنمو في كل دور.

طرق شائعة لكسر التخزين المؤقت بصمت

  • وضع التاريخ الحالي أو request_id في الـ prompt. كل نداء يصبح بادئة جديدة، ومعدّل إصابة الـ cache يساوي 0%. جزّئ مدخلات الـ prompt إلى hash وقارنها عبر النداءات.
  • تجميع system prompt بشكل غير حتمي. إذا بنيت الـ system من dict، فترتيب التكرار في الـ dict مهم في بعض إصدارات Python. رتّب المفاتيح صراحة.
  • عمر الـ cache نحو 5 دقائق. أنماط الحركة المتفرقة (نداء واحد كل 10 دقائق) لا تحصل على أي إصابات. إما أن تجمّع النداءات، أو تقبل الخسارة.
  • الحد الأدنى 1,024 توكن. دون 1 ألف توكن، لا يعمل التخزين المؤقت بأسلوب OpenAI. ادمج الشظايا الثابتة الصغيرة في بادئة واحدة أطول.
  • تعريفات الأدوات / الدوال جزء من البادئة. أداة جديدة تُضاف إلى الفهرس تُبطل الـ cache للجميع. أبقِ فهرس الأدوات ثابتاً؛ وأصدِره بإصدارات.

التحقق من معدّل الإصابة

التخزين المؤقت الذي لا تستطيع رؤيته ليس هندسة — بل أمنية. سجّل usage في كل نداء:

observe.py
# اقرأ usage دائماً. إذا كان cached_tokens يساوي 0 بينما توقّعت إصابة،
# فثمة خطأ ما — عادةً بادئة غير حتمية.
resp = client.messages.create(...)
u = resp.usage
print({
    "input_uncached":  u.input_tokens,
    "input_cache_read": u.cache_read_input_tokens,
    "input_cache_write": u.cache_creation_input_tokens,
    "output": u.output_tokens,
})

# مزلق شائع: وضع تاريخ اليوم أو request_id في system prompt يُبطل الـ cache
# بصمت. جزّئ مدخلاتك إلى hash؛ وتحقق من أن cache_read_input_tokens ليس صفراً
# في النداء الثاني المطابق.

في لوحة تحكم Brievio، تعرض صفحة الاستهلاك توزيع الـ cache لكل نموذج لكل يوم. إذا رأيت cache_read_input_tokens ينمو كنسبة من إجمالي المدخلات، فالتخزين المؤقت يعمل. وإذا بقي عند 0 أو تذبذب بشدة، فراجع قائمة المزالق أعلاه.

كم يكلّف فعلاً على Brievio

سعر الـ cache لكل نموذج منشور على صفحة الأسعار:

  • نماذج Anthropic: قراءات الـ cache تساوي 10% من سعر المدخلات. وكتابات الـ cache تُحتسب بسعر المدخلات — دون رسوم إضافية من المصدر.
  • نماذج OpenAI / Gemini: قراءات الـ cache تساوي 20% من سعر المدخلات (النسبة المنشورة من المزوّدين).
  • كل أسعار التخزين المؤقت تعكس قائمة Brievio — أدنى بنحو 15% من السعر الرسمي للمزوّد. فقراءة cache لنموذج Sonnet 4.6 على Brievio تساوي $3 × 0.95 × 0.10 = $0.285 per 1M tokens. أرخص بنحو 10 أضعاف من سعر المدخلات غير المخزَّنة.

متى لا يكون التخزين المؤقت هو الحل

بضع حالات لا يستحق فيها العمل عناءه:

  • الـ prompts القصيرة (أقل من 1 ألف توكن إجمالاً). العبء يطغى؛ ببساطة لا تتكبّد العناء.
  • المهام ذات الطلقة الواحدة بلا حركة متكررة. النداء الأول أغلى قليلاً — والتخزين المؤقت لا يردّ كلفته إلا من النداء الثاني فصاعداً.
  • المهام عالية المخرجات منخفضة المدخلات (الكتابة الإبداعية، توليد الكود). المدخلات أصلاً حصة صغيرة من الفاتورة. ركّز بدلاً من ذلك على سقوف ميزانية المخرجات.

أما كل ما عدا ذلك — روبوتات RAG للدردشة، والوكلاء بفهرس أدوات ثابت، والمصنّفات التي تعمل على معيار تقييم ثابت، وخطوط استخراج البيانات المنظّمة بأمثلة قليلة متسقة — فالتخزين المؤقت هو التحسين الأعلى عائداً على الاستثمار الذي يمكنك إطلاقه في ظهيرة واحدة. اقرنه بـ التقنيات الأربع الأخرى في دليل تحسين التكلفة لدينا ويصبح خفض التكلفة بنسبة 70% واقعياً دون أي مقايضة واحدة في جودة المخرجات.

أنت بالفعل على Brievio؟ افتح /app/usage وافحص عمود الـ cache لأكبر نموذج لديك. إذا كان صفراً، فأنت تترك المال على الطاولة. الدليل الكامل: /docs/caching.