Alex ChernyshAlex ChernyshAgentic behaviorist · תל אביב
כתיבהעוזר
חזרה לכתיבה

הערה

RightLayout: שחררתי כלי AI ל-Mac, ואז העברתי אותו לקהילה

איך מפתח סולו עם מודל CoreML שאומן מאפס עקף בפיצ׳רים מתקן פריסה מילוני של צוות בן 10, ולמה פתחתי את הקוד במקום לנסות לסקיילל לבד.

8 במאי 2026·6 דק׳ קריאה
AI Systems
בעמוד הזה(7)
1. הבעיה עם punto-switcher מילוני2. ההימור3. איפה המודל באמת מנצח4. למה פתחתי את הקוד במקום לסקייל5. מה אתם יכולים לקחתריפו והורדותקריאה נוספת

בניתי את RightLayout כי כל מתקן פריסת מקלדת ל-macOS שניסיתי נשבר על שמות, קוד ושגיאות הקלדה. ההימור היה קטן: לאמן מודל CoreML מאפס, שלוש פריסות, על המכשיר. זה עבד. ואז הגיע חשבון התחזוקה, ופתחתי את הקוד.

על מה הפוסט

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

1. הבעיה עם punto-switcher מילוני

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

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

שמות שוברים את זה. קוד שובר את זה. ראשי תיבות שוברים את זה. URLים שוברים את זה. המילה kubectl לא נמצאת באף מילון רוסי, אבל היא גם לא מילה אנגלית בפריסה שגויה. שגיאת הקלדה כמו helo חסרה במילון, אז הכלי "מתקן" אותה ל-руды. ובפסקאות מעורבות שפה המילון אפילו לא יודע באיזו שפה לעגון.

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

רציתי משהו שקורא הקשר.

2. ההימור

ההימור היה קטן מספיק לנסות בכמה סופי שבוע. לאמן מודל זעיר ברמת תווים שלוקח חלון קצר של קלט אחרון וצופה לאיזו מתשע מחלקות הוא שייך. תשע המחלקות הן שלוש הפריסות הילידיות (EN, RU, HE) פלוס שש החטאות בין-פריסות: en_from_ru, ru_from_en, en_from_he, he_from_en, ru_from_he, he_from_ru. סט המחלקות הזה הוא כל הטריק. ברגע שהמודל אומר "זה נראה כמו רוסית שהוקלדה על פריסה אנגלית", mapper דטרמיניסטי מבצע את החלפת התווים בפועל.

צינור האימון נמצא ברפו והוא יום-יומי. קורפוסי Wikipedia וכתוביות לשלוש השפות, יצירה של זוגות נקיים וזוגות עם שגיאות בין-פריסות, טוקניזציה ברמת תווים, אוגמנטציה לשגיאות הקלדה ורעש רישיות, mixup, label smoothing. המודל עצמו הוא ensemble של CNN רב-סקאלי קטן ו-character Transformer בן ארבע שכבות, שניהם נדחסים לראש ליניארי אחד. הוא רץ על חלון קבוע של 20 תווים. הייצוא עובר מ-PyTorch ל-CoreML.

# מתוך Tools/CoreMLTrainer/train.py
CLASSES = [
    'ru', 'en', 'he',
    'ru_from_en', 'he_from_en',
    'en_from_ru', 'en_from_he',
    'he_from_ru', 'ru_from_he'
]

מודל ה-CoreML שיוצא בתוך ה-.pkg שוקל בערך 14 מ"ב. הוא רץ לגמרי על המכשיר. inference לכל חלון מהיר מספיק כדי שלוגיקת התיקון תישאר הרבה מתחת לתקציב 50 ms שקבעתי לכל הצינור (מ-event tap ועד החלפה). קטן מספיק כדי לשבת בבאנדל ולא להיות תלוי בענן.

הפעם הראשונה שהוא הפך נכון ghbdtn ל"привет" באמצע משפט עם קטע קוד בתוכו, ידעתי שזה הולך לעבוד. הכלי המילוני שהשתמשתי בו במשך שנים היה אוכל את הקטע.

3. איפה המודל באמת מנצח

שלושה מקומות שהוא מכה את המילון בנקיון.

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

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

