أساسيات LLM للمقابلات

اقتصاديات الرموز وتحسين التكلفة

5 دقيقة للقراءة

لماذا هذا مهم للمقابلات

OpenAI، Anthropic، Meta تطرح أسئلة صريحة حول اقتصاديات الرموز في مقابلات L5-L6:

سؤال المقابلة الحقيقي (Anthropic):

"تقوم ببناء chatbot لدعم العملاء. كل محادثة متوسطها 20 رسالة. كيف ستحسّن تكاليف الرموز مع الحفاظ على الجودة؟ اشرح لي الحساب."

سؤال المقابلة الحقيقي (Meta):

"فاتورة LLM API الخاصة بك $50K/شهر. لديك 1M مستخدم. كيف ستقلل التكاليف بنسبة 50% دون تقليل تجربة المستخدم؟"

فهم الرموز = المال حاسم لهندسة LLM الإنتاجية.


ما هو الرمز؟ (وحدة الحساب)

ليس كلمة! الرمز هو وحدة فرعية للكلمة.

أمثلة (GPT-5.2 BPE tokenizer):

النص الرموز العدد
"Hello, world!" ["Hello", ",", " world", "!"] 4
"Tokenization" ["Token", "ization"] 2
"GPT-5.2" ["G", "PT", "-", "5", ".", "2"] 6
"مرحبا" (عربي) ["Ù…", "ر", "Ø­", "ب", "ا"] 5
"你好" (صيني) ["ä½", "好"] 2

القاعدة الرئيسية: 1 رمز ≈ 4 أحرف بالإنجليزية، ولكن يختلف حسب اللغة.


تقسيم BPE (Byte-Pair Encoding)

كيف يقسّم GPT-5.2، Claude 4.5، Llama 3.3 النصوص:

الخوارزمية:

  1. ابدأ بمفردات على مستوى الأحرف
  2. ابحث عن الزوج الأكثر تكراراً من الرموز
  3. ادمج الزوج في رمز جديد
  4. كرر حتى الوصول لحجم المفردات (عادةً 50K-200K)

تطور نافذة السياق

التطور التاريخي

السنة النموذج نافذة السياق ما تغير
2020 GPT-3 2K رمز الخط الأساسي
2023 GPT-4 Turbo 128K رمز زيادة 64x!
2024 Claude 3 Opus 200K رمز جاهز للإنتاج
2025 GPT-5 128K-1M رمز خليط من أحجام النوافذ
2026 GPT-5.2 128K رمز (قياسي) محسّن للسرعة
2026 Claude Sonnet 4.5 200K (1M بيتا) سياق ممتد
2026 Gemini 3 Pro 1M رمز أكبر نافذة إنتاجية

سؤال المقابلة: "لماذا نحتاج نوافذ سياق تتجاوز 100K رمز؟"

إجابة قوية:

"التطبيقات الواقعية تحتاج سياق طويل:

  • الكود: سياق المستودع بالكامل (50K-200K رمز)
  • القانوني: العقود الكاملة + التعديلات (100K+ رمز)
  • البحث: أوراق متعددة لمراجعة الأدبيات (200K+ رمز)
  • دعم العملاء: تاريخ المحادثة الكامل عبر الجلسات (50K+ رمز)

النوافذ الأكبر تقلل الحاجة لـ RAG/الاسترجاع، مما يحسّن الكمون والدقة."


تسعير الرموز (يناير 2026)

التسعير لكل 1M رمز

النموذج الإدخال الإخراج الإدخال المخزن مؤقتاً حالة الاستخدام
GPT-5.2 $1.75 $14.00 $0.175 (خصم 90%) عام
GPT-4 Turbo $5.00 $15.00 قديم
Claude Opus 4.5 $15.00 $75.00 تفكير متميز
Claude Sonnet 4.5 $3.00 $15.00 $0.60 (خصم 80% >200K) إنتاج
Claude Haiku 3.5 $1.00 $5.00 حجم كبير
Gemini 3 Pro $2.50 $10.00 $0.50 (خصم 80%) فعال من حيث التكلفة
DeepSeek R1 $0.55 $2.19 خيار ميزانية

الملاحظات الرئيسية:

  • رموز الإخراج تكلف 5-10x رموز الإدخال (التوليد مكلف)
  • المدخلات المخزنة مؤقتاً توفر 80-90% (حاسم للـ chatbots مع أوامر النظام)
  • DeepSeek R1 أرخص 3x من GPT-5.2 (ترخيص MIT، قابل للاستضافة الذاتية)

أمثلة حساب التكلفة

مثال 1: Chatbot دعم العملاء

السيناريو:

  • أمر النظام: 500 رمز (مخزن مؤقتاً)
  • متوسط المحادثة: 10 رسائل
  • متوسط الرسالة: 50 رمز مستخدم + 200 رمز مساعد
  • 1,000 محادثة/يوم

حساب التكلفة (GPT-5.2):

