المستوى: محترف. المقال ده موجّه لمن يبني تطبيقات production على Claude API ويفكر في تفعيل Extended Thinking لمهام reasoning ثقيلة. لو لسه بتجرّب أول prompt على الـ API، خد بالك إن المحتوى ده بيفترض إنك فاهم أساسيات messages API وحساب التكلفة بالـ tokens.
Extended Thinking في Claude 4.7: متى الـ 8 أضعاف توكن يستحق الفاتورة
لو شغّلت Extended Thinking على كل request في تطبيقك، فاتورتك بتتضرب في 6 إلى 8 — وفي 70% من الحالات مكنتش محتاج reasoning أصلاً. اللي بيحصل فعلاً إن الميزة دي بترفع دقة المهام المنطقية المعقدة من 71% لـ 89%، لكنها بتضيف 4-9 ثواني latency و 8x زيادة في الـ output tokens. القرار مش "شغّلها أو لا" — القرار "إمتى وعلى أي نوع طلب".
المشكلة باختصار
Extended Thinking ميزة في Claude 3.7 Sonnet والعائلة الجديدة Claude 4 (Opus 4.7 و Sonnet 4.6) بتخلّي النموذج "يفكّر" داخليًا قبل ما يكتب الرد النهائي. التفكير ده بيظهر في حقل thinking blocks منفصل عن الـ output العادي، ومدفوع بنفس سعر الـ output tokens. لو شغلتها على كل API call بدون تمييز، الفاتورة بتطلع برّه السيطرة وانت لسه بتشحن.
تخيّل الفكرة بمثال بسيط (للتقريب)
تخيّل إنك بتسأل صديقك المهندس سؤال. لو السؤال "كام الساعة؟" هيرد عليك في ثانية. لو السؤال "إزاي أحسّن أداء الـ database query اللي بياخد 12 ثانية؟" هيقعد دقيقة يفكر، يرسم على ورقة، يجرب احتمالين، وبعدين يرد. التفكير ده له تكلفة — وقت ومجهود. النموذج بنفس المنطق: لمّا تعطيه مهمة معقدة، التفكير الداخلي بيرفع جودة الإجابة لكنه بيكلّف وقت وفلوس.
التعريف الدقيق علميًا
Extended Thinking هو ما يُعرف في الأبحاث بـ Chain-of-Thought reasoning مفعّل على مستوى النموذج (model-side CoT). بدل أن يولّد النموذج الرد مباشرة من السؤال (Direct Generation)، يولّد أولًا تسلسلًا من الـ tokens يمثّل خطوات منطقية داخلية، ثم يبني الرد النهائي معتمدًا عليها. الفكرة موثّقة في ورقة Wei et al. 2022 "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models"، وتم تطويرها لاحقًا في DeepSeek-R1 (2025) و OpenAI o1 (2024). Anthropic طبّقت الفكرة بحيث تكون قابلة للتحكم عبر معامل budget_tokens اللي بيحدّد سقف عدد tokens التفكير المسموح بيها.
كود تشغيل فعلي
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-7",
max_tokens=8000,
thinking={
"type": "enabled",
"budget_tokens": 4000
},
messages=[{
"role": "user",
"content": "عندي SQL query بياخد 14 ثانية على جدول 50M صف. حلّلت الـ EXPLAIN ولقيت seq scan على عمود user_id. الـ index موجود لكن مش مستخدم. ليه؟"
}]
)
for block in response.content:
if block.type == "thinking":
print(f"[تفكير داخلي: {len(block.thinking)} حرف]")
elif block.type == "text":
print(block.text)
print(f"thinking tokens: {response.usage.thinking_tokens}")
print(f"output tokens: {response.usage.output_tokens}")