Skip to content

OpenClawをローカルLLMで動かしてみた備忘録とハマりどころ

公開日: 2026-02-19

AnthropicなどのクラウドLLMはAPI料金が高くつくため、コスト削減も兼ねて、自律型AIエージェント「OpenClaw」をローカルLLM環境で動かしてみることにしました。

結論から言うと無事に動作し、最終的な応答速度もクラウドLLMと遜色ないレベルでした。ただ、純粋な賢さ(推論能力やタスク遂行力)においては、やはりクラウドLLMの方が圧倒的に優れていたため、結局のところ今は使っていません……。

とはいえ、設定ファイルの紐付けやOllamaのModelfileの仕様でいくつかハマりどころがあったので、ローカル環境構築の備忘録として手順を残しておきます。

実行環境 (PCスペック)

まずは検証に使用したPCのスペックです。ローカルLLMを動かすため、GPUのVRAM容量が鍵になります。

  • OS: Windows 11 + WSL2 (Ubuntu 24.04 LTS)
  • CPU: 13th Gen Intel(R) Core(TM) i9-13900F (2.00 GHz)
  • GPU: NVIDIA GeForce RTX 4090 (VRAM 24 GB)
  • RAM: 32.0 GB (4800 MT/秒)

試したモデルとレスポンスの所感

今回試したモデルは以下の3つです。

モデルパラメータ数結果
llama3.1:8b8B応答が遅く実用に至らず
deepseek-r1:32b32BTool Calling未対応でエラー(後述)
qwen3:14b14B応答速度・精度ともに良好で採用

最初は軽量な llama3.1:8b を試してみたのですが、返答が遅く、エージェントとして実用的なスピードが出ませんでした。原因の特定には至っていませんが、Ollamaのデフォルトのコンテキスト長設定(num_ctx)やモデルの量子化方式の違いが影響している可能性があります。

次に deepseek-r1:32b を試しましたが、Tool Callingに対応しておらずエラーとなりました(ハマりどころのセクションで詳述)。

最終的に qwen3:14b を採用しました。14Bサイズであれば RTX 4090(VRAM 24GB)に余裕を持って収まり、GPUオフロードも完全に行えます。応答速度はクラウドLLMと遜色ないレベルで、エージェントとして十分に実用的でした。

デバッグに必須のコマンド

OpenClawをローカルで試行錯誤する際、裏で何が起きているか把握できないと解決が難航します。 以下のコマンドでGatewayを起動すると、詳細なログ(verbose)が出力されるため、APIエラーや原因の特定に非常に便利でした。

bash
openclaw gateway --port 18789 --verbose

ハマりどころと解決策

設定を進める中で、大きく2つのポイントで躓きました。

1. JSON設定ファイルにおけるモデルの紐付け関係

設定ファイル(JSON)の記述で、プロバイダーとモデルの紐付けが初見では少し分かりにくい部分がありました。

プロバイダー設定のキー名(providers.ollamaollama など)と、モデル配列内のID("id": "qwen3:14b")は任意の値で定義できます。しかし、エージェント側の設定である agents.defaults.models では、この2つを組み合わせた <プロバイダー名>/<モデルID> の形式で指定する必要があります。

今回の例では、プロバイダーを ollama、モデルIDを qwen3:14b としたため、エージェント側での指定キーは ollama/qwen3:14b となります(末尾の最終的な設定ファイルを参照してください)。

2. OllamaのModelfileに「Tool Calling」の記載がないとエラーになる

最初はdeepseek-r1:32bを使用しようとしていましたが、実行時に以下のエラーが発生してしまいました。

json
Ollama API error 400: {"error":"registry.ollama.ai/library/deepseek-r1:32b does not support tools"}

原因は、Ollama側のModelfileにツール呼び出し用のテンプレートが不足していたことでした。

以下のコマンドで現在のModelfileを確認できます。 OpenClawは自律的に外部操作を実行するため、LLM側がツール呼び出し(Tool Calling)をサポートしている必要があります。

bash
ollama show --modelfile deepseek-r1:32b

この出力結果の中に {{- if .Tools }} というセクションが含まれていない場合、OpenClawからツールを使うことができません。

最終的な設定ファイル (~/.openclaw/openclaw.json)

色々と試行錯誤した結果、最終的に無事動作した設定ファイル(抜粋)は以下の通りです。

json
{
  "models": {
    "mode": "merge",
    "providers": {
      "ollama": {
        "baseUrl": "http://127.0.0.1:11434/v1",
        "apiKey": "ollama-local",
        "api": "ollama",
        "models": [
          {
            "id": "qwen3:14b",
            "name": "qwen3:14b (Local)",
            "reasoning": true,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 400000,
            "maxTokens": 8192
          }
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "local"
      },
      "models": {
        "ollama/qwen3:14b": {
          "alias": "local"
        }
      }
    },
    "workspace": "/home/user/.openclaw/workspace",
    "compaction": {
      "mode": "safeguard"
    },
    "maxConcurrent": 4,
    "subagents": {
      "maxConcurrent": 8
    }
  }
}

なお、contextWindow は qwen3 の公式スペックに合わせて 400000 を指定していますが、VRAM 24GB の環境では実際にこのサイズのコンテキストを使い切ることはできません。Ollama がメモリに収まる範囲で自動的に処理するため、動作上の問題はありません。

これで、ローカルの qwen3:14b を使ってOpenClawを自律動作させることができるようになりました。同様の環境構築を考えている方の参考になれば幸いです。