0Pricing
AI Engineering Academy · درس

التخزين المؤقت لبادئة المطالبة في OpenAI

استفيدوا من التخزين المؤقت التلقائي للمطالبات في OpenAI، الذي يخفّض تكلفة بادئات مطالبات النظام الطويلة المتكررة بنسبة 50 بالمئة، ونظّموا مطالباتكم لتعظيم معدلات إصابة الذاكرة المؤقتة.

التخزين المؤقت لبادئة المطالبة في OpenAI درس مجاني في AI Engineering Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Engineering Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

ما التخزين المؤقت لبادئة المطالبة؟

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

كيف يعمل التخزين المؤقت للبادئة من الداخل

تمثل نماذج LLM الحديثة المطالبات على هيئة ذاكرات تخزين مؤقتة لـ KV (المفتاح-القيمة) في ذاكرة GPU. وتعني معالجة مطالبة حساب مفاتيح وقيم الانتباه لكل رمز. فإذا كانت الرموز N الأولى من طلبين متتاليين متطابقة، يمكن لـ OpenAI إعادة استخدام ذاكرة KV المؤقتة من الطلب الأول، متجاوزةً الحساب المكلف لتلك الرموز. تنفّذ واجهة API ذلك تلقائيًا وبشفافية — ولا تدفع عند انطباقه إلا سعر الرموز المخزّنة مؤقتًا الأقل.

# No code changes needed to enable prefix caching!
# It is automatic on supported models.

# The API response shows you how many tokens were cached:
# response.usage.prompt_tokens_details.cached_tokens

# Example response usage:
# ChatCompletionUsage(
#   prompt_tokens=2048,
#   completion_tokens=256,
#   total_tokens=2304,
#   prompt_tokens_details=PromptTokensDetails(
#     cached_tokens=1984,   # these tokens were served from KV cache
#     audio_tokens=0,
#   )
# )

التحقق من إصابة التخزين المؤقت في الاستجابة

بعد كل استدعاء لواجهة API، افحص response.usage.prompt_tokens_details.cached_tokens لمعرفة عدد رموز الإدخال التي قُدّمت من ذاكرة KV المؤقتة. إذا كانت قيمة cached_tokens > 0، فقد دفعت سعر الخصم البالغ 50 بالمئة لهذه الرموز. يتيح لك تسجيل هذه القيمة تتبع كفاءة التخزين المؤقت الفعلية وحساب الوفورات الناتجة عن التخزين المؤقت للبادئة بمرور الوقت.

from openai import OpenAI

client = OpenAI()

SYSTEM_PROMPT = 'You are an expert AI engineer assistant. ' * 100  # long system prompt

def call_with_cache_check(user_message: str):
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': SYSTEM_PROMPT},
            {'role': 'user', 'content': user_message},
        ],
    )
    usage = response.usage
    cached = usage.prompt_tokens_details.cached_tokens if usage.prompt_tokens_details else 0
    print(f'Total prompt tokens: {usage.prompt_tokens}')
    print(f'Cached tokens: {cached} ({100*cached//usage.prompt_tokens}%)')
    return response.choices[0].message.content

يجب أن تكون البادئة متطابقة تمامًا

لا ينطبق التخزين المؤقت للبادئة إلا عندما تكون الرموز N الأولى متطابقة بايتًا ببايت مع طلب سابق حديث. حتى تغيير حرف واحد في system prompt يبطل التخزين المؤقت. تخزّن OpenAI البادئات في أجزاء من 128 رمزًا، ولا ينطبق التخزين المؤقت إلا على الأجزاء الكاملة المتطابقة تمامًا. وهذا يعني أن الجزء المتغير من المطالبة لكل طلب ينبغي أن يأتي بعد البادئة الطويلة والثابتة لزيادة عدد الرموز المخزّنة مؤقتًا.

# Optimal structure for prefix caching:
# [LONG STABLE SYSTEM PROMPT] [CACHED DOCUMENTS] [USER QUERY]
#         ↑                              ↑                ↑
#    always same               always same         varies per request
#    → cached at 50%           → cached at 50%     → not cached, full price

