Hanzo Brain:面向代理的本機優先知識圖譜
一個 SQLite 檔案,你的代理從每個執行環境讀取它。圖操作不做語言模型往返,寫入時同時做 FTS5、向量和帶型別邊的抽取。

本頁內容
你的代理聰明,但健忘。我們把這件事修好了。今天交付 Hanzo Brain:一支二進位檔,位於 ~/.hanzo/brain/brain.db 的一個 SQLite 檔案,以及 TypeScript、Python、Rust、Go 與 C++ 上同一套演算法表面。把 markdown 檔案放進 ~/.hanzo/workspace/。大腦會吞下它,抽出帶型別的邊,並為混合檢索建立內容索引。不呼叫語言模型。圖譜會累積。
這是每個 Hanzo 執行環境的記憶層:機器人、MCP 伺服器、Hanzo Node,以及你嵌進自己宿主的任何東西。
大腦是什麼
大腦是同一行程裡的三件事:
- 頁面 — 用短識別定址的內容,可以從任何地方寫入,並在磁碟上被監看。
- 邊 — 帶型別的關係(
mentions、attended、works_at、invested_in、founded、advises),每次寫入時用正規表示式和角色推斷抽出。不用語言模型。 - 事實 —
(subject, predicate, object, ts, confidence)元組,可以跨工作階段即時查詢。
頁面有 FTS5 索引。邊在 (source, target, type) 上有主鍵。事實有識別與時間戳。綱要短到可以記在腦子裡:
CREATE TABLE pages (slug TEXT PRIMARY KEY, content TEXT, frontmatter TEXT, updated_at TEXT);
CREATE VIRTUAL TABLE pages_fts USING fts5(content, content='pages', content_rowid='rowid');
CREATE TABLE edges (source TEXT, target TEXT, type TEXT, evidence TEXT, PRIMARY KEY (source, target, type));
CREATE TABLE facts (id TEXT PRIMARY KEY, subject TEXT, predicate TEXT, object TEXT, source TEXT, ts TEXT, confidence REAL);
這就是全部契約。每個後端都遵守它。每個執行環境都寫出逐位元組相同的檔案。
為什麼不用語言模型來抽取
基於語言模型的抽取器在每次寫入時燒掉詞元、延遲和錢。它們讓各次執行之間產生漂移。它們讓圖譜不確定。
大腦在寫入時用正規表示式和角色推斷抽邊。它快,它免費,同樣的輸入每次都得到同樣的邊。當你吞入 "Alice founded Acme. She invested in Foobar," 時,你會得到:
people/alice -[founded]-> companies/acme
people/alice -[invested_in]-> companies/foobar
每一次。在每個執行環境上。沒有往返。
如果還想在上面做語言模型增強,實體消歧、主張核驗、摘要,就在這張確定的圖上呼叫你的模型。圖是基底。語言模型是可選的收尾。
一個檔案。每個執行環境。
同一個 brain.db 能在 TypeScript、Python、Rust、Go 與 C++ 裡打開。沒有格式翻譯,也沒有遷移。如果你在伺服器上從 hanzobot/go 寫入,在瀏覽器工作執行緒裡從 @hanzo/bot-memory 讀取,你讀到的就是伺服器寫下的那個檔案。
| 功能 | TS | Python | Rust | Go | C++ |
|---|---|---|---|---|---|
| BrainStore 介面 | 支援 | 支援 | 支援 | 支援 | 支援 |
| SQLite(預設) | 支援 | 支援 | 支援 | 支援 | 支援 |
| FTS5 混合檢索 | 支援 | 支援 | 特性 | 支援 | 支援 |
| 圖連結抽取器 | 支援 | 支援 | 支援 | 支援 | 支援 |
| 配方載入器 | 支援 | 支援 | 支援 | 支援 | 支援 |
| 可抽換後端 | 支援 | 支援 | 支援 | 支援 | 支援 |
發布時的跨執行環境測試合計:121 TS + 53 Python + 58 Go + 38 Rust (mcp) + 38 Rust (node) + 98 C++ = 406 項測試,全部通過。每個執行環境交付同一套融合、同一套重排(MMR)、同一套 RRF、同一套短識別正規化、同一套邊抽取器。
可以從 MCP 查詢
大腦透過 MCP 暴露為三個工具:
brain.recall <entity>— 關於一個實體曾經斷言過的每條事實,帶時間戳。brain.search <query>— FTS 與向量的混合檢索,用 RRF 融合,可選 MMR 重排。brain.ingest <slug> <content>— 寫一頁,自動抽邊,更新 FTS。
每個與 Hanzo Node、Hanzo MCP 伺服器,或建在 hanzobot/* 上的機器人交談的代理,都免費得到這些工具。沒有邊車,沒有額外服務,也沒有另一套要維運的資料庫。
Go 的單一二進位路徑:
go install github.com/hanzobot/go/cmd/hanzo-bot@latest
hanzo-bot brain init # opens ~/.hanzo/brain/brain.db
hanzo-bot brain ingest people/alice.md
hanzo-bot brain recall people/alice
hanzo-bot brain search "founded"
Python:
from hanzo_memory.graph_links import extract_edges
edges = extract_edges(slug="people/alice", content="Alice founded Acme.")
Rust,嵌在 hanzo-mcp 裡面:
use hanzo_mcp::brain::{extract_edges, slugify};
let edges = extract_edges("people/alice", "Alice is CEO of Acme.", Some("person"));
可抽換儲存,同一份契約
SQLite 是預設。它夠一台筆記型電腦上的前十萬頁。超出之後,登記另一個後端,不用改應用程式碼:
| 後端 | 何時 |
|---|---|
sqlite | 單人,< 100K 頁 |
qdrant | 大規模向量 ANN |
meilisearch | 大規模關鍵詞 FTS |
zapdb | 作為規範的多語言原生儲存 |
replicate | 把 SQLite 的 WAL 串流到 S3 做備份 |
vfs | S3 上的串流區塊檔案系統,大小不限 |
postgres | 多租戶團隊部署 |
多機上呈 SQLite 形狀的分散式語意,我們用 ZAP 傳輸加上 Quasar 共識和 zapdb。大腦保持不變。位元組進、位元組出的契約仍然成立。
會累積的記憶
大腦的意義不是一個資料庫。它是假設的轉變。你的代理不再每次工作階段從空白開始。一年前寫的 markdown 已經是一張圖。昨天的對話產生了邊和事實,今天的工作階段可以查詢它們,而不必為此付詞元。兩台機器上的兩個代理可以透過 replicate 共享 brain.db,並匯合到同一視圖。
這就是我們說的累積記憶。圖譜長大。模型變便宜。使用者看到一個記得住的助手。
拿到這顆大腦
- TypeScript 正本(隨機器人一起交付):
npm install -g @hanzo/bot && hanzo-bot serve - Python:
pip install hanzo-memory - Go 單一二進位:
go install github.com/hanzobot/go/cmd/hanzo-bot@latest - Rust:
hanzoai/node與hanzoai/mcp的工作區成員 - C++:僅標頭檔,位於
hanzobot/cpp/include/hanzo/brain/
原始碼:github.com/hanzoai/brain。授權:MIT。
一個檔案。五個執行環境。圖操作為零次語言模型呼叫。本機優先,出自設計。