הוא מטפל בעברית, שהיא הקשה באמת. טקסט RTL פלוס סט תווים בלי חפיפה ללטינית או קיריליק פלוס פריסה שממפה אותיות עבריות על מקשים אנגליים, אומרים שהגישה המילונית חייבת לתחזק שלוש טבלאות זוגיות והיוריסטיקה הקשרית מעל. המודל פשוט למד ש-akuo הוא "שלום" שהוקלד על פריסה אנגלית וממשיך הלאה.

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

4. למה פתחתי את הקוד במקום לסקייל

ואז הגיע חשבון התחזוקה.

לכלי macOS חינמי עם מודל מאומן יש זנב ארוך של עבודה לא רומנטית. event tap דרך accessibility-API חייב להמשיך לעבוד על גרסאות macOS חדשות. Apple אוהבת לשנות בשקט סמנטיקה של הרשאות בין מהדורות. ה-CoreML runtime נסחף. למודל אין תשתית בדיקות ל"משתמשים אמיתיים שמקלידים טקסט אמיתי", כי זה בהגדרה לא בסט האימון. לולאת הלמידה לפי undo-ratio, שבה הכלי צופה בביטולי תיקונים ומסתגל, קשה להפוך לבטוחה ועוד יותר קשה לאמת בלי טלמטריה שאני מסרב לאסוף.

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

בחרתי באופציה שלישית. סימנתי את הפרויקט כ-community-maintained, כתבתי באנר כן בעמוד ובקובץ README, השארתי את המודל בבאנדל כדי שהתקנות עדיין יעבדו, והעברתי את תשומת הלב שלי ל-Bernstein. הריפו פתוח. צינור האימון פתוח. pull requests עוברים review. אין gatekeeperים. אם אתם שולחים PRים טובים, אתם מקבלים commit access.

זו עמדה כנה יותר מ"v2 בקרוב, עקבו אחר העדכונים".

5. מה אתם יכולים לקחת

רוצים את הכלי. ה-.pkg ב-דף הריליסים. macOS 13 ומעלה, הרשאת Accessibility, חינם. המודל בתוך הבאנדל.

רוצים את הקוד. ה-ריפו קטן, מסמך הארכיטקטורה ב-.sdd/, צינור האימון ב-Tools/CoreMLTrainer/. הוספת שפה רביעית היא תרגיל של כמה שעות: להרחיב את ה-class enum, להוסיף את ה-layout map, לאמן מחדש, לשחרר.

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

אני באמת שמח שזה משוחרר. קחו, תקנו, שחררו.

Resources

ריפו והורדות

  • RightLayout ב-GitHub
  • הריליס האחרון של ה-.pkg
  • עמוד המוצר
  • Bernstein, מה שאני עובד עליו עכשיו
Related reading

קריאה נוספת

  • Interface design for serious products
  • מחפשים עבודה? תלגמו לאט. אנחנו נחפש בשבילכם.
  • Bernstein: רב-סוכנים שמחזיק מעמד

✓ Reading complete

Alex ChernyshAlex ChernyshApplied AI Systems & Platform Engineer

עוד על AI Systems

חלק מהערות ציבוריות על מערכות AI עם grounding, retrieval, evals ועל איך שולחים את זה תחת מגבלות אמיתיות.

  • →הרצתי 12 סוכני AI במשך 47 שעות. הנה מה ששרד.29 במרץ 2026·6 דק׳ קריאה

כתיבה אחרונה

  • →פרוגנוזה ללא נבואה: דיסציפלינה בטקסט פשוט2 במאי 2026·10 דק׳ קריאה
  • →מחפשים עבודה? תלגמו לאט. אנחנו נחפש בשבילכם.23 באפר׳ 2026·4 דק׳ קריאה
  • →הרצתי 12 סוכני AI במשך 47 שעות. הנה מה ששרד.29 במרץ 2026·6 דק׳ קריאה
בעמוד הזה
  • 011. הבעיה עם punto-switcher מילוני1 min
  • 022. ההימור1 min
  • 033. איפה המודל באמת מנצח1 min
  • 044. למה פתחתי את הקוד במקום לסקייל1 min
  • 055. מה אתם יכולים לקחת
  • 06ריפו והורדות
  • 07קריאה נוספת