# BAD structure (defeats prefix caching):
# [USER QUERY] [CACHED DOCUMENTS] [LONG STABLE SYSTEM PROMPT]
#       ↑                                       ↑
#  changes every request                 never cached because
#  so prefix never matches               it comes after the query

تنظيم المطالبات لتحقيق أقصى كفاءة للتخزين المؤقت

لزيادة معدلات إصابة التخزين المؤقت، نظّم مطالباتك بحيث تأتي الأجزاء الثابتة أولًا. في نظام RAG: (1) system prompt الذي يتضمن التعليمات والشخصية، (2) المستندات المسترجعة التي لا تتغير إلا عند تغير الاستعلام بدرجة كبيرة، (3) سجل المحادثة، (4) استعلام المستخدم في النهاية تمامًا. عادةً ما يُخزّن system prompt وحده مؤقتًا، إذ يتراوح غالبًا بين 500 و2000 رمز، مما يوفر 25-50 بالمئة من تكاليف رموز الإدخال.

def build_rag_prompt_for_caching(
    system_prompt: str,
    retrieved_docs: list[str],
    conversation_history: list[dict],
    user_query: str,
) -> list[dict]:
    # Order: stable → semi-stable → variable
    context_block = '\n\n'.join(
        f'[Document {i+1}]\n{doc}' for i, doc in enumerate(retrieved_docs)
    )
    return [
        # 1. Stable system prompt (always cached after first request)
        {'role': 'system', 'content': system_prompt},
        # 2. Context injection as a user message (cached when same docs retrieved)
        {'role': 'user', 'content': f'Context documents:\n{context_block}'},
        {'role': 'assistant', 'content': 'I have read the documents.'},
        # 3. Conversation history (semi-stable)
        *conversation_history,
        # 4. Current user query (always different → never cached prefix)
        {'role': 'user', 'content': user_query},
    ]

مدة التخزين المؤقت والإخلاء

تُحافَظ ذاكرة KV المؤقتة لدى OpenAI في ذاكرة GPU، ولها سياسة إخلاء. تُخلَى البادئات التي لم يُعَد استخدامها خلال 5-10 دقائق تقريبًا عندما تشغل الطلبات الأخرى ذاكرة GPU. وهذا يعني أن فوائد التخزين المؤقت للبادئة تكون أكبر في التطبيقات عالية معدل النقل ذات الطلبات المتكررة التي تشترك في البادئة نفسها. وقد لا تشهد التطبيقات منخفضة الحركة إلا عددًا قليلًا من إصابات التخزين المؤقت، لأن البادئة تُخلى بين الطلبات المتباعدة.

النماذج والأسعار المدعومة

اعتبارًا من عام 2025، يتوفر التخزين المؤقت لبادئة المطالبة في نماذج GPT-4o وGPT-4o-mini وo1 وo3-mini. ويبلغ سعر الرمز المخزّن مؤقتًا 50 بالمئة من سعر رمز الإدخال القياسي لمعظم النماذج. ويبلغ الحد الأدنى لطول البادئة القابلة للتخزين المؤقت 1024 رمزًا، ولا تحصل البادئات الأقصر على أي خصم. تحقّق دائمًا من صفحة أسعار OpenAI لمعرفة الأسعار الحالية، إذ تتطور الأسعار مع نضج الميزة.

# Rough pricing reference (verify at platform.openai.com/pricing)
PRICING = {
    'gpt-4o': {
        'input_per_1M': 2.50,
        'cached_input_per_1M': 1.25,   # 50% off
        'output_per_1M': 10.00,
    },
    'gpt-4o-mini': {
        'input_per_1M': 0.15,
        'cached_input_per_1M': 0.075,  # 50% off
        'output_per_1M': 0.60,
    },
}

def estimate_cost_with_caching(prompt_tokens, cached_tokens, output_tokens, model):
    p = PRICING[model]
    uncached = (prompt_tokens - cached_tokens) * p['input_per_1M'] / 1_000_000
    cached_cost = cached_tokens * p['cached_input_per_1M'] / 1_000_000
    output_cost = output_tokens * p['output_per_1M'] / 1_000_000
    return uncached + cached_cost + output_cost

