أساسيات LLM للمقابلات
اقتصاديات الرموز وتحسين التكلفة
لماذا هذا مهم للمقابلات
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 النصوص:
الخوارزمية:
- ابدأ بمفردات على مستوى الأحرف
- ابحث عن الزوج الأكثر تكراراً من الرموز
- ادمج الزوج في رمز جديد
- كرر حتى الوصول لحجم المفردات (عادةً 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 لكل محادثة
استراتيجيات التحسين:
- تخزين أمر النظام مؤقتاً (خصم 90%): ✅ نفعل ذلك بالفعل
- تقليل رموز الإخراج بنسبة 20%:
assistant_tokens_per_message=160 # 200 → 160 # التكلفة الشهرية الجديدة: $684 (وفورات 20%) - التبديل إلى 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.
:::