كيف تخفّض تكلفة وكلاء الذكاء الاصطناعي في 2026: التخزين المؤقت وتوجيه النماذج والدُفعات

93% من فاتورة الوكيل المعتادة هي إعادة قراءة السياق نفسه. نموذج تكلفة مُختبَر يُظهر كيف يخفّضها التخزين المؤقت بنسبة 77%، وكيف يجعلها خطأ التاريخ والوقت أغلى بنسبة 23%، وماذا يضيف التوجيه والدُفعات.

Lumis Editorial · 11 دقائق قراءة · October 5, 2026

Read this article in English

كيف تخفّض تكلفة وكلاء الذكاء الاصطناعي في 2026: التخزين المؤقت وتوجيه النماذج والدُفعات

أول فاتورة لوكيل ذكاء اصطناعي تكون عادة مفاجأة. المحادثة العادية تكلّف سنتات، فتتوقع الفرق أن يكلّف الوكيل أضعافاً قليلة. ثم يتبيّن أن المهمة الواحدة تكلّف أكثر من دولار، وأن ألف مهمة يومياً تعني فاتورة شهرية بعشرات آلاف الدولارات.

والسبب بنيوي، وهذا يعني أن أغلب الفاتورة يمكن إزالتها دون المساس بالجودة. هذا الدليل يشرح أين تذهب توكنات الوكيل فعلاً، ثم يمر على أهم وسائل التوفير في 2026: التخزين المؤقت للتعليمات (Prompt Caching)، وتوجيه المهام بين النماذج (Routing)، والمعالجة بالدُفعات (Batching)، والتحكم في المخرجات. ونعتمد في ذلك على الأسعار المنشورة من Anthropic، وعلى نموذج تكلفة بلغة Python تستطيع تشغيله بأرقامك أنت. في حمل العمل الذي افترضناه، خفّض التخزين المؤقت وحده الفاتورة بنسبة 77%، بينما جعلها خطأ شائع واحد أغلى بنسبة 23% من عدم استخدام التخزين المؤقت أصلاً.

لماذا تنفجر فواتير الوكلاء؟

واجهة النموذج اللغوي لا تحتفظ بأي حالة بين الطلبات. في كل خطوة من حلقة الوكيل، ترسل المحادثة كاملة من جديد: تعليمات النظام، وتعريف كل أداة، وكل نتيجة أداة سابقة، وكل رد سابق. المهمة المكونة من 15 خطوة لا ترسل التعليمات مرة واحدة، بل 15 مرة، وكل نسخة أطول من التي قبلها.

خذ شكلاً واقعياً: بادئة من 12,000 توكن (تعليمات النظام مع تعريفات الأدوات)، ونتائج أدوات بحجم 1,500 توكن في كل خطوة، وردود بحجم 400 توكن. على مدى 15 خطوة، يكتب النموذج 6,000 توكن فقط، لكنه يقرأ 402,000 توكن من المدخلات. على Claude Opus 5.5 هذا يعني 1.61 دولار للمدخلات مقابل 0.12 دولار للمخرجات، أي أن 93% من الفاتورة هي إعادة قراءة السياق نفسه. (وأنظمة الوكلاء المتعددين تضاعف هذا أكثر؛ فقد قاست Anthropic حوالي 15 ضعف توكنات المحادثة. راجع وكيل واحد أم عدة وكلاء؟)

هذا الرقم يخبرك أين تبحث. أكبر التوفير لا يأتي من ردود أقصر، بل من عدم دفع السعر الكامل لإعادة قراءة بادئة رآها النموذج من قبل.

الوسيلة الأولى: التخزين المؤقت للتعليمات

