深度解析 OpenHuman:开源个人 AI 超级智能的 Memory 架构设计
作为 OpenHuman 的 Contributor,我从源码层面拆解这个项目的核心------Memory Tree 架构。如果你对 AI Agent 的长期记忆系统感兴趣,这篇文章会给你一个全新的视角。
一、OpenHuman 是什么?
OpenHuman 是一个开源的个人 AI 超级智能助手(GitHub 22k+ stars),由 tinyhumansai 团队开发,目前处于 early beta 阶段。
它的核心理念很简单:把你的所有数据源(Gmail、Notion、GitHub、Slack、Calendar 等 118+ 集成)通过 OAuth 一键连接,每 20 分钟自动拉取数据,压缩成结构化知识存到本地。这样 Agent 不需要冷启动,连上账号就能理解你的完整上下文。
几个关键特性:
- 本地优先:数据存你自己机器上,不上传云端
- Model Routing:自动把任务分给不同 LLM(推理/快速/视觉)
- TokenJuice:Token 压缩引擎,号称降低 80% 成本
- 桌面端虚拟形象:能说话、能加入 Google Meet
- 技术栈:Rust 70% + TypeScript 26%,基于 Tauri 构建桌面应用
灵感来自 Karpathy 的 Obsidian wiki 工作流------用结构化的本地知识库替代碎片化的云端数据。
二、Memory 模块:整个系统的核心
OpenHuman 最有意思的部分不是 UI,不是集成,而是它的 Memory 架构。这是我深入源码后最大的收获。当然这也跟我感兴趣的方向有关。
2.1 分层架构
Memory 模块采用经典的分层设计,从下到上:
scss
┌──────────────────────────────────────┐
│ conversations/ slack_ingestion/ │ 领域适配层
├──────────────────────────────────────┤
│ tree/ (bucket-seal 检索管道) │ 新检索架构
├──────────────────────────────────────┤
│ ingestion/ (提取+分块) │ 文档摄入层
├──────────────────────────────────────┤
│ store/ (UnifiedMemory 后端) │ SQLite + FTS5 + 向量
├──────────────────────────────────────┤
│ traits.rs (Memory trait) │ 抽象契约层
└──────────────────────────────────────┘
第一层:抽象契约(traits.rs)
定义了 Memory trait,所有存储后端必须实现的接口:
rust
#[async_trait]
pub trait Memory: Send + Sync {
fn name(&self) -> &str;
async fn store(&self, namespace: &str, key: &str, content: &str, ...) -> Result<()>;
async fn recall(&self, query: &str, limit: usize, opts: RecallOpts<'_>) -> Result<Vec<MemoryEntry>>;
async fn get(&self, namespace: &str, key: &str) -> Result<Option<MemoryEntry>>;
async fn forget(&self, namespace: &str, key: &str) -> Result<bool>;
// ...
}
记忆分类用 MemoryCategory 枚举:
Core:长期事实、用户偏好(类似 Semantic Memory)Daily:时间性活动日志(类似 Episodic Memory)Conversation:对话上下文Custom(String):自定义扩展
有意思的是,OpenHuman 用 namespace 做隔离,而不是固定的记忆类型枚举。这意味着任何数据源(Gmail、Slack、GitHub)都可以是一个独立的 namespace,设计上比 Mem0 的固定分类更灵活。
第二层:统一存储(store/)
UnifiedMemory 是生产环境的后端实现,一个 SQLite 数据库搞定所有事情:
- FTS5 做关键词搜索
- 向量表做语义检索
- 图表做实体/关系三元组
对比很多 RAG 系统用 FAISS + Redis + PostgreSQL 的组合拳,OpenHuman 选择了 SQLite 一站式方案。这对"本地优先"的设计理念来说是正确的选择------用户不需要装一堆中间件。
2.2 Memory Tree:最精华的设计
Memory Tree 是 OpenHuman 最独特的部分,也是它和 Mem0、MemGPT、Zep 等方案根本的最大的区别。
传统 RAG 的检索流程是:query → embedding → 全库搜索 → rerank → 返回。这是查询时融合。
OpenHuman 的 Memory Tree 是写入时就建好分层摘要树,查询时直接在树上检索。思路完全不同------更像人脑记忆的组织方式:先归类再回忆,而不是每次全库搜索。
数据流管道:
arduino
原始数据(聊天/邮件/文档)
↓
canonicalize/ → 统一成标准 Markdown + 元数据
↓
chunker.rs → 切成 ≤3000 token 的块,确定性 ID
↓
content_store/ → 每块存成 .md 文件到磁盘
↓
store.rs → SQLite 持久化(块、分数、摘要、热度)
↓
score/ → 打分(embedding + 实体提取)
↓
三层树结构:
tree_source/ → 源级别摘要(如"Gmail 的摘要")
tree_topic/ → 主题级别摘要(如"关于 Rust 的所有内容")
tree_global/ → 全局每日摘要
↓
retrieval/ → 检索接口
三层树结构是关键:
- tree_source:按数据源聚合。你的 Gmail 有一棵树,GitHub 有一棵树,Slack 有一棵树。每棵树内部有 L0 buffer → L1 seal → cascade 的层级结构。
- tree_topic:按实体和主题聚合,根据热度(hotness)懒加载。高频访问的主题会被优先构建摘要。
- tree_global:每日全局摘要,给 Agent 一个"今天发生了什么"的全局视角。
这种设计的好处是:检索时不需要扫全库,而是根据查询意图定位到对应的树节点,直接拿到已经组织好的摘要。对于个人助手这种需要跨时间跨数据源理解上下文的场景,比纯向量检索高效得多。
2.3 与 Mem0 / MemGPT / Zep 的对比
| 维度 | OpenHuman | Mem0 | MemGPT | Zep |
|---|---|---|---|---|
| 存储后端 | SQLite 一站式 | 多后端可选 | 层级式内存 | PostgreSQL |
| 检索方式 | 分层摘要树 | 向量检索 | 上下文窗口管理 | 混合检索 |
| 数据组织 | Namespace 隔离 | 固定分类 | 对话为中心 | Session 为中心 |
| 本地优先 | ✅ 完全本地 | ❌ 云优先 | ❌ 需要 API | 部分支持 |
| 多源集成 | 118+ 数据源 | 需自定义 | 无 | 有限 |
OpenHuman 的优势在于:它不只是一个 memory 库,而是一个完整的个人数据中心。劣势在于:项目还很年轻,代码迭代速度快但稳定性有待验证。
三、参与贡献的真实体验
我给 OpenHuman 贡献了两个 PR(均已被 merge):
PR #1629:Windows 开发环境文档
以新手身份走了一遍 Windows 上的完整 setup 流程,发现了好几个文档没覆盖的坑:VS Build Tools 的安装、LLVM/Clang 依赖、CMake 依赖、PATH 长度限制问题等。把这些整理成 CONTRIBUTING.md 的 Windows 章节。
PR #1891:Memory chunker 的 bug 修复
split_on_lines 函数在遇到超长单行(比如 25000 字符的无换行段落)时,不会拆分,直接当一个 chunk 输出。这导致:
- embedding 成本是正常的 125 倍
- 检索时返回一个巨大的 blob 而不是精确的片段
修复方案:当单行超过 max_chars 时,按词边界(split_whitespace)拆分,同时保证超长的单词(如 URL)不被拆断。创始人 senamakel 在我的基础上进一步完善了实现,最终合并。
整个贡献过程的感受:
- 项目维护很活跃,PR 从提交到 merge 通常在 1-3 天
- 有 CodeRabbit bot 做自动 review,代码质量有保障
- 创始人会直接在你的分支上迭代,协作效率很高
- 每个子模块都有 README,代码可读性好
四、总结
OpenHuman 值得关注的原因不是因为它现在多好用,而是因为它的 Memory Tree 架构代表了个人 AI 助手记忆系统的一个新方向:不是查询时暴力搜索,而是写入时就建好结构化的知识树。
如果你在做 AI Agent、RAG 系统、或者对个人知识管理感兴趣,建议去读一下 src/openhuman/memory/ 的源码,特别是 tree/ 目录下的实现。
相关链接:
- GitHub:github.com/tinyhumansa...
- 我的 PR #1629(文档):github.com/tinyhumansa...
- 我的 PR #1891(代码):github.com/tinyhumansa...
本文作者是 OpenHuman 的 Contributor,从源码阅读和实际贡献的角度分享对项目的理解。如有技术细节的偏差,欢迎指正。