קופיילוט · שם קוד · איך זה עובד

איך לרמות בשם קוד

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

מנוע · fastText + Numberbatch ללא LLM גנרטיבי בריצה מקומי · CPU קבצי fastText · כ־369MB (היו 7.2GB) מעודכן · 31.08.2026
‹ נסו את הקופיילוט מקורות
01

הבעיה: דמיון סמנטי"שם קוד" מחופש למשחק מילים — אבל הוא בעיית גאומטריה

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

כל מילה הופכת לווקטור — נקודה במרחב רב־ממדי. מנוע ברירת המחדל מחבר וקטור fastText בן 300 ממדים עם וקטור Numberbatch בן 300 ממדים, במשקלים 70% ו־30%. "קרבה במשמעות" היא פשוט מרחק בין נקודות. רמז מצוין צריך לקיים תנאי אחד: להיות הכי קרוב למילים שלך, והכי רחוק מכל השאר. המילה שממקסמת את התנאי הזה — היא הרמז.

שלך יריב ניטרלי מתנקש
02

פונקציית הניקודDETECT — קרבה מדורגת עם קנסות, אחרי תיקון אניזוטרופיה

הקופיילוט מדרג כל מילה־מועמדת מאוצר הרמזים לפי ציון מדורג: בונוס על קרבה למילים שלך, וקנס הולך וגדל ככל שמתקרבים ליריב, לניטרלי, ובעיקר למתנקש. זה הניסוח (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 where s′(c, w) = cos(c, w) − mean_b cos(c, b)

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

שלושת הקנסות הם מדורגים: λₐ ≫ λₒ > λₙ. ככה הקופיילוט "מפחד" מהמתנקש הרבה יותר מאשר מקלף ניטרלי. הרמז שמנצח הוא לא בהכרח הכי קרוב למילים שלך — אלא זה שמשיג את ההפרדה הנקייה ביותר בין שלך לכל השאר.

הקנסות למעלה קוראים דמיון מוחלט. אבל מנחש אמיתי לא שואל "כמה הרמז קרוב למתנקש" — הוא בוחר מבין 25 הקלפים. לכן נוסף גם איבר בסגנון RSA (Rational Speech Acts): המנוע ממדל את המנחש כ"מאזין ליטרלי" — softmax על הדמיון של הרמז לכל 25 מילות הלוח, כלומר התפלגות ההסתברות שינחש כל קלף. איבר הסכנה הוא מסת ההסתברות שנוחתת על המתנקש (במשקל כפול) ועל קלפי היריב. היתרון: הוא מודע־תחרות וחסר־יחידות — רמז הקרוב למתנקש עדיין בטוח אם מילות הקבוצה והניטרליות מושכות יותר ממסת המנחש, ומסוכן רק אם הסכנה באמת "מנצחת" את התחרות.

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

למה וקטורים סטטייםלמשימה התחומה הזאת, אסוציאציות ודירוג חשובים יותר מיצירה חופשית

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

צילום benchmark על 12 לוחות · אותו אוצר רמזים (שמות עצם/תארים) · מנחש־שופט עצמאי. recovery וגם margin — גבוה יותר = טוב יותר.
אנקודרrecoverymargin (הפרדה)סוג
Blend 70/30 (fastText+Numberbatch)0.4440.252וקטורים משולבים ✓
fastText0.3750.194וקטורים סטטיים
EmbeddingGemma‑300m0.2920.131SOTA‑small 2025
Qwen3‑Embedding‑0.6B0.1250.112סנטנס‑אמבדינג
גבול הטענה. זו השוואה בין אנקודרים, לא הוכחה ש־fastText "חכם יותר" מ־LLM. במדגם הזה ה־blend שיפר recovery בכ־18% יחסית ל־fastText לבדו (0.444 לעומת 0.375). המדד מבוסס על מנחש־proxy ועל 12 לוחות, לא על מחקר משתמשים גדול.

למה דווקא הסטטי? כי "שם קוד" דורש אסוציאטיביות (מלך→כתר→טירה), לא נרדפוּת. וקטורים סטטיים מבוססי הופעה־משותפת לוכדים בדיוק את זה — וזו הסיבה שספרות ה‑AI של המשחק משתמשת בהם. מודלי סנטנס־אמבדינג מאומנים על דמיון משפטים, ולמילה בודדת הם דוחסים את כל הקוסינוסים לטווח צר וגבוה (qwen בקושי הבדיל בין "מלך·מלכה" ל"מלך·ים"). ועל הלוח אין הקשר — בדיוק היתרון היחיד של מודל קונטקסטואלי מתבטל.

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

04

האתגר העברישורשים, מורפולוגיה, ואניזוטרופיה

חוקיות: שורש, לא מחרוזת

חוקי המשחק אוסרים רמז שחולק שורש עם מילה על הלוח. בעברית השוואת מחרוזות לא מספיקה — "קסם" ו"קוסם" חולקים שורש אבל נראים שונים, ו"בבית" הוא בכלל "בית". הפתרון בנוי בשכבות:

אוצר וסינון

אוצר הרמזים הוא כ‑4,286 מילים שנבחרו בקפידה ממאגר עברי גדול על‑ידי מודל שפה (OpenAI gpt‑5.6‑terra): שמות עצם, שמות תואר, ושמות פרטיים מוכרים (מדינות, ערים, מקומות). כל מילה נשפטה כלמה עברית שלמה, מוכרת ובת‑משחק — פעלים, קיצורים, שברי מילים וטוקנים בני שתי אותיות נפסלים; המילים עצמן אמיתיות ומדורגות‑תדירות מהמאגר (המודל בורר, לא ממציא). מילות הלוח ומילים פוגעניות (רשימת חסימה) מסוננות מראש, כך שרמז לעולם אינו מילה שעל הלוח. התוצאה היא אוצר רחב אבל מבוקר, ולא רשימה קצרה וקבועה.

מורפולוגיה: subwords

מכיוון ש‑fastText בנוי על n‑gramים של אותיות, הוא נותן וקטור הגיוני גם למילה שלא ראה מעולם — הטיה, מילה עם אות יחס, או רמז שהמשתמש הקליד. זה מה ששומר על הכיסוי בעברית בלי טבלת מילים ענקית.

אניזוטרופיה: ניקוי המפה

וקטורים בעברית נוטים להצטופף לפי תדירות ואורך, לא רק לפי משמעות — קונוס משותף שמעוות מרחקים. אנחנו מסירים את k=3 הצירים הראשיים (all‑but‑the‑top, Mu & Viswanath) לפני ההקרנה, וזה פותח את המפה חזרה כדי שתראה פיזור סמנטי ולא פיזור־תדירות.

רב־משמעות (Polysemy): אזהרה בייצור, הקשר־מדומה במחקר

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

בניסוי מחקרי, הזנת מילות אשכול ביחד כרצף קצר ל־NeoDictaBERT הזיזה את הייצוג של "עלה" בהתאם להקשר:

המספרים האלה מדגימים היתכנות בלבד. מסלול ה־pseudo-context אינו חלק ממנוע ברירת המחדל ב־Space הציבורי.

05

המפה הסמנטיתלמה הרמז יושב במרכז המילים שלך

המפה שמתחת ללוח היא ההקרנה ל‑2D של אותו מרחב. בונים מטריצת מרחקי קוסינוס בין כל המילים והרמז, ומקרינים אותה עם MDS קלאסי (Torgerson) — מירכוז כפול של מטריצת המרחקים בריבוע, ושני הווקטורים העצמיים הגדולים. הכול ב‑numpy טהור, בלי תלות נוספת.

הטמעה — כל מילות הלוח + הרמז לווקטורים (blend של fastText ו־Numberbatch).
ניקוי — הסרת קונוס התדירות (all‑but‑top k=3).
מרחקים — מטריצת 1 − cos בין כל הזוגות.
הקרנה — MDS קלאסי לשני ממדים.
ציור — הרמז כצומת זוהר, קווי זהב למילות היעד.

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

06

דחיסה ללא אובדן7.2GB → 369MB, ואותם רמזים בדיוק

המודל המלא של fastText שוקל 7.2GB — רובו מטריצת אימון שמיותרת בהסקה, ומיליוני מילים שלעולם לא נשתמש בהן. דחסנו אותו עם compress‑fasttext (גיזום אוצר־מילים + n‑gramים + fp16), ובדקנו שזה לא פוגע: על 12 לוחות, המודל הדחוס בחר בדיוק את אותו רמז ב‑12 מתוך 12, עם recovery ו‑margin זהים לחלוטין.

20×
קטן יותר (7.2GB→369MB)
12/12
אותו רמז כמו המלא
0.9985
קורלציית גאומטריה
וריאנטים של דחיסה מול המודל המלא. fp16 הוא זה ששוגר.
וריאנטגודלקורלציהאותו רמזrecovery
מלא7.2GB1.000—0.375
ברירת־מחדל14MB0.645/120.250
PQ גדול107MB0.966/120.250
fp16 ✓369MB0.998512/120.375
07

חוגת הסיכוןזהיר · מאוזן · שובב — אותה גאומטריה, תיאבון אחר

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

מצבמכסהקנס מתנקש/יריב/ניטרליהתנהגות
זהיר23.0 · 1.3 · 0.7רק רמזים בטוחים, מסרב יותר
מאוזן22.5 · 0.9 · 0.6ברירת המחדל
שובב41.8 · 0.7 · 0.4מכסה יותר, סובל קרבה ליריב

בשובב המנוע גם לא קובר רמז מסוכן בתחתית הרשימה — כי זו כל הנקודה של שובב.

ה"מכסה" הוא רק תקרה — המספר בפועל נגזר מריצה בטוחה וגיזום כיסוי: מילת קבוצה נספרת רק לפני המילה הזרה הראשונה, אם הדמיון שלה נשאר קרוב למילת היעד החזקה, ואם היא קוהרנטית עם ראש האשכול. הספים כוילו מול מנחש־proxy ומשוב ממשחקים כדי לצמצם over‑claim; זה אינו תחליף להערכת שחקנים אנושית. רמז של מילה בודדת הוא מוצא אחרון. הרשימה הנגללת מגוּונת ב‑MMR כדי שצמד קלפים אחד לא ימלא את כל האפשרויות ברמזים כמעט‑זהים.

08

מגבלות וכנותאיפה זה נשבר, ומה לא מדדנו

הדרך השנייה לרמות. אפשר גם בכוח גס: הריפו durfi/codenames מתעלם מ‑embeddings ומנצל שיש כמות מוגבלת של מפות מפתח — ומסיק לאחור מהלוח איזו מפה שוחקה. ההגנה פשוטה: להגריל מפה אקראית בכל סבב.