التخزين المؤقت يحفظ الجزء الأول المعالَج من طلبك، فالطلبات التالية التي تبدأ بالمحتوى نفسه تقرؤه من الذاكرة المؤقتة بدل معالجته من جديد. وتوثيق Anthropic (راجعناه في 5 أكتوبر 2026) يحدد الأسعار كمضاعفات لسعر المدخلات العادي:

  • الكتابة في الذاكرة المؤقتة: 1.25 ضعف للذاكرة الافتراضية التي تدوم 5 دقائق، أو ضعفان للذاكرة التي تدوم ساعة.
  • القراءة منها: 0.1 من السعر في أغلب النماذج، وأقل في أحدثها. Claude Opus 5.5 يقرأ التوكنات المخزنة بسعر 0.20 دولار للمليون، مقابل 4 دولارات للمدخلات العادية: أي 5% فقط من السعر.

وتفعيله أصبح حقلاً واحداً. مع التخزين المؤقت التلقائي، تضيف حقلاً واحداً cache_control في أعلى الطلب، فتتحرك نقطة التخزين للأمام كلما طالت المحادثة، وهذا بالضبط شكل حلقة الوكيل:

response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=1024,
    cache_control={"type": "ephemeral"},  # automatic caching, 5-minute TTL
    system=SYSTEM_PROMPT,
    tools=TOOLS,
    messages=conversation,
)

أربع قواعد تحدد هل ستحصل فعلاً على قراءة من الذاكرة المؤقتة:

  • المطابقة تكون لبادئة متطابقة تماماً. القراءة من الذاكرة تحتاج محتوى متطابقاً حتى نقطة التخزين، بالترتيب tools ثم system ثم messages. وأي تغيير في مستوى يُبطل ذلك المستوى وكل ما بعده.
  • ضع كل ما يتغيّر في النهاية. مثال "الخطأ الشائع" في التوثيق نفسه هو وضع التاريخ والوقت في جزء يتغير مع كل طلب: تدفع ثمن كتابة جديدة كل مرة، ولا تحصل على أي قراءة.
  • حافظ على ثبات تعريفات الأدوات والإعدادات. تغيير تعريفات الأدوات يُبطل الذاكرة المؤقتة كلها، وتغيير tool_choice أو إضافة صور أو إزالتها، أو تغيير إعدادات التفكير أو الجهد في بعض النماذج، يُبطل جزءاً منها. ويحذّر التوثيق أيضاً من أن بعض اللغات (مثل Swift وGo) تغيّر ترتيب مفاتيح JSON عشوائياً، وهذا يكسر التخزين المؤقت بصمت.
  • التعليمات القصيرة لا تُخزَّن. لكل نموذج حد أدنى للطول، من 512 توكن في أحدث النماذج إلى 4,096 في بعض النماذج الأقدم. وبادئات الوكلاء تتجاوزه دائماً تقريباً.

والذاكرة المؤقتة معزولة لكل مساحة عمل (workspace)، ولا تُشارك أبداً بين المؤسسات. كما أن البادئات المخزنة تقلل زمن ظهور أول توكن، فالتخزين المؤقت يجعل الوكلاء أسرع وليس أرخص فقط.

شاهد الأرقام: نموذج تكلفة تستطيع تشغيله

السكربت التالي يحسب تكلفة مهمة وكيل واحدة في عدة إعدادات، بالأسعار المنشورة لكل مليون توكن. والدالة bill() تأخذ الحقول نفسها التي ترجعها الواجهة في response.usage (input_tokens وcache_creation_input_tokens وcache_read_input_tokens وoutput_tokens)، فتستطيع أيضاً تمرير ردود حقيقية من سجلاتك إليها. أنشئ الملف agent_cost.py:

"""What an agent run really costs, and what caching, routing and batching save.

Prices are USD per million tokens from Anthropic's pricing page (checked
2026-10-05). The workload is an assumption: change it to match your own logs.
`bill()` takes the same usage fields the API returns, so you can point it at
real responses too.
"""
PRICES = {  # input, 5-min cache write, cache read, output
    "claude-opus-5-5":   {"in": 4.00, "write": 5.00, "read": 0.20, "out": 20.00},
    "claude-sonnet-5-5": {"in": 2.00, "write": 2.50, "read": 0.20, "out": 10.00},
    "claude-haiku-4-5":  {"in": 1.00, "write": 1.25, "read": 0.10, "out": 5.00},
}

