【要約】Ollama で think=false を送ると JSON Schema(format)が無視される [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者がOllamaで構造化データを得るため、think=falseとJSON Schemaを併用する際に問題が発生する。特定のサーバ環境では、指定した形式が無視され、モデルが自然文を返却してしまう。
- ・現象:json.loads()がJSONDecodeErrorで失敗する。
- ・原因:サーバが思考終了の合図を検知できず、制約適用を逃すため。
- ・対象:qwen3.5系などのthinking対応モデルを使用する場合。
// Approach
開発者はアプリのコードを修正するのではなく、Ollamaサーバのバージョンを更新することで解決を図る。サーバ側の実装において、思考プロセスの有無に関わらず制約を適用するよう修正された。
- ・解決策:Ollamaサーバを0.31.2以上にアップデートする。
- ・実行例:docker run -d --name ollama -v ollama:/root/.ollama -p 127.0.0.1:11434:11434 ollama/ollama:0.31.2
- ・確認:curl http://127.0.0.1:11434/api/versionで版を確認する。
// Result
Ollamaを0.31.2へ更新したユーザーは、think=falseを指定しても期待通りのJSON形式を得られる。サーバ側のロジック修正により、思考プロセスのスキップが制約適用を妨げなくなった。
- ・効果:アプリ側のコード変更なしに、構造化出力の不具合を解消できる。
- ・対象:qwen3.5/3.6系などのthinking対応モデル。
- ・注意:num_predict不足による空文字返却は、本件とは別の仕様である。
Senior Engineer Insight
> 本件は、推論サーバのバージョン管理がシステムの信頼性に直結することを示している。クライアント側のライブラリを更新しても解決しないため、問題の切り分けが困難だ。特にDockerでタグを固定している環境では、こうしたサーバ側の修正を見逃しやすい。インフラ層のバージョン管理を徹底し、不具合時はサーバの実装変更を疑うべきだ。