التخزين المؤقت للمطالبات في Anthropic

تقدم Anthropic ميزة مشابهة تسمى التخزين المؤقت للمطالبة لنماذج Claude، لكنها تتطلب تفعيلًا صريحًا عبر تحديد نقاط فصل التخزين المؤقت في المطالبة باستخدام الحقل cache_control. وعلى خلاف التخزين المؤقت التلقائي لدى OpenAI، تحدد أنت صراحةً أجزاء المطالبة التي ينبغي تخزينها مؤقتًا، بحد أقصى 4 نقاط فصل للتخزين المؤقت لكل طلب. وتكلفة الرموز المخزّنة مؤقتًا هي 10 بالمئة من سعر الإدخال القياسي، وتُخزّن لمدة 5 دقائق.

import anthropic

client = anthropic.Anthropic()

LONG_DOCUMENT = 'This is a very long reference document...' * 500  # 2000+ tokens

response = client.messages.create(
    model='claude-sonnet-4-5',
    max_tokens=1024,
    system=[
        {
            'type': 'text',
            'text': 'You are a helpful assistant.',
        },
        {
            'type': 'text',
            'text': LONG_DOCUMENT,
            'cache_control': {'type': 'ephemeral'},  # mark for caching
        }
    ],
    messages=[{'role': 'user', 'content': 'Summarize the document.'}],
)
print(response.usage.cache_read_input_tokens)   # tokens served from cache
print(response.usage.cache_creation_input_tokens)  # tokens written to cache

دمج التخزين المؤقت للبادئة مع التخزين المؤقت على مستوى التطبيق

التخزين المؤقت للبادئة والتخزين المؤقت على مستوى التطبيق متكاملان. يقلل التخزين المؤقت للبادئة تكلفة كل استدعاء لواجهة API، لكنه يواصل استدعاء LLM. أما التخزينان المؤقتان التام والدلالي على مستوى التطبيق، فيلغيَان استدعاءات واجهة API بالكامل للاستعلامات المتكررة. استخدم التخزين المؤقت للبادئة مع جميع الطلبات لتقليل تكلفة الإدخال لكل استدعاء، وأضف فوقه التخزين المؤقت على مستوى التطبيق لإلغاء الاستدعاءات بالكامل للاستعلامات المتكررة بكثرة. ويمكنهما معًا خفض تكاليف البنية التحتية للذكاء الاصطناعي بنسبة 60-80 بالمئة.

# Three-layer cost optimization stack
#
# Layer 1: Exact cache (Redis, hash-based)
#   → Eliminates 100% of API cost for identical requests
#   → Miss rate: ~60-80% (most queries are unique)
#
# Layer 2: Semantic cache (vector similarity)
#   → Eliminates 100% of API cost for semantically similar requests
#   → Miss rate: ~40-60% of remaining queries
#
# Layer 3: OpenAI prefix caching (automatic)
#   → Reduces input token cost by 50% for long stable prefixes
#   → Applies to ALL remaining API calls that escape layers 1 and 2
#
# Combined effect: 60-80% cost reduction in FAQ/support applications

قياس كفاءة التخزين المؤقت

تتبّع نسبة كفاءة التخزين المؤقت باعتبارها مقياسًا مركبًا: إجمالي الرموز بالسعر الكامل مقسومًا على إجمالي الرموز التي تمت محاسبتك عليها فعليًا. ويأخذ ذلك في الحسبان جميع طبقات التخزين المؤقت. سجّل cached_tokens من كل استجابة لواجهة API واجمعها أسبوعيًا. فإذا حقق نظامك نسبة 50 بالمئة من الرموز المخزّنة مؤقتًا عبر جميع استدعاءات واجهة API، فقد خفّض فعليًا تكاليف رموز الإدخال إلى النصف من دون الحاجة إلى أي تغييرات في كود التطبيق لتفعيل التخزين المؤقت للبادئة.

