ענקי אוטורגרסיה (Autoregressive) כמו GPT-4 ו-Claude פולטים קוד טוקן-אחר-טוקן, תוך התקדמות משמאל לימין לאורך הקובץ. הם מטפלים היטב בקטעי קוד קצרים, אך נתקלים בקשיים כאשר מפתח רוצה לערוך שורה הטבועה עמוק בתוך בסיס קוד גדול. המודל חייב להעריך מחדש כל טוקן בהמשך הרצף, ושמירה על עקביות של הקובץ כולו הופכת לסיוט.

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

למה הפרדיגמה הנוכחית מתקשה בהנדסת תוכנה

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

  • מסתכל רק אחורה. הוא לעולם לא רואה טוקנים עתידיים, ולכן אינו יכול לצפות כיצד שינוי ישפיע על שורות מאוחרות יותר.
  • מחשב מחדש טקסט בהמשך הרצף. עריכה אחת מפעילה שרשרת של תחזיות חדשות, מה שמגדיל את השיהוי (latency) בתהליכי ריפקטורינג (refactoring) או תיקון באגים.
  • צובר שגיאות ארוכות טווח. חוסר התאמה מוקדם הופך לשלגון (snowball), מה שמותיר את הקובץ הסופי שבור מבחינה תחבירית או לא עקבי מבחינה לוגית.

כשצריך לבצע infill — להכניס גוף של פונקציה באמצע קובץ או לעדכן חתימת API — הטבע הסדרתי של מודלים אוטורגרסיביים מרגיש מסורבל ונוטה לשגיאות.

חלופה של דיפוזיה: שיפור איטרטיבי, לא תחזית שלב-אחר-שלב

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

  1. אתחול עם רעש טהור. אנו מזינים למודל רצף של טוקנים אקראיים, שלעיתים קרובות מיוצגים על ידי placeholder מיוחד.
  2. הסרת רעש הדרגתית. בכל שלב המודל חוזה גרסה נקייה מעט יותר, תוך דחיפת הטוקנים לעבר קוד סביר.
  3. התכנסות לתוכנית מוכנה. לאחר מספר קבוע של שלבים הרעש נעלם, ומשאיר קטע קוד (snippet) מוגמר לחלוטין.

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

הנדסת מודל דיפוזיה ממוקד-קוד

העברת דיפוזיה מתמונות לטקסט אינה משימה של "חבר והפעל" (plug-and-play). שלושה שינויים טכניים הם קריטיים.

1. דיפוזיה בדידה (Discrete diffusion)

פיקסלים בתמונות מקבלים רעש שברי (fractional noise), אך טוקן קוד הוא קטגוריאלי — הוא או מילת מפתח ספציפית, מזהה (identifier) או סמל. לכן, אנו משתמשים בשרשרת מרקוב המחליפה שוב ושוב טוקנים ב-placeholder ניטרלי (לעיתים קרובות [MASK]) עד שהרצף הופך לאקראי למעשה. התהליך ההפוך לומד כיצד לשחזר את הטוקנים המקוריים שלב אחר שלב.

2. מודעות מבנית (Structural awareness)

שפות תכנות כופות כללים תחביריים נוקשים: הזחה (indentation) מגדירה scope ב-Python

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

שורה תחתונה

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