OpenAI発のオープンウェイトモデル「gpt-oss-20b」は、非常に強力な推論能力(Reasoning)を持っていますが、デフォルトの設定では延々と思考プロセス(Chain of Thought)が出力されてしまい、ログが汚れるという課題があります。
特にollamaコマンドの出力を他のコマンドに渡す場合には最終出力だけが欲しくなる場合が多いです。
「推論はしてほしい(賢いままでいてほしい)けれど、思考のログは見たくない」
この需要に応えるための、推論能力を最大化しつつ出力をスッキリさせる最適設定を解説します。
結論:推論隠蔽の正解構成
推論過程を隠すための「魔法のテンプレート」はありません。正解は 「Ollamaが思考ブロックを認識できるように、あえて標準的なHarmonyプロトコル準拠のテンプレートを書き、表示制御はOllamaの機能に任せる」 ことです。
Harmonyプロトコル準拠のテンプレートの代表的な例はこちらで書かれているようなものです。
技術解説:なぜこの設定なのか?
ポイント1:TEMPLATEで final を強制してはいけない
よくある間違いとして、「思考を見たくないから」といってModelfileのTEMPLATEの最後に <|channel|>final を書いてしまうケースがあります。
# やってはいけない設定(推論能力が死にます)
...
<|start|>assistant<|channel|>final<|message|>
これをやると、モデルは思考プロセス(analysisチャンネル)をスキップしていきなり回答を生成し始めます。一見スッキリしますが、モデルは「推論なし」で回答することになり、gpt-ossの強みである論理的思考能力が失われます。
なお、精度が低くても良いから高速なレスポンスが欲しいという場合はこれでも問題ないです
ポイント2:Ollamaの「Thinking」認識機能を利用する
上記の推奨Modelfileを使うと、モデルは以下のようなトークンを生成します。
-
<|start|>assistant(テンプレート末尾) -
<|channel|>analysis<|message|>(モデルが自発的に生成) ...(長い思考プロセス)...<|end|><|start|>assistant<|channel|>final<|message|>...(最終回答)...
Ollamaは、この構造を解析し、analysis チャンネルの中身を「Thinking(思考中)」ステートとして認識します。
実行時に「思考」を非表示にする方法
Modelfileを正しく設定したら、あとは実行時(クライアント側)で「隠す」だけです。
CLI(ターミナル)で実行する場合
--hidethinking フラグを使用します。これだけで、裏では推論が行われつつ、画面には回答だけが表示されます。
ollama run gpt-oss-20b --hidethinking
Open WebUIなどのGUIを使う場合
上記のModelfileを使っていれば、多くのモダンなOllama対応UIは、思考部分を自動的に <details> タグのように折りたたんで表示してくれます(「Thinking...」をクリックしないと中身が見えない状態)。
まとめ
gpt-oss-20bの推論を活かしつつログを綺麗にするには、「テンプレートで出力を抑制する」のではなく、「テンプレートで正しく推論を開始させ、クライアント側で隠す」 のが正解です。
-
TEMPLATE: 標準的なHarmony形式(
finalを強制しない) -
SYSTEM:
Reasoning: highまたはmediumを指定 -
実行時:
--hidethinkingやUIの機能で非表示にする