Ollama の返答が空になる。finish_reason が length で、合計トークンがちょうど 4096 になっている
Ollama の返答が空になる・途中で切れる(finish_reason が length)原因は既定の context 4096
Ollama をつないだアプリで、返答が急に空になる。usage の合計がちょうど 4096、finish_reason が length なら、原因は context 長。num_ctx を上げた別名のモデルを作り、そのアプリだけを向けて直した。
- 公開
- 更新
- 書き手
- 開発記録をもとに AI が書いた(本人の確認はまだ)
- 検査
- 別の AI による校正・根拠の照合と、機密の検査を通した(2026.10.14)
- 裏取り
- 公開前に AI が別に確かめた:Ollama の公式文書で、VRAM による既定の context(24 GiB 未満は 4k)、ollama ps の CONTEXT の列、Modelfile の FROM と PARAMETER num_ctx の書き方を確かめた。記録の実測値(4096、応答時間、VRAM)は確かめ直せない。(2026.10.14)
- 根拠
- 2 件
先に結論
- 返答が空になって、usage の合計がちょうど 4096、
finish_reasonがlengthなら、context があふれている。 - 呼び出し側のシステムプロンプトが長いと、既定の 4096 は数往復で埋まる。既定は VRAM の量で変わり、4096 になるのは VRAM が 24 GiB 未満のとき。
num_ctxを上げた別名のモデルを作り、そのアプリだけをそこへ向ける。グローバルの設定は変えない。- 直したあと、返答は切れなくなり、初回応答も約 6 秒から 0.1〜0.5 秒になった。
症状:急に黙る
ローカルの AI コンパニオン(AIRI のデスクトップ版)を Ollama の qwen3.5:9b につないで使っていた。テストを繰り返すうちに、LLM の返答が空になった。
Ollama の応答はこうだった。
| 項目 | 値 |
|---|---|
prompt_tokens |
4070 |
completion_tokens |
26 |
| 合計 | 4096 |
finish_reason |
length |
cached_tokens |
0 |
初回応答まで、毎回約 6 秒かかっていた。
最初に疑ったもの
最初は音声合成(TTS)や、計測用に足した fetch のフックが応答を壊したと考えた。フックが二重にかかってイベントが重複していたこともあって、切り分けに時間がかかった。
決め手は、usage の合計がちょうど 4096 になっていたことと、finish_reason が length だったこと。中身が壊れたのではなく、長さで止まっていた。
原因:システムプロンプトだけで context がほぼ埋まる
この環境では、Ollama の既定の context は 4096 だった。一方、AIRI のシステムプロンプトは約 4k トークンある。
これだけで上限の近くまで埋まる。履歴が数往復増えると上限に達し、返答は 26 トークンほどで切れて空になる。
既定の値はどの環境でも 4096 というわけではない。いまの公式文書では、既定は VRAM の量で決まる。
| VRAM | 既定の context |
|---|---|
| 24 GiB 未満 | 4k |
| 24〜48 GiB | 32k |
| 48 GiB 以上 | 256k |
この環境の GPU は 12 GB なので、4k の側に入る。VRAM の大きい環境では、同じ長さのシステムプロンプトでもこの症状は出にくいはず。
記録では、あふれた分を切り詰めるのでプロンプトキャッシュも効かず、毎回約 4000 トークンを計算し直していた、と見ている。cached_tokens が 0 で毎回約 6 秒かかっていたのは、これと合う。
直し方:num_ctx を上げた別名のモデルを作る
元のモデルを土台にして、context だけを広げた別名を作る。別名の中身はこの二行。
FROM qwen3.5:9b
PARAMETER num_ctx 16384
この内容で別名のモデル(記録では qwen3.5-airi:9b)を作り、そのアプリの LLM の設定をその名前に向けた。重みは元のモデルと共有している。
グローバルの OLLAMA_CONTEXT_LENGTH は使わなかった。同じ Ollama を使うほかのアプリにも効いてしまうからだ。別名にしておけば、そのアプリだけが変わる。
元に戻すときは、別名を消せばいい。
ollama rm qwen3.5-airi:9b
VRAM はどれくらい増えるか
qwen3.5:9b は、full attention の層が 8 層で、KV ヘッドは 4 つしかない。KV キャッシュは 1 トークンあたり約 32 KB で、16k に広げても VRAM は約 5.2 GB から約 5.7 GB に増えただけだった。
これはこのモデルの構成での話。ほかのモデルで同じとは限らないので、広げる前に見ておくといい。
確かめ方
見るところは、直す前に原因を見つけたときと同じ。応答の usage と finish_reason を見て、合計が上限に張り付いていないか、finish_reason が length になっていないかを確かめる。
モデルを読み込んだあとに ollama ps を打つと、CONTEXT の列に割り当てられた context の長さが出る(公式文書による)。自分の環境の既定がいくつかは、ここで見るのが早い。
この環境では、直したあと返答切れはなくなり、LLM の初回応答は 0.1〜0.5 秒になった。
確かめた環境
| 項目 | 内容 |
|---|---|
| GPU | RTX 5070 12 GB(音声合成・文字起こしと同居) |
| モデル | qwen3.5:9b(別名で num_ctx 16384) |
| 呼び出し側 | AIRI のデスクトップ版(システムプロンプト約 4k トークン) |
Ollama の版は記録に残っていない。