def calculate_chatbot_cost(
    system_prompt_tokens=500,
    messages_per_conversation=10,
    user_tokens_per_message=50,
    assistant_tokens_per_message=200,
    conversations_per_day=1000,
    model="gpt-5.2"
):
    """
    حساب تكاليف chatbot الشهرية.
    """
    # التسعير (لكل 1M رمز)
    pricing = {
        "gpt-5.2": {
            "input": 1.75,
            "output": 14.00,
            "cached_input": 0.175,
        },
        "claude-sonnet-4.5": {
            "input": 3.00,
            "output": 15.00,
            "cached_input": 0.60,
        },
    }

    p = pricing[model]

    # الرموز لكل محادثة
    cached_system_prompt = system_prompt_tokens  # مرة لكل محادثة
    input_tokens = messages_per_conversation * user_tokens_per_message
    output_tokens = messages_per_conversation * assistant_tokens_per_message

    # التكلفة لكل محادثة
    cost_per_conversation = (
        (cached_system_prompt / 1_000_000) * p["cached_input"] +  # أمر النظام
        (input_tokens / 1_000_000) * p["input"] +                 # رسائل المستخدم
        (output_tokens / 1_000_000) * p["output"]                 # رسائل المساعد
    )

    # التكلفة الشهرية (30 يوم)
    monthly_cost = cost_per_conversation * conversations_per_day * 30

    return {
        "cost_per_conversation": cost_per_conversation,
        "daily_cost": cost_per_conversation * conversations_per_day,
        "monthly_cost": monthly_cost,
        "tokens_per_conversation": cached_system_prompt + input_tokens + output_tokens,
    }

# الحساب
result = calculate_chatbot_cost()
print(f"التكلفة لكل محادثة: ${result['cost_per_conversation']:.4f}")
print(f"التكلفة الشهرية: ${result['monthly_cost']:.2f}")

الإخراج:

التكلفة لكل محادثة: $0.0285
التكلفة الشهرية: $855.00

التفصيل:
- أمر النظام المخزن مؤقتاً (500 رمز): $0.0001 لكل محادثة
- رموز الإدخال (500 رمز): $0.0009 لكل محادثة
- رموز الإخراج (2000 رمز): $0.0280 لكل محادثة

استراتيجيات التحسين:

  1. تخزين أمر النظام مؤقتاً (خصم 90%): ✅ نفعل ذلك بالفعل
  2. تقليل رموز الإخراج بنسبة 20%:
    assistant_tokens_per_message=160  # 200 → 160
    # التكلفة الشهرية الجديدة: $684 (وفورات 20%)
    
  3. التبديل إلى Claude Haiku 3.5 للاستعلامات البسيطة:
    # 70% من الاستعلامات بسيطة (توجيه إلى Haiku)
    # 30% معقدة (استخدام GPT-5.2)
    # التكلفة الشهرية الجديدة: $427 (وفورات 50%)
    

استراتيجيات ميزانية الرموز

1. اقتطاع السياق الديناميكي

def truncate_context(messages, max_tokens=120_000, reserve_for_output=4_000):
    """
    اقتطاع ذكي لتاريخ المحادثة ليتناسب مع نافذة السياق.
    يُستخدم في chatbots الإنتاجية.
    """
    import tiktoken

    enc = tiktoken.encoding_for_model("gpt-5")
    available_tokens = max_tokens - reserve_for_output

    # الاحتفاظ دائماً بأمر النظام + آخر 3 رسائل
    system_prompt = messages[0]
    recent_messages = messages[-3:]

    # ملء الوسط بالرسائل القديمة (FIFO)
    middle_messages = messages[1:-3]

    # عد الرموز
    system_tokens = len(enc.encode(system_prompt["content"]))
    recent_tokens = sum(len(enc.encode(m["content"])) for m in recent_messages)

    used_tokens = system_tokens + recent_tokens
    remaining_tokens = available_tokens - used_tokens

    # إضافة رسائل قديمة حتى نفاد الميزانية
    included_middle = []
    for message in reversed(middle_messages):  # البدء من الأحدث
        msg_tokens = len(enc.encode(message["content"]))
        if used_tokens + msg_tokens <= available_tokens:
            included_middle.insert(0, message)
            used_tokens += msg_tokens
        else:
            break

    final_messages = [system_prompt] + included_middle + recent_messages

    return final_messages, used_tokens

# مثال الاستخدام:
messages = [
    {"role": "system", "content": "أنت مساعد مفيد."},
    # ... 100 رسالة من التاريخ ...
]

truncated, token_count = truncate_context(messages, max_tokens=128_000)
print(f"مقتطع إلى {len(truncated)} رسالة ({token_count} رمز)")

أسئلة المقابلة الشائعة والإجابات

س1: "لماذا تكلف رموز الإخراج أكثر من رموز الإدخال؟"

الإجابة:

"رموز الإخراج تتطلب توليد انحداري تلقائي - كل رمز يعتمد على جميع الرموز السابقة. لإخراج 100 رمز، النموذج يقوم بـ 100 تمريرة أمامية (1 + 2 + ... + 100 = 5,050 حساب رمز مع KV-cache، أو 100 × 100 = 10,000 بدونه). رموز الإدخال تُعالج بالتوازي في تمريرة أمامية واحدة. بالإضافة لذلك، توليد الإخراج يستخدم العينات (temperature، top-p)، مما يضيف حساب."


النقاط الرئيسية للمقابلات

اعرف التسعير: احفظ تكاليف أفضل 3-4 نماذج (GPT-5.2، Claude، Gemini) ✅ احسب التكاليف: كن مستعداً لتقدير $/محادثة أو $/شهر على السبورة ✅ حسّن بلا رحمة: التخزين المؤقت، الاقتطاع، تتالي النماذج، الضغط الدلالي ✅ افهم المقايضات: الجودة مقابل التكلفة، الكمون مقابل نافذة السياق ✅ صحح بشكل منهجي: توزيع استخدام الرموز → تحديد الارتفاع → إصلاح عدم الكفاءة

الخطوة التالية: تعلم كيفية التحكم في مخرجات LLM باستخدام استراتيجيات العينات في الوحدة 1، الدرس 3.

:::

اختبار

الوحدة 1: أساسيات LLM للمقابلات

خذ الاختبار