PREFIX = 12_000       # system prompt + tool definitions, identical on every call
TOOL_RESULT = 1_500   # tokens a tool returns per step
REPLY = 400           # tokens the model writes per step (tool call or answer)
STEPS = 15            # model calls per task


def bill(usage: dict, model: str) -> float:
    """Dollar cost of one API response, from its usage block."""
    p = PRICES[model]
    return (usage.get("input_tokens", 0) * p["in"]
            + usage.get("cache_creation_input_tokens", 0) * p["write"]
            + usage.get("cache_read_input_tokens", 0) * p["read"]
            + usage.get("output_tokens", 0) * p["out"]) / 1_000_000


def run_task(model: str, caching: bool, stable_prefix: bool = True) -> float:
    """Simulate one agent task: each step re-sends the whole conversation so far."""
    total, history, cached = 0.0, 0, 0
    for _ in range(STEPS):
        history += TOOL_RESULT
        prompt = PREFIX + history
        if not caching:
            usage = {"input_tokens": prompt}
        elif not stable_prefix:  # e.g. a timestamp at the top of the system prompt
            usage = {"cache_creation_input_tokens": prompt}  # rewrites everything, never reads
        else:  # automatic caching: read what was cached last call, write the new tail
            usage = {"cache_read_input_tokens": cached,
                     "cache_creation_input_tokens": prompt - cached}
            cached = prompt
        usage["output_tokens"] = REPLY
        total += bill(usage, model)
        history += REPLY
    return total


def main():
    tasks = 1_000  # per day
    opus = run_task("claude-opus-5-5", caching=False)
    rows = [
        ("Opus 5.5, no caching", opus),
        ("Opus 5.5, cache busted by timestamp", run_task("claude-opus-5-5", True, stable_prefix=False)),
        ("Opus 5.5, prompt caching", run_task("claude-opus-5-5", True)),
    ]
    # Routing: a cheap model classifies each task; 70% are routine and go to Sonnet.
    router = bill({"input_tokens": 800, "output_tokens": 10}, "claude-haiku-4-5")
    routed = router + 0.7 * run_task("claude-sonnet-5-5", True) + 0.3 * run_task("claude-opus-5-5", True)
    rows.append(("Caching + routing (70% to Sonnet 5.5)", routed))
    # Work that can wait (evals, backfills, nightly reports) can use the Batches API at 50% off.
    # Batch cache hits are best-effort, so show the range: full hits vs none at all.
    no_hits = router + 0.7 * run_task("claude-sonnet-5-5", False) + 0.3 * run_task("claude-opus-5-5", False)
    rows.append(("Routing + batch, cache hits as above", routed * 0.5))
    rows.append(("Routing + batch, zero cache hits", no_hits * 0.5))

    print(f"{'setup':<40}{'$/task':>10}{'$/month':>12}{'vs baseline':>13}")
    for name, cost in rows:
        print(f"{name:<40}{cost:>10.3f}{cost * tasks * 30:>12,.0f}{cost / opus - 1:>+13.0%}")


if __name__ == "__main__":
    main()

تشغيل python agent_cost.py أعطى (الأرقام الشهرية تفترض 1,000 مهمة يومياً):

setup                                       $/task     $/month  vs baseline
Opus 5.5, no caching                         1.728      51,840          +0%
Opus 5.5, cache busted by timestamp          2.130      63,900         +23%
Opus 5.5, prompt caching                     0.393      11,786         -77%
Caching + routing (70% to Sonnet 5.5)        0.282       8,447         -84%
Routing + batch, cache hits as above         0.141       4,223         -92%
Routing + batch, zero cache hits             0.562      16,861         -67%

