פוסט

Temperature, top-p והזיות

איך נבחר הטוקן הבא, מה עושים temperature ו-top-p, למה מודלי Claude הנוכחיים כבר לא מקבלים אותם, ולמה מודלים הוזים.

שתי הסימולציות הורצו עם Python 3.9 והפלט שלהן אמיתי. העובדות על ה-API מבוססות על מדריך המעבר ל-Claude Opus 5.5 ועל המדריך לצמצום הזיות.

Temperature

המודל מחשב קודם ציון גולמי (logit) לכל טוקן. פונקציה שנקראת softmax הופכת את הציונים להסתברויות. Temperature מחלקת את הציונים לפני ה-softmax:

  • temperature נמוכה (מתחת ל-1) מחדדת את ההתפלגות: הטוקן הסביר נעשה סביר עוד יותר.
  • temperature גבוהה (מעל 1) משטיחה אותה: גם טוקנים לא סבירים מקבלים סיכוי אמיתי.

סימולציה עם ארבעה טוקנים מועמדים:

import math

logits = {"Paris": 5.0, "Lyon": 2.0, "Nice": 1.5, "banana": -1.0}

def softmax(scores, temperature):
    scaled = {tok: s / temperature for tok, s in scores.items()}
    top = max(scaled.values())
    exps = {tok: math.exp(s - top) for tok, s in scaled.items()}
    total = sum(exps.values())
    return {tok: e / total for tok, e in exps.items()}

for t in (0.5, 1.0, 2.0):
    probs = softmax(logits, t)
    row = "  ".join(f"{tok}={p:.3f}" for tok, p in probs.items())
    print(f"T={t}: {row}")
T=0.5: Paris=0.997  Lyon=0.002  Nice=0.001  banana=0.000
T=1.0: Paris=0.924  Lyon=0.046  Nice=0.028  banana=0.002
T=2.0: Paris=0.691  Lyon=0.154  Nice=0.120  banana=0.034

ב-T=2.0 “banana” מקבלת כ-3 אחוזים: מכאן תשובות “יצירתיות”, וגם שטויות.

Top-p ו-top-k

שני כפתורים נוספים מקצצים את רשימת המועמדים לפני הבחירה:

  • top-k משאיר רק את k הטוקנים הסבירים ביותר.
  • top-p (nucleus sampling) משאיר את הקבוצה הקטנה ביותר של טוקנים שסכום ההסתברויות שלהם הוא לפחות p.
probs = {"Paris": 0.70, "Lyon": 0.15, "Nice": 0.10, "banana": 0.05}

def top_p(probs, p):
    kept, total = {}, 0.0
    for tok, prob in sorted(probs.items(), key=lambda kv: kv[1], reverse=True):
        kept[tok] = prob
        total += prob
        if total >= p:
            break
    return list(kept)

print(top_p(probs, 0.8))
print(top_p(probs, 0.95))
['Paris', 'Lyon']
['Paris', 'Lyon', 'Nice']

עם p=0.8, “Nice” ו-“banana” לא ייבחרו אף פעם, לא משנה כמה גבוהה ה-temperature.

מודלי Claude הנוכחיים: מכוונים דרך ה-prompt

במודלים ו-API אחרים רבים, ובמודלי Claude ישנים, מגדירים את הפרמטרים האלה בכל בקשה; במודלי Claude הנוכחיים ברוב המקרים לא. לפי מדריך המעבר, ערך שאינו ברירת המחדל ל-temperature, top_p או top_k ב-Claude Opus 4.7 ובמודלים שאחריו מחזיר שגיאת 400, וה-SDK של Python מגרסה 1.0 בכלל לא מקבל אותם. המדריך גם מציין ש-temperature = 0 “אף פעם לא הבטיח פלט זהה”.

מה בא במקומם:

  • ה-prompt. בקשו את הסגנון שאתם רוצים: “ענה במשפט קצר אחד”, “תן שלושה רעיונות שונים”.
  • Effort. output_config={"effort": "low"} גורם למודל להשקיע פחות טוקנים, ורמות גבוהות יותר גורמות לו להיות יסודי יותר. הפוסט על מודלי חשיבה מסביר את זה.
  • פלט מובנה, כשצריך פורמט מדויק. מוסבר בעוד שני פוסטים.

את הכפתורים האלה עוד תפגשו במודלים מקומיים בהמשך הסדרה.

למה מודלים הוזים

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

הזיות נפוצות יותר כשהתשובה לא נמצאת בנתוני האימון (אירוע חדש, מסמך פרטי, פרט נדיר) וכשה-prompt דוחף לענות בכל מקרה.

צמצום הזיות

המדריך הרשמי מונה טכניקות שעובדות היום:

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

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