指示チューニングの形式
命令チューニング(IT)モデルは、トレーニング時と推論時の両方で、すべての命令チューニング例に追加情報をアノテーションする特定のフォーマッタでトレーニングされます。フォーマッタには次の 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 タスクのフォーマット
CodeGemma 2B と 7B のバリエーションは、コード補完タスク用に特別にチューニングされています。
具体的には、4 つのフォーマット制御トークンでトレーニングされます。これらのトークンは、Fill-In-The-Middle(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
に 1 つのスペースを追加します。
接尾辞は次のとおりです。
⏎
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
を提供します。
FIM タスクに CodeGemma モデルを使用する場合は、レスポンス トークンをストリーミングし、FIM またはファイル分割トークンを区切り文字として使用してストリーミングを停止し、結果のコード補完を取得します。