ماذا يعلّمنا كل سطر:

  • التخزين المؤقت هو الوسيلة الكبرى: −77%. بعد الخطوة الأولى، تصبح أغلب المدخلات قراءة من الذاكرة بـ 5% من السعر. وتدفع علاوة الكتابة (1.25 ضعف) فقط على الجزء الجديد في نهاية كل خطوة.
  • الذاكرة المكسورة أسوأ من عدمها: +23%. مع وجود التاريخ والوقت في أول تعليمات النظام، كل خطوة تكتب السياق كاملاً بسعر 1.25 ضعف ولا تقرؤه أبداً. وهذا أكثر سبب شائع يجعل الفرق "تفعّل التخزين المؤقت" ثم ترى الفاتورة ترتفع.
  • التوجيه يضيف مكسباً أصغر: −84% إجمالاً. فائدته أقل مما تتوقع، لأن قراءة الذاكرة المؤقتة تكلّف 0.20 دولار للمليون في Sonnet 5.5 وOpus 5.5 على حد سواء. ما يوفره التوجيه هو تكلفة الكتابة في الذاكرة، والأهم: توكنات المخرجات.
  • الدُفعات تقسم الباقي إلى النصف، إذا بقيت القراءة من الذاكرة. خصم الدُفعات يجتمع مع خصم التخزين المؤقت، لكن القراءة من الذاكرة داخل الدُفعات غير مضمونة، لذلك الإجابة الصادقة هي نطاق: من −92% مع قراءة كاملة إلى −67% بدون أي قراءة.

هذا النموذج حساب على أسعار منشورة مع حمل عمل مفترض، وليس قياساً لأي فاتورة حقيقية. وقيمته أنك تستطيع استبدال ثوابت حمل العمل الخمسة بأرقام من سجلاتك، لترى أي وسيلة تهمك أنت. ونرفق أيضاً test_cost.py، الذي يقارن الحالة الأساسية بحساب يدوي.

الوسيلة الثانية: وجّه كل مهمة إلى أرخص نموذج يستطيع إنجازها

أغلب عمل الوكلاء ليس صعباً. الرد على سؤال عن حالة طلب، أو تعبئة نموذج من بريد إلكتروني، أو تصنيف تذكرة دعم، لا يحتاج أقوى نموذج. واستدعاء تصنيف صغير (في نموذجنا حوالي 800 توكن على Claude Haiku 4.5، أي جزء من السنت) يستطيع تحديد المهام الروتينية وإرسالها إلى نموذج أرخص.

  • وجّه المهمة كاملة، لا كل خطوة. إبقاء المهمة كلها على نموذج واحد يحافظ على محادثتها، وذاكرتها المؤقتة، في مكان واحد. أما تبديل النموذج في منتصف الحلقة فيضيّع البادئة المخزنة التي دفعت ثمن كتابتها.
  • وجّه بناءً على الأدلة. حدّد نسبة التقسيم بتشغيل النموذجين على عينة من المهام الحقيقية عبر مجموعة اختباراتك، لا بالحدس. (دليلنا عن اختبار الوكلاء بمقياس pass^k يشرح الطريقة.)
  • صعّد ولا تخمّن. إذا فشل النموذج الأرخص في فحص ما، أو أعلن ثقة منخفضة، أعد المهمة على النموذج الأقوى. بعض حالات التصعيد تكلف أقل من تشغيل كل شيء على النموذج الأعلى.

الوسيلة الثالثة: أرسل بالدُفعات كل ما يمكنه الانتظار

واجهة Message Batches من Anthropic تحاسب بنسبة 50% من الأسعار العادية، للمدخلات والمخرجات معاً. الدفعة الواحدة تتسع لحتى 100,000 طلب (256 ميجابايت)، وأغلبها ينتهي في أقل من ساعة، والحد الأقصى 24 ساعة، والنتائج تبقى متاحة 29 يوماً. وهذا يجعلها مناسبة تماماً للعمل الذي لا ينتظره مستخدم: التقارير الليلية، ومعالجة المستندات القديمة، وتصنيف أرشيف كامل، والأهم: تشغيل اختبارات وكيلك نفسه.

