Gemma のフォーマットとシステムの手順

指示チューニングの形式

命令チューニング(IT)モデルは、トレーニング時と推論時の両方で、すべての命令チューニング例に追加情報をアノテーションする特定のフォーマッタでトレーニングされます。フォーマッタには次の 2 つの目的があります。

  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" です。つまり、「クレイマーの法則とは何ですか?」のような質問をモデルに提示する場合は、次のようにモデルに入力する必要があります。

"<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 のバリエーションは、コード補完タスク用に特別にチューニングされています。

具体的には、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 またはファイル分割トークンを区切り文字として使用してストリーミングを停止し、結果のコード補完を取得します。