Gemma 4 から、新しい制御トークンが導入されました。Gemma 3 以前については、 前のドキュメントをご覧ください。
以降のセクションでは、Gemma 4 で使用される制御トークンとそのユースケースについて説明します。制御トークンは予約されており、トークナイザーに固有のものであることに注意してください。
- システム指示を示すトークン:
system - ユーザーのターンを示すトークン:
user - モデルのターンを示すトークン:
model - 会話のターンの開始を示すトークン:
<|turn> - 会話のターンの終了を示すトークン:
<turn|>
会話の例を次に示します。
<|turn>system
You are a helpful assistant.<turn|>
<|turn>user
Hello.<turn|>
マルチモーダル
| マルチモーダル トークン | 目的 |
|---|---|
<|image> <image|> |
画像のエンベディングを示す |
<|audio> <audio|> |
音声のエンベディングを示す |
<|image|> <|audio|> |
特殊なプレースホルダ トークン |
2 つの特殊なプレースホルダ トークン(<|image|> と <|audio|>)を使用して、画像トークンと音声トークンを挿入する場所を指定します。トークン化後、これらのトークンはモデル内の実際のソフト エンベディングに置き換えられます。
会話の例を次に示します。
prompt = """<|turn>user
Describe this image: <|image|>
And translate these audio:
a. <|audio|>
b. <|audio|><turn|>
<|turn>model"""
エージェントと推論の制御トークン
エージェント ワークフローをサポートするため、Gemma は、内部推論(思考)と外部アクション(関数呼び出し)を区別する特殊な制御トークンを使用します。これらのトークンを使用すると、モデルは複雑なロジックを処理してから最終的なレスポンスを提供したり、外部ツールとやり取りしたりできます。
関数呼び出し
Gemma 4 は、6 つの特殊なトークンでトレーニングされ、「ツール使用」のライフサイクルを管理します。
| トークンペア | 目的 |
|---|---|
<|tool> <tool|> |
ツールを定義する |
<|tool_call> <tool_call|> |
ツールを使用するモデルのリクエストを示す。 |
<|tool_response> <tool_response|> |
ツールの実行結果をモデルに返す。 |
文字列値の区切り文字: <|"|>
単一のトークン <|"|> は、構造化データ ブロック内のすべての文字列値
の区切り文字として使用されます。
- 目的: このトークンを使用すると、文字列内の特殊文字(
{、}、,、引用符など)がリテラルテキストとして扱われ、データ構造の基盤となる構文の一部として扱われることはありません。 - 使用方法: 関数宣言、呼び出し、
レスポンス内のすべての文字列リテラルは、このトークンで囲む必要があります(例:
key:<|"|>string value<|"|>)。
思考モード
思考モードを有効にするには、<|think|> 制御トークンを
システム指示に含めます。
| 制御トークン | 目的 |
|---|---|
<|think|> |
思考モードを有効にする |
<|channel> <channel|> |
モデルの内部プロセスを示す。 |
会話の例を次に示します。
<|turn>system
<|think|><turn|>
<|turn>user
What is the water formula?<turn|>
<|turn>model
<|channel>thought
...
<channel|>The most common interpretation of "the water formula" refers...<turn|>
思考モードは、会話レベルで有効になるように設計されています。ツール定義など、他のシステム指示とともに 1 つのシステムターンに統合する必要があります。
推論と関数呼び出しの例
エージェントのターンでは、モデルは関数を呼び出す前に非公開で「思考」することがあります。ライフサイクルは次のシーケンスに従います。
- ユーザーの問い合わせ: ユーザーが質問します。
- 内部推論: モデルは思考チャネルで非公開で思考します。
- ツール リクエスト: モデルは生成を停止して、ツール呼び出しをリクエストします。
- 実行と挿入: アプリケーションはツールを実行し、レスポンスを追加します。
- 最終レスポンス: モデルはレスポンスを読み取り、最終的な回答を生成します。
次の例は、天気予報ツールを使用するモデルを示しています。
<|turn>system
<|think|>You are a helpful assistant.<|tool>declaration:get_current_temperature{...}<tool|><turn|>
<|turn>user
What's the temperature in London?<turn|>
<|turn>model
<|channel>thought
...
<channel|><|tool_call>call:get_current_temperature{location:<|"|>London<|"|>}<tool_call|><|tool_response>
アプリケーションは、モデルのレスポンスを解析して関数名と引数を抽出し、関数を実行して、assistant ロールのチャットの履歴に tool_calls と tool_responses を追加する必要があります。
<|turn>model
<|tool_call>call:get_current_weather{location:<|"|>London<|"|>}<tool_call|><|tool_response>response:get_current_weather{temperature:15,weather:<|"|>sunny<|"|>}<tool_response|>
最後に、Gemma はツール レスポンスを読み取り、ユーザーに返信します。
The temperature in London is 15 degrees and it is sunny.<turn|>
この例の JSON チャットの履歴全体を次に示します。
[
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "What's the temperature in London?"
},
{
"role": "assistant",
"tool_calls": [
{
"function": {
"name": "get_current_weather",
"arguments": {
"location": "London"
}
}
}
],
"tool_responses": [
{
"name": "get_current_weather",
"response": {
"temperature": 15,
"weather": "sunny"
}
}
],
"content": "The temperature in London is 15 degrees and it is sunny."
}
]
ターン間の思考コンテキストの管理
モデルが生成した思考を適切に管理することは、マルチターンの会話でパフォーマンスを維持するために不可欠です。
- 標準的なマルチターンの会話: 次のターンで会話履歴をモデルに渡す前に、前のターンでモデルが生成した思考を削除(ストリップ)する必要があります。会話の途中で思考
モードを無効にする場合は、前の思考を削除するときに
<|think|>トークンを削除します。 - 関数呼び出し(例外): 1 回のモデルターンに関数呼び出しまたはツール呼び出しが含まれる場合、関数呼び出しの間で思考を削除してはなりません 。
エージェント ワークフローと長時間実行タスク
標準的なターンでは生の思考が削除されるため、長時間実行されるエージェントを構築するデベロッパーは、モデルが循環的な推論ループに入らないように、推論コンテキストを保持したい場合があります。
- 思考の要約: 推奨される推論手法は、モデルの以前の思考を抽出して要約し、標準テキストとしてコンテキスト ウィンドウにフィードバックすることです。
- 形式の制約: Gemma 4 は、プロンプトに生の思考を含めて明示的にトレーニングされていないため(上記の特定のツール呼び出しシナリオを除く)、挿入された思考に対してモデルが想定する厳格な形式や特定の形式はありません。特定のエージェント アーキテクチャに最適な方法で、要約された推論の形式を柔軟に設定できます。
統合に関する注意事項
- 内部状態:
<|channel>トークンと<channel|>トークンは通常、Chain-of-Thought(CoT)処理に 使用されます。標準的なユーザー向けアプリケーションでは、このコンテンツは通常、エンドユーザーに表示されません。 - ツールループ:
tool_callトークンとtool_responseトークンを使用すると、モデルとアプリケーション環境の間で「ハンドシェイク」を行うことができます。アプリケーションはtool_callをインターセプトし、基盤となるコードを実行して、tool_responseトークン内の結果をモデルにフィードバックします。 - モデルの動作: 大規模なモデル(gemma-4-26B-A4B-it、gemma-4-31B-it など)では、思考モードが明示的にオフになっている場合でも、思考チャネルが生成されることがあります。このようなエッジケースでモデルの動作を安定させるには、空の思考トークンをプロンプトに追加することを検討してください。
ヒント: 思考のないデータセットで大規模モデルをファインチューニングする
思考を含まないデータセットで大規模な Gemma モデルをファインチューニングする場合は、トレーニング プロンプトに空のチャネルを追加すると、より良い結果が得られます。
<|turn>model
<|channel>thought
<channel|>
ヒント: システム指示を使用して思考の効率を適応させる
Gemma 4 での「思考」は、公式には ON または OFF のブール値機能としてサポートされていますが、モデルには非常に強力な指示追従機能があり、思考動作を動的に調整できます。
「高」または「低」の思考にハードコードされたフレームワーク パラメータに依存するのではなく、システム指示(SI)を使用して、モデルを思考モードに誘導できます。モデルに効率的に思考するように、またはより低い深度で思考するように明示的に指示することで(「低」思考指示と呼びます)、思考の効率を適応させることができます。
- コスト削減: テストでは、「低」思考のシステム指示を適用すると、生成される思考トークンの数を約 20% 削減できることが示されています。
- 概念実証: この動作は、モデルの指示可能性の副産物であり、特別にトレーニングされたものではないため、「完璧」なプロンプトはありません。「低」指示は概念実証です。
- カスタマイズ: デベロッパーは、独自のカスタム システム指示を試すことを強くおすすめします。モデルの思考プロセスの深度、長さ、スタイルを微調整して、特定のユースケースのレイテンシ、コスト、出力品質のバランスを最適化できます。