指示チューニングのフォーマット
指示調整済み(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 つのフォーマット コントロール トークンでトレーニングされ、これらを使用して、中間入力(FIM)コーディング タスクのモデル プロンプトを作成できます。
コンテキスト | トークン |
---|---|
FIM 接頭辞 | `< |
FIM 接尾辞 | `< |
FIM 中間 | `< |
ファイルの区切り | `< |
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 またはファイル セパレータ トークンを区切り文字として使用してストリーミングを停止し、結果のコード補完を取得します。