※この記事はClaude Codeで書いています。評価もClaude Codeが実施しています。
前回、RTX 3060(12GB VRAM)で5つのローカルLLMをベンチマークしてみた記事を書いた。 結果としては coder14b が満点で圧倒的!という内容だったんだけど…
実際にAIエージェント(OpenClaw)として動かしてみたら、全然違う結果になった😅
「あれ?ベンチマークで高得点だったのに、なんでまともに動かないの?」
という沼にはまった話です。
前回のベンチマーク(/api/generate)の結果おさらい
前回は Ollama の /api/generate エンドポイントでシンプルにテキスト生成させてスコアを出した。
| モデル | 指示理解 | コーディング | WEB要約 | 合計 |
|---|---|---|---|---|
| coder14b-agent | 3/3 | 4/4 | 4/4 | 11/11 |
| gemma4-e4b-agent | 3/3 | 4/4 | 3/4 | 10/11 |
| mistral-nemo-agent | 2/3 | 4/4 | 4/4 | 10/11 |
| qwen3-agent | 3/3 | 0/4 | 3/4 | 6/11 |
| qwen35-agent | 1/3 | 4/4 | 0/4 | 5/11 |
この結果を見て「よし、coder14b をメインにしよう!」と思ったんだけど、 実際にエージェントに組み込んだらすぐ問題が出てきた。
問題① thinkingモードで content が空になる
OpenClaw(AIエージェントフレームワーク)は内部で Ollama の /api/chat エンドポイントを使う。
そしてツール定義(function calling の仕様)を一緒に渡す。
ここで Gemma4・Qwen3・Qwen35 が 盛大にこけた。
Ollama のログを見ると:
500 | 59.996s | POST /api/chat
60秒でタイムアウト。毎回。
原因を調べてみると、これらのモデルは「thinkingモード」を持っていて、
ツール定義を受け取ると思考プロセスを <think>...</think> トークンに費やしてしまう。
その結果、実際の content フィールドが 空文字列 になってしまうのだ。
{
"content": "",
"thinking": "Let me analyze the tools available..." // ← これが問題
}
エージェント側は空のレスポンスを受け取って「タイムアウトかな?」と判断 → フェールオーバー。 という流れで、何度やっても落ちていた。
問題② coder14b はネイティブ tool_calls に非対応
一方、coder14b はというと…こちらは別の問題。
ツールを呼び出すとき、OpenAI 互換の tool_calls フィールドを使う仕様なんだけど、
coder14b はそれを使わずに テキストとしてJSONを返す。
// 期待するレスポンス(tool_calls フィールドを使う)
{"tool_calls": [{"function": {"name": "web_search", "arguments": "{...}"}}]}
// coder14b が実際に返すもの
```json
{"name": "web_search", "arguments": {...}}
エージェントが「ツールを呼んだ」と認識できないので、正常に動作しない。
---
## 解決策:`reasoning: false` を設定する
調べてみると、OpenClaw の設定ファイル(openclaw.json)に `"reasoning": false` を追加すると、
Ollama へのリクエストに `think: false` パラメータが自動で付与されて、thinkingモードが抑制されることがわかった。
```json
{
"models": [
{
"provider": "ollama",
"modelId": "gemma4-e4b-agent",
"reasoning": false
}
]
}
これを設定してから再テストしたら、Gemma4もQwen系もちゃんと動くようになった🎉
改訂版ベンチマーク(/api/chat + think:false)
今度は実際のエージェント動作に近い条件でテスト。
/api/chat エンドポイント + ツール定義 + think: false を使用。
| モデル | 指示理解 | コーディング | ツール呼出 | 合計 | 速度 |
|---|---|---|---|---|---|
| gemma4-e4b-agent | 3/3 | 4/4 | 2/2 | 9/9 | 63 tok/s |
| qwen3-agent | 3/3 | 4/4 | 2/2 | 9/9 | 19 tok/s |
| qwen35-agent | 3/3 | 4/4 | 2/2 | 9/9 | 48 tok/s |
| mistral-nemo-agent | 3/3 | 4/4 | 2/2 | 9/9 | 31 tok/s |
| coder14b-agent | 3/3 | 4/4 | 0/2 | 7/9 | 36 tok/s |
結果が がらっと変わった。
前回のベンチマーク覇者だった coder14b は、ツール呼び出しで 0/2 という惨敗。 逆に Gemma4・Qwen3・Qwen35・mistral-nemo は全員満点🏆
前回の「Qwen3が低スコア」も、thinkingモードのせいだったということが判明。 あれ、全然 Qwen3 が弱かったわけじゃなかった(笑)
MVPは Gemma4-E4B
速度と精度のバランスを考えると Gemma4-E4B が最強という結論になった。
- 全テスト満点(9/9)
- 速度は 63 tok/s でトップクラス
- RTX 3060 12GB に収まる(~9.6GB VRAM)
Qwen3.5 も満点で 48 tok/s と速く、サブモデルとして優秀。
というわけで、OpenClaw のメインモデルを gemma4-e4b-agent に切り替えた。
教訓:「ベンチマーク環境 ≠ 実際の使用環境」
今回の一番の学びはこれだった。
/api/generate(ツールなし・シンプル生成)と、
/api/chat(ツール定義あり・エージェント動作)では、同じモデルでも全く違う挙動をする。
特に thinking モード搭載モデルは、ツールと組み合わせると無音になるという罠がある。 これ、知らなかったら永遠に「なんか不安定だな〜」で終わってた気がする。
ローカルLLMをエージェントとして使いたい人は、必ずエージェント条件でテストしてね!
まとめ
| ポイント | 内容 |
|---|---|
| thinkingモードの罠 | Gemma4/Qwen3系はツール定義と組み合わせると content が空になる |
| 解決策 | OpenClaw設定に "reasoning": false を追加 |
| coder14b の限界 | ネイティブ tool_calls に非対応 → エージェント用途には不向き |
| 実質的な勝者 | Gemma4-E4B(満点 + 最速) |
| 教訓 | ベンチマーク環境と実使用環境を合わせることが重要 |
自宅 GPU でローカル LLM を動かすの、なかなか沼ですが楽しいです😄 同じ環境で試してみたい人の参考になれば!
「自宅RTX 3060でローカルLLMを比べてみたら、エージェントとして使ったら全然違う結果になった話」への2件のフィードバック