یک تیم فنی در شرکت بیمهای در تهران، ایجنتی ساخته بود که کار کارشناس صدور را سبک کند: مشتری شماره بیمهنامه میداد، ایجنت اول از سامانهٔ سوابق، تاریخچهٔ خسارت را میگرفت، بعد از سرویس تعرفه، نرخ روز را میخواند و در پایان یک پیشنهاد قیمت با توضیح مینوشت. همهچیز کار میکرد تا روزی که تصمیم گرفتند تفکر گسترده را روشن کنند تا استدلال مدل پیش از هر فراخوانی ابزار قابل بازبینی باشد. اولین درخواست سالم اجرا شد؛ اما لحظهای که نتیجهٔ سامانهٔ سوابق را به مدل برگرداندند، کل زنجیره با خطای ۴۰۰ خوابید. کد عوض نشده بود، ابزارها همان بودند، فقط یک پارامتر اضافه شده بود.
این خطا، رایجترین سنگی است که جلوی پای هر کسی میافتد که تفکر گسترده را با ابزار ترکیب میکند؛ و ریشهاش یک تصمیم طراحی است، نه یک باگ. در این درس دقیقاً همان قاعده را باز میکنیم: وقتی مدل اجازهٔ فکرکردن پیدا میکند، آن فکر دیگر یک متن تزئینی نیست؛ بخشی از قرارداد گفتوگوست و اگر آن را دور بریزی، ادامهٔ گفتوگو نامعتبر میشود.
لیست مطالب
آنچه در این درس یاد میگیرید
- چرا بلوک فکر در حالت ابزار، یک سند امضاشده است و نه خروجی نمایشی
- متن دقیق خطای ۴۰۰ و اینکه هر جملهٔ آن چه چیزی را لو میدهد
- الگوی درست ساخت تاریخچهٔ گفتوگو در حلقهٔ چندمرحلهای ابزار
- بلوک فکر پنهانشده و چرا باید چیزی را نگه داری که خودت نمیتوانی بخوانی
- قاعدهٔ «پس از نتیجهٔ ابزار، فکر تازهای نمیبینی» و اثرش بر طراحی گردشکار
- تنظیم بودجهٔ فکر، شمارش توکن و معیار تصمیم برای روشنکردن این حالت

بلوک فکر چیست و چرا نمیشود حذفش کرد
وقتی تفکر گسترده را روشن میکنی، پاسخ مدل دیگر یک بلوک متنی ساده نیست. مدل چند بلوک برمیگرداند که هرکدام نوع مشخصی دارند: بلوک thinking که استدلال خوانا را در خود دارد، احتمالاً یک بلوک text، و اگر قرار باشد ابزاری صدا زده شود، بلوک tool_use. نکتهٔ کلیدی اینجاست که بلوک فکر یک صفت به نام امضا هم دارد؛ یک رشتهٔ رمزنگاریشده که تأیید میکند این استدلال واقعاً در همین زمینه و همین گفتوگو تولید شده است.
حالا تصور کن در گام بعد، فقط بلوک tool_use را به تاریخچه برگردانی و بلوک فکر را دور بریزی. از دید سرویس، تو داری ادعا میکنی مدل بدون هیچ استدلالی مستقیم به فراخوانی ابزار رسیده است؛ یعنی زمینهای که امضا آن را تأیید میکرد، دیگر وجود ندارد. پاسخ، رد درخواست است:
Error code: 400 - {'type': 'error', 'error': {'type': 'invalid_request_error',
'message': 'messages.1.content.0.type: Expected `thinking` or `redacted_thinking`,
but found `tool_use`. When `thinking` is enabled, a final `assistant` message must
start with a thinking block (preceeding the lastmost set of `tool_use` and
`tool_result` blocks). We recommend you include thinking blocks from previous turns...'}}
این پیام سه چیز را روشن میگوید: اول اینکه انتظار میرفته بلوک اول از نوع فکر باشد؛ دوم اینکه پیام پایانی نقش دستیار باید با بلوک فکر شروع شود؛ و سوم اینکه بلوکهای فکر دورهای قبل هم باید در تاریخچه بمانند. یعنی این یک اعتبارسنجی سختگیرانه است، نه یک هشدار قابل چشمپوشی.
الگوی درست: تاریخچه را کامل بساز
راهحل ساده است اما باید عادت شود: هر بار که پاسخ مدل را میگیری، همهٔ بلوکهای معنادار را یکجا نگه دار و همانها را بهعنوان محتوای نقش دستیار برگردان. کد پایه چنین شکلی دارد:
MODEL_NAME = "claude-sonnet-4-6"
MAX_TOKENS = 4000
THINKING_BUDGET_TOKENS = 2000
response = client.messages.create(
model=MODEL_NAME,
max_tokens=MAX_TOKENS,
thinking={"type": "enabled", "budget_tokens": THINKING_BUDGET_TOKENS},
tools=tools,
messages=[{"role": "user", "content": "نرخ روز و سوابق خسارت این بیمهنامه را بگیر"}]
)
# هر سه نوع بلوک باید حفظ شوند
assistant_blocks = [
b for b in response.content
if b.type in ["thinking", "redacted_thinking", "tool_use"]
]
و در حلقهٔ چندمرحلهای، همین کار در هر دور تکرار میشود. توجه کن که تاریخچه هرگز بازنویسی نمیشود؛ فقط به آن اضافه میشود:
تا اینجا مقدمه بود. بخش اصلی این درس — نمونهها، پرامپتهای آماده و تمرینها — برای اعضای ویژه باز میشود.
تفکر گسترده همراه ابزار در کلود؛ چرا بلوک فکر را نباید دور بریزی
برای دیدن این بخش باید عضو ویژه (VIP) باشی. با شمارهٔ موبایلت وارد شو تا ۱۴ روز دسترسی رایگان فعال شود.
🎁 ورود / ثبتنام و شروع ۱۴ روز رایگان