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

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

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

  1. ציון תפקידים בשיחה, כמו התפקידים מערכת, משתמש או עוזר דיגיטלי.
  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". כלומר, אם רוצים להציג למודל שאלה כמו "What is Cramer's Rules?", במקום זאת יש להזין את המודל באופן הבא:

"<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

הווריאציות של CodeGemma ל-2B ו-7B מכוונות במיוחד למשימות של מילוי קוד.

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

הקשר אסימון
קידומת FIM `<
סיומת FIM `<
FIM אמצעי `<
מפריד קבצים `<

כדי ש-CodeGemma יבצע מילוי קוד, השתמשו באסימוני FIM כדי להגדיר את מיקום הסמן ואת ההקשר שמסביבו. השתמשו באסימון מפריד קבצים בהקשרים של מספר קבצים.

דוגמה – בניית הנחיית 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 או מפריד קבצים כמפרידים, כדי להפסיק את הסטרימינג ולקבל את השלמת הקוד.