指令微調的格式
訓練指令調校 (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 工作格式
CodeGemma 2B 和 7B 變體版本經過特別調整,可用於程式碼填入工作。
具體來說,這些模型是根據四個格式控制符號進行訓練,您可以利用這些符號建構模型提示,用於填空格 (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 或檔案分隔符符記做為分隔符,以便停止串流並取得產生的程式碼補全內容。