פוסט
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.