動かざることバグの如し

近づきたいよ 君の理想に

Qwen3.5-27BでローカルLLM x picoclawを試す

環境

  • Ubuntu 24.04

概要

せっかくRTX4090を持っているなら、ローカルLLMでAIエージェントを運用したくなる。picoclawを実際に試してみたメモだ。

今回はllama.cppでQwen3.5-27B-GGUFを動かしている。ここでは詳しい起動方法の説明はせず、すでに起動しているものとする。

huggingface.co

AIエージェントに手元のPC環境を壊されるのは避けたかったので、NUCにインストールしたのだが、openclawは重すぎて起動に1分以上かかってゴミだった。そこでpicoclawを試してみたところ、Go言語で書かれていて高速かつ軽量だった。

インストール

今回は自分でビルドしたが、バイナリファイルの公式配布もあったのでこっちからダウンロードするほうが早いかもしれない。

git clone https://github.com/sipeed/picoclaw.git

cd picoclaw
make deps

# Build core binary
make build

# Build Web UI Launcher (required for WebUI mode)
make build-launcher

# Build for multiple platforms
make build-all

# Build for Raspberry Pi Zero 2 W (32-bit: make build-linux-arm; 64-bit: make build-linux-arm64)
make build-pi-zero

# Build and install
make install

初期設定

エージェントと対話するコマンド

picoclaw onboard

ゲートウェイを起動 Telegram/Discord等のチャンネル連携する場合はこのコマンドを起動し続けておく必要がある

picoclaw gateway

モデルの設定

model_listの配列に以下を追記する。裏にはllama.cppが起動している。

{
  "model_name": "deep01-local",
  "model": "openai/local-model",
  "api_base": "http://192.168.xx.xx:8000/v1",
  "api_key": "dummy"
},

そしてagents.defaultsの設定を以下にする。

{
  "session": {
    "dm_scope": "per-channel-peer"
  },
  "version": 2,
  "agents": {
    "defaults": {
      "provider": "openai",
      "model_name": "deep01-local",
      (略)

会話のターン数について

picoclawでは、会話が長くなると全ての履歴をLLMに送るわけではない。コンテキスト予算に応じて動的に調整される仕様になっている。

基本の流れは以下の通りだ。

  • セッション(全履歴をJSONL保存)
  • contextManager.Assemble() でトークン予算チェック
  • 予算超過なら圧縮してLLMへ送信

LLMに送られる内容は以下の3つだ。

  1. システムプロンプト(静的情報 + 動的コンテキスト + 要約)
  2. 会話履歴(圧縮済みの過去メッセージ、古いものは削除または要約に置き換え)
  3. 現在のメッセージ(今回のユーザー入力)

3層の圧縮戦略が存在する。

フェーズ タイミング 内容
予防的圧縮 LLM呼び出し前 予算超過を検知したら実行
強制圧縮 予算大幅超過時 古い約50%のターンを削除してサマリーに追記
非同期サマリー化 ターン完了後(バックグラウンド) 20メッセージ超またはトークン75%超でLLMが要約を生成

閾値は以下の通りだ。

  • SummarizeMessageThreshold: 20メッセージを超えるとサマリー化
  • SummarizeTokenPercent: コンテキストウィンドウの75%超えでサマリー化
  • 強制圧縮: 古い50%のターンを削除し、整合性のためツール呼び出しシーケンスは分割しない

要するに、短い会話なら全部送られるが、会話が長くなると古いメッセージはLLMが生成した要約に置き換えられ、コンテキスト上限に収まるよう自動調整される仕組みだ。

結局以下の設定にした。ローカルLLMはどれだけトークン使っても無料なので思わずロングコンテキストに設定したくなるが、 コンテキスト量が増えるとAPIと違って生成がどんどん遅くなってしまう。

"agents": {
  "defaults": {
    "max_tokens": 32768,
    "context_window": 40000,
    "summarize_message_threshold": 20,
    "summarize_token_percent": 50,
  }
},

明示的に会話履歴をクリアしたい場合は「/clear」と送信する。(ターミナル、Discordともに有効)

wikipedia MCPを使う

Wikipedia MCPを使うことで、エージェントがWikipediaの情報を検索・参照できるようになる。これにより、最新の知識や詳細な事実確認が必要な質問に対して、信頼性の高い情報源に基づいた回答が可能となる。

特に、最新のニュースや専門的な知識について聞かれた際に、LLMの学習データに含まれていない情報を補完できるのがメリットだ。

github.com

設定は以下のように行う。

     "mcp": {
-      "enabled": false,
+      "enabled": true,
       "discovery": {
         "enabled": false,
         "ttl": 5,
@@ -477,7 +485,14 @@
         "use_bm25": true,
         "use_regex": false
       },
-      "max_inline_text_chars": 16384
+      "max_inline_text_chars": 16384,
+      "servers": {
+        "wikipedia": {
+          "enabled": true,
+          "command": "uvx",
+          "args": ["wikipedia-mcp", "--language", "ja"]
+        }
+      }