פוסט

מודלי חשיבה: לחשוב לפני שעונים

מה זו חשיבה (thinking), איך adaptive thinking ופרמטר ה-effort שולטים בה, איך קוראים בלוקי חשיבה, וכמה זה עולה.

מודל שעונה במעבר אחד צריך לדייק כבר מהטוקן הראשון. מודלי חשיבה (reasoning models) עובדים קודם על הבעיה, ורק אז כותבים את התשובה.

העובדות והקוד מבוססים על התיעוד הרשמי של thinking ושל effort. הקוד לא הורץ בשביל הפוסט, ולכן בלוק הפלט הוא פלט לדוגמה.

מה זו חשיבה

עם חשיבה, המודל כותב את דרך הפתרון לפני התשובה: הוא מנסח מחדש את הבעיה, מנסה גישות, בודק תוצאות ביניים ונוטש כיוונים שלא מחזיקים. התיעוד מסביר שזו הסיבה שחשיבה עוזרת במתמטיקה, בקוד, בניתוח ובמשימות סוכן ארוכות: האיכות תלויה בעבודת ביניים שאחרת הייתה מדולגת.

החשיבה מגיעה בבלוקים נפרדים מסוג thinking, לפני בלוקי ה-text של התשובה. שתי עובדות על העלות חשובות:

  • טוקני חשיבה מחויבים כטוקני פלט, גם כשטקסט החשיבה לא מוצג לכם.
  • הם נספרים בתוך max_tokens, יחד עם התשובה. max_tokens קטן מדי יכול לקטוע את התשובה.

Adaptive thinking ו-effort

במודלים הנוכחיים המודל עצמו מחליט מתי וכמה לחשוב. התיעוד קורא לזה adaptive thinking. ב-Claude Opus 5.5, Sonnet 5.5, Haiku 5.5 ו-Fable 5.1 זה פועל כברירת מחדל ולא דורש הגדרה. ב-Opus 5.5 אי אפשר לכבות את זה בכלל.

הבקרה העיקרית היא effort, שמוגדר ב-output_config. הוא מקבל low, medium, high, xhigh ו-max (לא כל רמה בכל מודל). התיעוד מתאר אותו כ"אות התנהגותי, לא תקציב טוקנים קשיח": ב-effort נמוך המודל חושב פחות ועונה מהר וזול יותר, וב-effort גבוה הוא חושב יותר ונוטה להיות יסודי יותר. ה-effort משפיע על כל הפלט, כולל קריאות לכלים, ולא רק על החשיבה. ברירת המחדל היא medium ב-Opus 5.5 וב-Haiku 5.5, ו-high בשאר המודלים.

לראות את החשיבה

במודלים הנוכחיים טקסט החשיבה מוסתר כברירת מחדל (display: "omitted"): הבלוקים מגיעים, אבל שדה ה-thinking שלהם ריק. כדי לראות אותו, בקשו את זה במפורש עם display: "summarized":

import anthropic

client = anthropic.Anthropic()

message = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=16000,
    thinking={"type": "adaptive", "display": "summarized"},
    output_config={"effort": "high"},
    messages=[{"role": "user", "content": "Is 1001 a prime number? Answer yes or no."}],
)

for block in message.content:
    if block.type == "thinking":
        print("THINKING:", block.thinking)
    elif block.type == "text":
        print("ANSWER:", block.text)
THINKING: Check small divisors. 1001 / 7 = 143, and 143 = 11 x 13, so 1001 = 7 x 11 x 13.
ANSWER: No. 1001 = 7 x 11 x 13.

מה שאתם רואים הוא סיכום של החשיבה, שנכתב על ידי מודל אחר. לפי התיעוד, אף הגדרה לא מחזירה את שרשרת המחשבה הגולמית.

חשיבה וכלים

כשמודל חושב ואז קורא לכלי, צריך לשלוח בחזרה את בלוק החשיבה בלי שינוי, יחד עם תוצאת הכלי. כל בלוק נושא שדה signature, והתיעוד אומר שה-API דוחה בלוקי חשיבה ששונו. בפועל: כשבונים את הבקשה הבאה, מעתיקים את רשימת ה-content של ה-assistant כמו שהיא חזרה. הפוסט על כלים מראה את הלולאה המלאה.

מתי להעלות או להוריד את ה-effort

  • משימות פשוטות כמו סיווג, חילוץ או צ’אט קצר: low או medium.
  • חשיבה קשה, באגים מסובכים, משימות סוכן ארוכות: high ומעלה, עם max_tokens גדול.
  • אל תנחשו: התיעוד ממליץ להריץ “effort sweep” על סט הבדיקות שלכם ולבחור את הרמה הנמוכה ביותר ששומרת על האיכות. הפוסט על evals בהמשך הסדרה מראה איך.