קופיילוט שנותן רמזים טובים משלך — בעזרת וקטורים, קצת גאומטריה, וללא מודל שפה גנרטיבי בזמן הריצה. זו הצלילה לעומק: למה זו בכלל בעיית דמיון סמנטי, איך בוחרים את הרמז, ולמה דווקא עברית הקשתה.
ב"שם קוד" רב המרגלים נותן מילה אחת ומספר, והצוות מנחש את הקלפים שלו — בלי לגעת בקלפים של היריב, בניטרליים, ובמיוחד לא במתנקש.
כל מילה הופכת לווקטור — נקודה במרחב רב־ממדי. המנוע מחבר וקטור fastText בן 300 ממדים עם וקטור Numberbatch בן 300 ממדים, במשקלים 70% ו־30%, ו"קרבה במשמעות" היא פשוט מרחק בין נקודות. רמז טוב הוא המילה הכי קרובה למילים שלך והכי רחוקה מכל השאר.
כל מילה־מועמדת מקבלת בונוס על קרבה למילים שלך, וקנס שגדל ככל שהיא מתקרבת ליריב, לניטרלי, ובעיקר למתנקש. s′ הוא קוסינוס ממורכז סביב 25 מילות הלוח, כדי שמילים נפוצות ש"קרובות לכולם" לא ינצחו:
g(c) = team_safe(c) // up to m safe team words — reward
− λₐ · max(0, s′(c, assassin)) // the black card — avoid hardest
− λₒ · max(0, max s′(c, opp)) // rival team — avoid strongly
− λₙ · max(0, max s′(c, neutral))// bystanders — avoid mildly
+ λ_f · FREQ(c) // prefer mid-frequency words
− λ_soft · P(danger | c) // listener mass on assassin, opponent, ½·neutral
where s′(c, w) = cos(c, w) − mean_b cos(c, b)team_safe סופר רק מילות קבוצה שמדורגות מעל כל מילה זרה. הקנסות מדורגים, λₐ ≫ λₒ > λₙ,
כך שהמנוע "מפחד" מהמתנקש הרבה יותר מקלף ניטרלי.
האיבר האחרון בא מ־RSA (Rational Speech Acts): המנוע ממדל את המנחש כ־softmax על
הדמיון של הרמז לכל 25 הקלפים, ומעניש לפי מסת ההסתברות שנוחתת על המתנקש, על קלפי היריב, ובחצי משקל על הניטרליים (גם הם מסיימים את התור). כך רמז שקרוב
למתנקש עדיין בטוח, אם מילות הקבוצה מושכות חזק יותר.
"שם קוד" דורש אסוציאטיביות (מלך→כתר→טירה), לא נרדפוּת, ווקטורים סטטיים מבוססי הופעה־משותפת לוכדים בדיוק את זה. מודלי סנטנס־אמבדינג דוחסים מילה בודדת לטווח קוסינוסים צר (Qwen3-Embedding בקושי הבדיל בין "מלך·מלכה" ל"מלך·ים"), ועל הלוח אין הקשר שמודל קונטקסטואלי יוכל לנצל. על 100 לוחות, ה־blend ו־fastText לבדו יצאו שקולים, בתוך טווח הרעש.
ה־blend משרשר את וקטורי fastText ו־Numberbatch המנורמלים, מוכפלים ב־0.7 וב־0.3. המשקלים חלים על הווקטורים ולא על הקוסינוסים, ולכן הקוסינוס המשותף הוא בערך 84.5% fastText ו־15.5% Numberbatch (0.49 מול 0.09).
בזמן המשחק אין LLM גנרטיבי: הווקטורים מחושבים מראש, ההסקה רצה על CPU, וכל רמז עובר בדיקות חוקיות דטרמיניסטיות. מודלי שפה שימשו רק במחקר, בבניית אוצר המילים ובהערכה.
הרצנו את DictaLM 2.0 (12B) כנותן רמזים על אותם לוחות, מול המנוע. השופט הוא מנחש עצמאי (fastText + Qwen3-Embedding) שתוקף מול הצבעות 👍/👎 אמיתיות (AUC 0.74). רמז לא חוקי מקבל 0.
| נותן רמזים | רמזים חוקיים | קלפים לרמז | ניחוש הקלף השחור | זמן לרמז |
|---|---|---|---|---|
| המנוע, מאוזן | 100% | 1.63 ± 0.07 | 1% | כשנייה על CPU |
| המנוע, שובב | 100% | 1.63 ± 0.08 | 3% | כשנייה על CPU |
| DictaLM 12B | 76% | 0.90 ± 0.14 | 10% | כ־11 שניות על GPU |
| DictaLM 12B עם סינון | 78% | 0.84 ± 0.13 | 2% | כ־24 שניות על GPU |
אסור לתת רמז שהוא צורה אחרת של מילה על הלוח. בעברית השוואת מחרוזות לא מספיקה: "קסם" ו"קוסם" חולקים שורש אבל נראים שונים, ו"בבית" הוא בכלל "בית". הבדיקה בנויה בשכבות:
אוצר הרמזים הוא כ‑4,201 מילים אמיתיות ממאגר עברי גדול, שמודל שפה סינן לשמות עצם, שמות תואר ושמות מקומות מוכרים. המודל בורר, לא ממציא. מילות הלוח ומילים פוגעניות מסוננות מראש.
fastText בנוי על n‑gramים של אותיות, ולכן נותן וקטור הגיוני גם להטיה או למילה שלא ראה. וקטורים בעברית גם מצטופפים לפי תדירות, ולכן אנחנו מסירים את k=3 הצירים הראשיים (all‑but‑the‑top, Mu & Viswanath) כדי שהמרחקים ישקפו משמעות.
"עלה" הוא צמח, מחיר או פועל, ווקטור סטטי אחד ממצע ביניהם. המנוע מסמן רמזים דו־משמעיים ומוריד אותם בדירוג במצבים הזהיר והמאוזן. בניסוי מחקרי, הקשר קצר ל־NeoDictaBERT הזיז את "עלה" לכיוון "עץ" או "כסף", אבל זה לא חלק מהמנוע ב־Space הציבורי.
המפה שמתחת ללוח היא הקרנה ל‑2D של אותו מרחב: מטריצת מרחקי קוסינוס בין מילות הלוח והרמז, אחרי ניקוי האניזוטרופיה, מוקרנת עם MDS קלאסי ב‑numpy טהור. רמז טוב נוחת במרכז המסה של המילים שלך, ורחוק מהאשכול של היריב.
המודל המלא של fastText שוקל 7.2GB, ורובו מיותר בהסקה. דחסנו אותו עם compress‑fasttext (גיזום אוצר מילים ו־n‑gramים, ו־fp16). דחיסות אגרסיביות יותר שינו את הרמזים, אבל fp16 בחר בדיוק את אותו רמז ב‑12 מתוך 12 לוחות.
החוגה מזיזה שני כפתורים: כמה מילים לכסות בבת אחת (m), וכמה חזק להימנע מהקלפים של האחרים (הקנסות λ).
| מצב | מכסה | קנס מתנקש/יריב/ניטרלי | התנהגות |
|---|---|---|---|
| זהיר | 2 | 3.0 · 1.3 · 0.7 | רק רמזים בטוחים, מסרב יותר |
| מאוזן | 3 | 2.5 · 0.9 · 0.6 | ברירת המחדל |
| שובב | 4 | 1.8 · 0.7 · 0.4 | מכסה יותר, סובל קרבה ליריב |
המכסה היא רק תקרה. המספר בפועל נגזר מהריצה הבטוחה: מילת קבוצה נספרת רק אם היא מדורגת לפני המילה הזרה הראשונה וקוהרנטית עם שאר האשכול. רשימת החלופות מגוּונת ב‑MMR, כדי שלא תתמלא ברמזים כמעט זהים.