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"。也就是說,如果您想透過「什麼是 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>usermodel。例如:

<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 或檔案分隔符符記做為分隔符,以便停止串流並取得產生的程式碼補全內容。