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

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

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

מנוע · fastText + Numberbatch ללא LLM גנרטיבי בריצה מקומי · CPU קבצי fastText · כ־369MB (היו 7.2GB) מעודכן · 15.10.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, ½·neutral where s′(c, w) = cos(c, w) − mean_b cos(c, b)

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

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

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

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

"שם קוד" דורש אסוציאטיביות (מלך→כתר→טירה), לא נרדפוּת, ווקטורים סטטיים מבוססי הופעה־משותפת לוכדים בדיוק את זה. מודלי סנטנס־אמבדינג דוחסים מילה בודדת לטווח קוסינוסים צר (Qwen3-Embedding בקושי הבדיל בין "מלך·מלכה" ל"מלך·ים"), ועל הלוח אין הקשר שמודל קונטקסטואלי יוכל לנצל. על 100 לוחות, ה־blend ו־fastText לבדו יצאו שקולים, בתוך טווח הרעש.

ה־blend משרשר את וקטורי fastText ו־Numberbatch המנורמלים, מוכפלים ב־0.7 וב־0.3. המשקלים חלים על הווקטורים ולא על הקוסינוסים, ולכן הקוסינוס המשותף הוא בערך 84.5% fastText ו־15.5% Numberbatch (0.49 מול 0.09).

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

מול LLM כנותן רמזים

הרצנו את DictaLM 2.0 (12B) כנותן רמזים על אותם לוחות, מול המנוע. השופט הוא מנחש עצמאי (fastText + Qwen3-Embedding) שתוקף מול הצבעות 👍/👎 אמיתיות (AUC 0.74). רמז לא חוקי מקבל 0.

המנוע: 100 לוחות · DictaLM: 50 לוחות · "עם סינון" = DictaLM מציע 5 רמזים ונבחר הראשון החוקי.
נותן רמזיםרמזים חוקייםקלפים לרמזניחוש הקלף השחורזמן לרמז
המנוע, מאוזן100%1.63 ± 0.071%כשנייה על CPU
המנוע, שובב100%1.63 ± 0.083%כשנייה על CPU
DictaLM 12B76%0.90 ± 0.1410%כ־11 שניות על GPU
DictaLM 12B עם סינון78%0.84 ± 0.132%כ־24 שניות על GPU
גבול הטענה. כשהרמז של DictaLM חוקי, הוא סביר (כ־1.2 קלפים לרמז). הבעיה היא חוקיות ועלות: כרבע מהרמזים שלו לא חוקיים (לרוב מילה שמופיעה על הלוח), וגם כשהוא מציע חמישה רמזים, בכ־22% מהלוחות אף אחד מהם לא חוקי. שופט שמבוסס על EmbeddingGemma בלבד דירג את DictaLM מעט מעל המנוע, בתוך טווח הרעש.
04

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

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

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

אוצר המילים

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

מורפולוגיה ואניזוטרופיה

fastText בנוי על n‑gramים של אותיות, ולכן נותן וקטור הגיוני גם להטיה או למילה שלא ראה. וקטורים בעברית גם מצטופפים לפי תדירות, ולכן אנחנו מסירים את k=3 הצירים הראשיים (all‑but‑the‑top, Mu & Viswanath) כדי שהמרחקים ישקפו משמעות.

רב־משמעות

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

05

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

המפה שמתחת ללוח היא הקרנה ל‑2D של אותו מרחב: מטריצת מרחקי קוסינוס בין מילות הלוח והרמז, אחרי ניקוי האניזוטרופיה, מוקרנת עם MDS קלאסי ב‑numpy טהור. רמז טוב נוחת במרכז המסה של המילים שלך, ורחוק מהאשכול של היריב.

06

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

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

20×
קטן יותר (7.2GB→369MB)
12/12
אותו רמז כמו המלא
0.9985
קורלציית גאומטריה
07

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

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

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

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

08

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