עיצוב Gemma והוראות מערכת

הפורמט של כוונון של הוראה

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

  1. לציין תפקידים בשיחה, כמו המערכת, המשתמש או של Assistant.
  2. סימון תורות בשיחה, במיוחד תורות מרובות שיחה.

בהמשך אנחנו מציינים את אסימוני הבקרה שמשמשים את 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". זה אומר שאם רוצים להנחות את המודל עם שאלה כמו "מהו כלל קרמר?", באופן הבא:

"<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 – אמצעי <|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 או את מפריד הקבצים בתור מפרידים כדי להפסיק את השידור ולקבל את להשלמת הקוד.