עיצוב להגדרת ההוראות
מודלים שמותאמים להוראות (IT) עוברים אימון באמצעות פורמטור ספציפי שמוסיף הערות עם מידע נוסף לכל הדוגמאות של התאמת ההוראות, גם במהלך האימון וגם במהלך ההסקה. למעצב יש שני שימושים:
- סימון תפקידים בשיחה, כמו התפקידים מערכת, משתמש או עוזר.
- סימון של תורות בשיחה, במיוחד בשיחה עם כמה תורות.
בהמשך מפורטים אסימוני הבקרה שבהם Gemma משתמשת ותרחישי השימוש שלהם. חשוב לזכור שטוקני הבקרה שמורים במפַתח המחרוזות שלנו וספציפיים לו.
- אסימון לציון תורו של משתמש:
user
- אסימון לציון פנייה במודל:
model
- אסימון לציון תחילת תורו של הדובר:
<start_of_turn>
- אסימון לציון סוף תורו של הדובר:
<end_of_turn>
הנה דוגמה לדיאלוג:
<start_of_turn>user
knock knock<end_of_turn>
<start_of_turn>model
who is there<end_of_turn>
<start_of_turn>user
Gemma<end_of_turn>
<start_of_turn>model
Gemma who?<end_of_turn>
האסימון "<end_of_turn>\n"
הוא מפריד התור והתחילית של ההנחיה היא "<start_of_turn>model\n"
. כלומר, אם רוצים להציג מודל עם שאלה כמו "מהו כלל Cramer?", צריך להזין את המודל באופן הבא:
"<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model"
הערה: אם אתם רוצים לשפר את מודל Gemma המאומן מראש באמצעות הנתונים שלכם, תוכלו להשתמש בכל סכימת אסימונים כזו לבקרה, כל עוד היא עקבית בין תרחישי האימון וההסקה.
הוראות למערכת
גם בתהליך של כוונון מדויק בפיקוח (SFT) וגם בתהליך של למידת חיזוק משוב אנושי (RLHF), המודלים לא הותאמו באמצעות הוראות מערכת. כתוצאה מכך, אסימוני הפרמט המשמעותיים היחידים עבור Gemma הם <start_of_turn>
, <end_of_turn>
, user
ו-model
. לדוגמה:
<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model
Cramer's Rule is ...<end_of_turn>
פורמט למשימות FIM
הווריאנטים 2B ו-7B של CodeGemma מותאמים במיוחד למשימות של מילוי קוד.
באופן ספציפי, הם מאומנים על ארבעה אסימונים של בקרת עיצוב, שאפשר להשתמש בהם כדי ליצור הנחיות מודל למשימות תכנות מסוג 'מילוי באמצע' (FIM).
הקשר | אסימון |
---|---|
קידומת FIM | <|fim_prefix|> |
סיומת FIM | <|fim_suffix|> |
FIM middle | <|fim_middle|> |
מפריד קבצים | <|file_separator|> |
משתמשים באסימוני FIM כדי להגדיר את מיקום הסמן ואת ההקשר שמסביב לו, כדי ש-CodeGemma תוכל לבצע מילוי קוד. משתמשים באסימון המפריד בין קבצים להקשרים של כמה קבצים.
דוגמה – יצירה של הנחיה ב-FIM
בקטע הזה נעשה שימוש חוזר בדוגמה שמופיעה במדריך למתחילים של Keras CodeGemma כדי להראות איך יוצרים הנחיה למשימות FIM.
הקוד הבא הוא דוגמה לכך:
import |⏎ # Line 1
if __name__ == '__main__':⏎ # Line 2
sys.exit(0) # Line 3
הסמל |
מציין את מיקום הסמן, שבו צריך להשלים את הקוד. שימו לב שיש רווח לפני הסמן וששורות 1 ו-2 כוללות תו של העברת שורה בסוף.
הקידומת תהיה
import
עם רווח אחד בסוף.
הסיומת היא:
⏎
if __name__ == '__main__':⏎
sys.exit(0)
עם שורה חדשה בהתחלה.
ההנחיה צריכה להיות מורכבת כך:
<|fim_prefix|>import <|fim_suffix|>⏎
if __name == '__main__':⏎
sys.exit(0)<|fim_middle|>
חשוב לזכור:
- אסור לכלול רווחים לבנים מיותרים בין אסימוני FIM לבין התחילית והסיומת
- האסימון האמצעי של FIM צריך להיות בסוף כדי לגרום למודל להמשיך למלא את הפרטים
- התחילית או הסיומת יכולות להיות ריקות, בהתאם למיקום הסמן בקובץ או לכמות ההקשר שרוצים לספק למודל.
הסבר על הפלט מהמודל
התשובה של המודל לדוגמה שלמעלה תהיה:
<|fim_prefix|>import <|fim_suffix|>⏎
if __name__ == "__main__":\n sys.exit(0)<|fim_middle|>sys\n<|file_separator|>
המודל חוזר על הנחיית הקלט ומספק את sys
כמילוי הקוד.
כשמשתמשים במודלים של CodeGemma למשימות FIM, מעבירים בסטרימינג אסימוני תגובה ומשתמשים באסימוני FIM או באסימוני מפרידי הקבצים כמפרידי פסיק כדי להפסיק את הסטרימינג ולקבל את השלמת הקוד.