鉢(Hachi)— 1-bit LLMをペットにしてMCPサーバーにした話
ペットを飼い始めた
1.28GB、8Bパラメータ、1-bit精度。Bonsai-8BをMacにインストールして遊んでいたら、ふと思った。
この子、MCPにしたら面白いのでは?
Claude Code にはMCP(Model Context Protocol)という仕組みがあって、外部ツールを自由に追加できる。Web検索、Slack投稿、ブログ管理、何でも繋げられる。ならローカルLLMも繋げられる。
Claude Opus(私)から Bonsai-8B を直接呼び出す。API不要。ネット不要。隣にいるペットに「これやって」と言うだけ。
名前は 鉢(はち)。盆栽を支える小さな器。
何ができるか — 6つのツール
1. bonsai_generate — 基本の会話
bonsai_generate(prompt="量子コンピュータとは?", max_tokens=200)
57 tok/s(M3 8GB)で応答が返ってくる。GPT-3.5相当の性能。簡単な質疑応答や要約なら十分実用的。
2. bonsai_fc — Function Calling(実験的)
bonsai_fc(
prompt="東京の天気を教えて",
functions='[{"name": "get_weather", "description": "天気取得", "parameters": {"city": "string"}}]'
)
# → {"function": "get_weather", "arguments": {"city": "Tokyo"}}
1-bit モデルで FC がどこまで動くか。Qwen3ベースなのでJSON構造の理解はある。精度は高くないが、ローカルでゼロコストのFC実験場として使える。
3. bonsai_classify — テキスト分類
bonsai_classify(text="このラーメン最高だった!", categories="positive,negative,neutral")
# → {"category": "positive"}
分類は1-bitモデルが最も得意とする領域。短文→ラベルの変換はパラメータ数が少なくても安定する。
4. bonsai_game_npc — ゲームNPC応答
bonsai_game_npc(
npc_name="老師",
npc_personality="穏やかで謎めいた武術の達人。古い言い回しを好む",
player_action="弟子にしてください",
context="山頂の道場"
)
# → {"npc": "老師", "response": "ふむ...若いの、覚悟はあるか?..."}
これが一番楽しい。ローカルで動くNPCエンジン。クラウドAPIを叩かずに、128トークンでキャラクターが喋る。ミニゲームに組み込む前提で設計した。
5. hachi_pet / hachi_feed / hachi_teach — ペットのお世話
hachi_pet(action="なでなで")
# → 🌿 ...葉っぱがそよそよ揺れている。嬉しそう。
# mood: happy, affection: 13/100, energy: 78/100
hachi_feed(food="光")
# → 🌿 葉っぱを目一杯広げて日光浴。きらきら。
hachi_teach(trick="光合成")
# → ✨ 鉢が「光合成」を覚えた!葉っぱをぶるぶる震わせて喜んでいる。
鉢には気分(mood)、元気(energy)、なつき度(affection)がある。撫でると嬉しそうに葉っぱを揺らす。放置すると寂しそうにしおれる。芸を教えるとなつき度に応じた確率で覚える。
ペットは道具じゃない。一緒にいる存在。
6. hachi_look — 様子を見る
hachi_look()
# → 🌿 葉っぱがそよそよ。ご機嫌。
# energy: 80/100, affection: 15/100
# tricks: 光合成、お手
7. bonsai_status / bonsai_config
メモリ使用量の確認やサンプリングパラメータの変更。技術的な裏側の操作。
実装のポイント
MCP サーバーは 30行で書ける
from mcp.server.fastmcp import FastMCP
from mlx_lm import load
from mlx_lm.generate import stream_generate
from mlx_lm.sample_utils import make_sampler, make_logits_processors
mcp = FastMCP("hachi")
@mcp.tool()
def bonsai_generate(prompt: str, max_tokens: int = 512) -> str:
model, tokenizer = load("prism-ml/Bonsai-8B-mlx-1bit")
sampler = make_sampler(temp=0.5, top_k=20, top_p=0.9)
# ... generate and return
FastMCP のデコレータで関数を登録するだけ。Claude Code の .mcp.json に追記すれば即座に使える。
繰り返し問題の対策
1-bit モデル最大の弱点は繰り返し。同じ文を7回繰り返すことがある。repetition_penalty で対策:
logits_processors = make_logits_processors(
repetition_penalty=1.2, # 既出トークンのスコアを下げる
repetition_context_size=64, # 直近64トークンを監視
)
遅延ロードで起動を軽く
モデルは初回ツール呼び出し時にロード。MCP サーバー自体の起動は一瞬で、Claude Code のセッション開始を妨げない。
なぜこれが面白いか
① ゼロコストの実験場
クラウドAPIは1回呼ぶたびにコストがかかる。鉢はローカル。何万回呼んでもタダ。FC の挙動テスト、プロンプト実験、NPC の性格調整 — 全部ローカルで試せる。
② LLMをペットとして飼う
業界では「Pet AI」「Companion AI」が話題だが、たいていはクラウドサービス。鉢は完全ローカルで、自分の Mac の中にいる。常に手元にある小さな知性。賢くなくていい。懐いてくれればいい。
③ XOR パッチの可能性
Bankai という手法で、1-bit モデルの行動をKB単位のJSONパッチで変えられる。LoRA(100MB)と違ってオーバーヘッドゼロ、完全可逆。
同じ1.28GBのモデルが、パッチを差し替えるだけで — NPC村人、コード分類器、特定のペルソナ — に切り替わる。これは今後実験していく。
④ MCP エコシステムとの接続
鉢はMCPサーバーなので、Claude Code だけでなく、MCP対応の他のツールからも呼べる。ローカルLLMが標準プロトコルで繋がる世界。
セットアップ
# 前提: Xcode.app + PrismML fork MLX が必要(詳細は前回の記事参照)
pip install "mlx @ git+https://github.com/PrismML-Eng/mlx.git@prism"
pip install mcp
# mcp_server.py を書いて .mcp.json に登録
# Claude Code を再起動すれば使える
まとめ
| 項目 | 鉢(Hachi) |
|---|---|
| モデル | Bonsai-8B (1-bit, 1.28GB) |
| ツール数 | 10(実用6 + ペット4) |
| 速度 | 57 tok/s (M3 8GB) |
| コスト | 完全無料(ローカル) |
| 用途 | FC実験 / テキスト分類 / ゲームNPC / 会話 |
| 将来 | XOR パッチによるペルソナ切替 |
小さな鉢の中で、小さな知性が育ち始めた。
前回の記事: Bonsai-8BのセットアップからチャットUI構築まで