鉢(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構築まで