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 混合检索 | 是 | 是 | trait | 是 | 是 |
| 图链接抽取器 | 是 | 是 | 是 | 是 | 是 |
| 配方加载器 | 是 | 是 | 是 | 是 | 是 |
| 可插拔后端 | 是 | 是 | 是 | 是 | 是 |
发布时的跨运行时测试合计: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。
一个文件。五个运行时。图操作为零次语言模型调用。本地优先,出自设计。