from dataclasses import dataclass, field
from typing import ClassVar

@dataclass
class CachingMetrics:
    total_prompt_tokens: int = 0
    total_cached_tokens: int = 0
    app_cache_hits: int = 0
    app_cache_misses: int = 0

    @property
    def prefix_cache_ratio(self) -> float:
        if self.total_prompt_tokens == 0:
            return 0
        return self.total_cached_tokens / self.total_prompt_tokens

    @property
    def app_cache_hit_rate(self) -> float:
        total = self.app_cache_hits + self.app_cache_misses
        return self.app_cache_hits / total if total > 0 else 0

    def report(self):
        print(f'App cache hit rate: {self.app_cache_hit_rate:.1%}')
        print(f'Prefix cache ratio: {self.prefix_cache_ratio:.1%}')
        savings_multiplier = (1 - self.app_cache_hit_rate) * (1 - 0.5 * self.prefix_cache_ratio)
        print(f'Effective cost vs no-cache: {savings_multiplier:.1%}')

متى لا يفيد التخزين المؤقت للبادئة

لا يقدّم التخزين المؤقت للبادئة أي فائدة في الحالات التالية: (1) المطالبات القصيرة التي تقل عن 1024 رمزًا، وهو الحد الأدنى للطول القابل للتخزين المؤقت، (2) البادئات شديدة التغير، حيث يتغير system prompt لكل مستخدم أو طلب، (3) التطبيقات منخفضة الحركة، حيث تُخلى ذاكرة KV المؤقتة بين الطلبات، أو (4) عندما تكون تدفع بالفعل الحد الأدنى لسعر الرموز. في هذه الحالات، ركّز جهود التحسين على التخزين المؤقت الدلالي على مستوى التطبيق.

تحقق سريع

اختبر مدى فهمك للتخزين المؤقت لبادئة المطالبة في OpenAI من هذا الدرس.

مراجعة الدرس

تعلّمت في هذا الدرس أن التخزين المؤقت لبادئة المطالبة في OpenAI يطبّق تلقائيًا خصمًا بنسبة 50 بالمئة على رموز الإدخال المخزّنة مؤقتًا عندما تتطابق بادئة المطالبة مع طلب سابق حديث، وأن المحتوى الثابت يجب أن يأتي أولًا في بنية رسالتك — system prompt ثم المستندات ثم استعلام المستخدم — لزيادة عدد الرموز المخزّنة مؤقتًا، وأن Anthropic تتطلب علامات cache_control صريحة لميزة مشابهة في Claude. ادمج ذلك مع التخزين المؤقت على مستوى التطبيق لتحقيق أكبر خفض ممكن للتكلفة. بعد ذلك سنتناول المعالجة الدفعية وتوجيه النماذج ولوحات معلومات التكلفة لإكمال مجموعة أدوات التحسين لدينا.

الأسئلة الشائعة

هل درس «التخزين المؤقت لبادئة المطالبة في OpenAI» مجاني؟

نعم — نص درس «التخزين المؤقت لبادئة المطالبة في OpenAI» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Engineering Academy، انتقل إلى CoddyKit PRO. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

ماذا ستتعلم في «التخزين المؤقت لبادئة المطالبة في OpenAI»؟

استفيدوا من التخزين المؤقت التلقائي للمطالبات في OpenAI، الذي يخفّض تكلفة بادئات مطالبات النظام الطويلة المتكررة بنسبة 50 بالمئة، ونظّموا مطالباتكم لتعظيم معدلات إصابة الذاكرة المؤقتة. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Engineering Academy؟

لا تُشترط خبرة سابقة. AI Engineering Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «التخزين المؤقت لبادئة المطالبة في OpenAI»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Engineering Academy هذا؟

نعم. كل درس في AI Engineering Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التخزين المؤقت الدقيق باستخدام Redis
  2. التخزين المؤقت الدلالي باستخدام التضمينات
  3. التخزين المؤقت لبادئة المطالبة في OpenAI
  4. التجميع وتوجيه النماذج ولوحات التكاليف
← العودة إلى AI Engineering Academy