خصم الدُفعات وخصم التخزين المؤقت يجتمعان. لكن لأن طلبات الدُفعات تُنفَّذ بشكل غير متزامن ومتوازٍ، يصف التوثيق القراءة من الذاكرة المؤقتة داخلها بأنها "حسب الإمكان"، بنسب قراءة تتراوح عادة بين 30% و98% حسب نمط الطلبات. خطّط ميزانيتك على الطرف المتحفظ من نطاقنا حتى تُظهر سجلاتك النسبة الحقيقية.

الوسيلة الرابعة: تحكّم في المخرجات، أغلى توكن

توكنات المخرجات تكلف خمسة أضعاف المدخلات في نماذج Claude الحالية (20 دولاراً مقابل 4 للمليون في Opus 5.5). وهناك أداتان مهمتان:

  • معامل الجهد (effort). ضبط output_config.effort على low أو medium أو high أو xhigh أو max يخبر النماذج التي تدعمه بعدد التوكنات التي تصرفها، في النص واستدعاءات الأدوات والتفكير. الجهد الأقل يعني توكنات أقل، وردوداً أسرع، وتكلفة أقل، مع قدرة أقل على المسائل الصعبة. ولأن تغيير الجهد قد يُبطل الذاكرة المؤقتة في بعض النماذج، اختره لكل نوع من العمل، لا لكل استدعاء.
  • اطلب أقل. اطلب استدعاءات أدوات وإجابات نهائية مختصرة ومنظَّمة. العامل الذي يرجع ملخصاً من 200 توكن بدل 2,000 يوفّر في المخرجات الآن، وفي المدخلات في كل خطوة لاحقة.

الوسيلة الخامسة: أوقف نمو السياق

في النموذج السابق، كل خطوة تضيف 1,900 توكن تعيد كل خطوة لاحقة قراءتها. لذلك أي تقليص لهذا النمو يتضاعف أثره:

  • أرجِع أقل من الأدوات. صفِّ نتائج البحث، واختر الأعمدة المطلوبة فقط، واقتطع السجلات الطويلة قبل أن تدخل المحادثة.
  • أخرج المعلومات الدائمة من السياق. احفظها في أداة ذاكرة، وحمّل فقط ما تحتاجه الخطوة الحالية. (راجع كيف تعطي وكيلك ذاكرة.)
  • حمّل الأدوات عند الحاجة. تعريف كل أداة موجود في بادئة كل استدعاء. فإذا كان لدى الوكيل عشرات الأدوات، اعرض فقط ما تحتاجه المهمة الحالية.

قِس، وإلا ستنحرف التكلفة

مشاكل التكلفة تعود عادة بهدوء: شخص يضيف التاريخ إلى تعليمات النظام، أو يعيد ترتيب الأدوات، أو يغيّر إعداداً، فتنخفض نسبة القراءة من الذاكرة المؤقتة دون أي رسالة خطأ. سجّل حقول الاستخدام الأربعة لكل استدعاء، واحسب الدولارات بدالة مثل bill()، وتابع نسبة واحدة: توكنات القراءة من الذاكرة مقسومة على إجمالي المدخلات. في حلقة وكيل سليمة يجب أن تكون عالية وثابتة. وإذا انخفضت بعد نشر تحديث، فقد وجدت المشكلة قبل أن تجدها الفاتورة.

الخلاصة

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

المصادر: توثيق منصة Claude من Anthropic: صفحات Pricing وPrompt caching وBatch processing وEffort (راجعناها في 2026-10-05)؛ مدونة Anthropic الهندسية، "How we built our multi-agent research system" (13 يونيو 2025). جرى اختبار الكود بتاريخ 2026-10-05 على Python 3.13. التكاليف محسوبة من الأسعار المعلنة مع حمل عمل مفترض؛ وهي توضح أثر كل وسيلة وليست قياساً لأي فاتورة حقيقية. الأسعار تتغير، فتحقق منها قبل وضع الميزانية.

مقالات ذات صلة