加入 Hanzo 测试,任意付费方案立减 50%

Hanzo Brain:面向智能体的本地优先知识图谱

一个 SQLite 文件,你的智能体从每个运行时读取它。图操作不做语言模型往返,写入时同时做 FTS5、向量和带类型边的抽取。

本页内容

你的智能体聪明,但健忘。我们把这件事修好了。今天交付 Hanzo Brain:一个二进制,位于 ~/.hanzo/brain/brain.db 的一个 SQLite 文件,以及 TypeScript、Python、Rust、Go 和 C++ 上同一套算法表面。把 markdown 文件放进 ~/.hanzo/workspace/。大脑会吞下它,抽出带类型的边,并为混合检索建立内容索引。不调用语言模型。图谱会累积。

这是每个 Hanzo 运行时的记忆层:机器人、MCP 服务器、Hanzo Node,以及你嵌进自己宿主的任何东西。

大脑是什么

大脑是同一进程里的三件事:

  1. 页面 — 用短标识寻址的内容,可以从任何地方写入,并在磁盘上被监视。
  2. 边 — 带类型的关系(mentions、attended、works_at、invested_in、founded、advises),每次写入时用正则和角色推断抽出。不用语言模型。
  3. 事实 — (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 读取,你读到的就是服务器写下的那个文件。

功能TSPythonRustGoC++
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 做备份
vfsS3 上的流式块文件系统,大小不限
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。


一个文件。五个运行时。图操作为零次语言模型调用。本地优先,出自设计。

评论

使用 Hanzo ID 登录后即可评论。

正在加载评论…

继续阅读