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 つのフォーマット コントロール トークンでトレーニングされ、これらを使用して、中間入力(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 またはファイル セパレータ トークンを区切り文字として使用してストリーミングを停止し、結果のコード補完を取得します。