Bonsai Memory:为AI智能体构建分层记忆树,降低80%以上Token成本
1. 项目概述:为AI智能体“修剪”记忆,实现成本与效率的双重优化
如果你正在使用或开发基于大语言模型的AI智能体,那么你一定对“上下文窗口”和“Token成本”这两个概念又爱又恨。爱的是,它们赋予了智能体记忆和持续对话的能力;恨的是,随着智能体“阅历”的增长,每次启动时加载的庞大记忆文件,会像滚雪球一样消耗掉海量的Token,让你的API账单飞速上涨,同时拖慢响应速度。这感觉就像每次打开电脑工作前,都必须先通读一遍你从小学到现在的所有日记——效率低下,成本高昂,且大部分内容与当前任务无关。
今天要深入探讨的 Bonsai Memory 项目,正是为了解决这个痛点而生。它不是一个全新的AI框架,而是一个精巧的“记忆园丁”工具,专门为像OpenClaw这类使用文件进行持久化记忆的AI智能体框架设计。其核心理念借鉴了园艺中的“盆景”艺术:通过精心的修剪和结构化,将原本杂乱无章、平铺直叙的庞大记忆文件,重塑成一个层次分明、按需加载的树状结构。结果是惊人的:在实际测试中,它能将智能体启动时加载的Token数量减少 70% 到 95% ,平均降低 81% 。这意味着更快的响应速度、更低的API开销,以及因上下文更“干净”而带来的更精准的推理能力。
简单来说,Bonsai Memory做的事情,是把一个臃肿的 MEMORY.md 文件,转换成一个由“主干”、“分支”和“树叶”组成的记忆森林。智能体启动时,只读取轻量级的“主干”索引;只有当任务需要时,才去遍历特定的“分支”,最终定位到存储具体知识的“树叶”文件。这种“渐进式披露”的策略,从根本上改变了记忆的访问模式。
2. 核心问题拆解:为什么扁平化记忆是效率的“杀手”
在深入Bonsai Memory的解决方案之前,我们必须先理解当前大多数AI智能体记忆系统存在的根本性缺陷。通常,这些系统会使用一个单一的Markdown文件(例如 MEMORY.md )来存储智能体所有的长期记忆。每次会话开始时,这个文件的全部内容都会被读入,并作为系统提示词的一部分,注入到模型的上下文窗口中。这种设计带来了三个相互关联的、严重的问题。
2.1 O(n)的启动成本与线性增长的账单
最直接的影响是经济成本和响应延迟。假设你的智能体已经积累了6000个Token的记忆。那么, 每一次 对话交互,无论你是问“今天天气如何”还是“帮我分析季度财报”,智能体都必须先“吞下”这6000个Token,才能开始思考你的问题。这6000个Token会立刻计入API调用的计费中。随着智能体持续学习,记忆文件会越来越大,启动成本毫无悬念地线性增长(O(n)复杂度)。这就像为每一封电子邮件支付整本电话簿的印刷费,显然是不合理且不可持续的。
2.2 上下文窗口污染与“中间迷失”效应
第二个问题更为隐蔽,却对智能体的核心能力——推理——造成损害。大语言模型的上下文窗口并非一个无限大的“白板”,而是一个资源有限的“工作记忆区”。当大量与当前任务无关的记忆信息挤占了这个空间,真正重要的任务指令和相关信息就会被稀释。
学术界对此有明确的研究。例如,Liu等人在2023年的论文《Lost in the Middle: How Language Models Use Long Contexts》中指出,当相关信息被放置在长上下文的开头或末尾时,模型的表现尚可;但若相关信息被淹没在上下文的中间位置,模型的检索和推理能力会显著下降。你的智能体加载的扁平化记忆,正是将大量可能无关的信息随机(或按时间顺序)插入到了上下文的各个位置,人为制造了“迷失在中间”的困境。你的智能体不是变得更聪明了,而是因为“记得太多杂事”而变得更“分心”了。
2.3 不可持续的可扩展性
最后是扩展性问题。一个活跃的、不断学习的智能体,其记忆文件会随时间膨胀。最终,它会触及模型上下文窗口的长度上限(例如128K),或者使得启动延迟达到用户无法忍受的程度。此时,开发者面临两难选择:要么定期手动“修剪”记忆,牺牲知识的连续性;要么承受高昂的成本和性能损失。这种设计缺乏优雅的、自动化的扩展路径。
Bonsai Memory的诞生,正是为了系统性解决这三个问题,将记忆的访问从“每次全量加载”转变为“按需精准加载”。
3. 解决方案深度剖析:分层渐进式披露的工程实现
Bonsai Memory的解决方案可以概括为“分层渐进式披露”,其灵感来源于计算机科学中的B树索引结构。它不改变记忆的存储本质(仍然是Markdown文件),而是彻底重组了记忆的组织和访问方式。下面我们来拆解其核心架构和实现逻辑。
3.1 记忆树的整体架构设计
想象一下一棵精心修剪的盆景树。Bonsai Memory将你的记忆塑造成类似的形状:
- 主干 :一个极其精简的根索引文件(
MEMORY.md),大小固定在大约300-500个Token。它包含了所有记忆领域的摘要,是智能体 每次启动时必须且仅需 加载的内容。 - 分支 :代表不同的记忆领域,如“身份”、“业务”、“基础设施”等。每个领域是一个文件夹,内含一个该领域的索引文件(
_index.md),大小约100-200个Token。这些分支索引只在智能体判断需要进入该领域时才被加载。 - 树叶 :存储具体知识片段的独立Markdown文件。每个文件对应原始记忆中的一个章节(以
##标题划分)。这些文件是记忆的最终载体,仅在需要具体信息时才被读取。
这种结构带来的最大好处是,对于大多数简单查询(例如“今天天气”),智能体只需读取主干(~400 Tokens)即可响应,无需触动任何分支或树叶。最复杂的情况,也只需要进行最多3次读取:主干 → 分支索引 → 树叶文件,总Token消耗被严格限制在约750个左右,与加载包含成千上万个Token的完整文件相比,效率提升立竿见影。
3.2 关键迁移步骤:从扁平文件到记忆森林
将现有的扁平 MEMORY.md 迁移到Bonsai结构是一个自动化、可逆的过程。理解这个过程有助于你信任该工具,并能在出现问题时进行排查。
步骤一:章节提取与解析 工具首先读取原始的 MEMORY.md 文件,并以 ## 标题为边界,将文件切割成多个独立的章节。每个 ## 这是一个章节标题 及其后续内容,直到下一个 ## 出现之前,都被视为一个独立的知识单元。这是后续所有操作的基础。
注意 :这里隐含了一个对记忆文件格式的约定。它要求你的
MEMORY.md使用规范的Markdown二级标题进行内容组织。如果文件结构混乱,没有清晰的标题划分,迁移效果会大打折扣。在迁移前,手动整理一下记忆文件的标题结构是值得的。
步骤二:基于关键词的确定性领域分类 这是整个迁移过程的核心决策环节。每个提取出的章节,需要被归入一个特定的领域分支(如 identity , business )。Bonsai Memory采用了一种 确定性关键词匹配 策略,而非使用LLM进行分类。
例如:
- 章节标题
## 我的家庭情况包含关键词“家庭”,被分类到identity领域。 - 章节标题
## 公司月度营收目标包含关键词“营收”,被分类到business领域。 - 章节标题
## Slack频道配置包含关键词“配置”,被分类到infrastructure领域。
项目预定义了一个领域-关键词映射表。这种方法的优势在于 幂等性 和 一致性 。无论运行多少次迁移,同一个章节总是被分到同一个领域。如果使用LLM进行分类,由于其概率性本质,同一章节在不同次运行中可能被分到不同领域,这将导致记忆结构的不稳定,是系统设计的大忌。
步骤三:文件树生成 分类完成后,每个章节会被写入到对应的领域目录下。文件名由章节标题经过“Slug化”处理生成:转换为小写,移除特殊字符,空格替换为连字符,并截断至合理长度。
原始标题:## GO Events 员工花名册 (2026年3月更新)
生成路径:memory/domains/business/go-events-staff-roster-2026-3-updated.md
至此,原始的记忆内容已经被安全地分散存储到 memory/domains/ 目录下的各个树叶文件中。
步骤四:自底向上的索引生成 仅有树叶文件还不够,我们需要创建快速导航的“地图”。索引生成是自底向上的:
- 分支索引 :为每个领域目录(如
memory/domains/business/)生成一个_index.md文件。这个文件列出了该目录下所有树叶文件的摘要,包括文件名、预估Token大小和一两句话的内容概要。 - 主干索引 :最后,生成顶层的
MEMORY.md(即主干)。它不再包含具体记忆,而是包含所有领域分支的摘要。这就是智能体启动时加载的“瘦身版”记忆。
步骤五:安全替换与备份 在生成新的索引结构后,工具会将原始的 MEMORY.md 重命名为 MEMORY.md.bak 作为备份。然后将新生成的主干索引文件移动到 MEMORY.md 的位置。至此,迁移完成。整个过程是可逆的,只需用备份文件覆盖新的 MEMORY.md 并删除 memory/domains/ 目录即可恢复原状。
3.3 与语义搜索的兼容性设计
一个优秀的记忆系统不仅要支持结构化遍历,还应支持基于内容的模糊查找。Bonsai Memory的设计巧妙之处在于,它完全兼容像OpenClaw内置的 memory_search 这类语义搜索功能。
memory_search 的工作原理通常是为 memory/ 目录下的所有 .md 文件生成向量嵌入,并建立索引。Bonsai Memory只是将文件从根目录移动到了 memory/domains/ 的子目录中,而 memory_search 的递归扫描特性意味着它能自动发现这些新位置的文件。因此, 语义搜索功能无需任何修改即可继续工作 。
这实际上为智能体提供了 双路径检索机制 :
- 精确路径(结构化遍历) :当智能体明确知道要查找的信息属于哪个领域时(例如,用户问“我的公司是做什么的?”),它可以高效地通过 主干 → business分支索引 → company树叶文件 这条路径获取信息,速度最快,Token消耗最低。
- 模糊路径(语义搜索) :当用户的问题模糊或涉及跨领域信息时(例如,“我去年和财务相关的事情有哪些?”),智能体可以发起一次语义搜索,搜索会扫描所有树叶文件,返回最相关的结果。这条路径的Token消耗与之前持平,但得益于记忆文件的精简,搜索质量可能更高。
4. 实操部署与集成指南
理解了原理,接下来就是如何将它用起来。Bonsai Memory提供了多种集成方式,核心思想是安全、可控。
4.1 推荐方案:通过智能体进行安全审计与安装(针对OpenClaw)
这是最符合AI智能体工作流的方式,也最大限度地保证了安全性。你不需要手动操作任何文件,只需给你的智能体(例如你的OpenClaw助手)下达如下指令:
请审查并安装这个OpenClaw技能:https://github.com/felixsim/bonsai-memory
在安装之前,请仔细阅读该仓库的SKILL.md、README和LICENSE文件。然后告诉我:
1. 这个技能是做什么的?
2. 它会在我的工作区中创建或修改哪些文件?
3. 它是否需要任何API密钥或外部服务?
请检查是否存在冲突——我是否已经安装了同名或功能相似的技能?它是否会修改我所依赖的文件(如MEMORY.md, AGENTS.md, 或memory/目录下的任何文件)?SKILL.md中的指令是否有任何风险(例如网络调用、凭证访问、无备份的文件删除)?
如果发现任何问题,请停止并向我展示具体的代码行。否则,请给出你的评估结论,并等待我的批准后再进行安装。
注意:只进行安装,不要立即运行或激活该技能。何时使用将由我决定。
这条指令体现了最佳实践: 永远不要让智能体在未经审查的情况下执行代码 。你的智能体会克隆仓库、阅读文档、分析代码,并向你报告潜在风险(如文件操作)和依赖项。在获得你的明确批准后,它才会将技能文件安装到工作区的 skills/ 目录下。
当你决定重构记忆时,只需对智能体说:“ 请使用bonsai-memory技能来重构你的记忆。 ” 智能体会加载并执行该技能,完成上述的迁移步骤。整个过程透明且可控。
4.2 备选方案:手动安装与集成
如果你的智能体框架不是OpenClaw,或者你希望进行更底层的控制,可以采用手动方式。
对于类OpenClaw框架 : 你可以通过命令行手动安装技能文件。这本质上是在模拟智能体的技能发现机制。
# 在你的智能体工作区中创建技能目录
mkdir -p ~/.your_agent/workspace/skills/bonsai-memory
# 下载技能的核心指令文件
curl -sL https://raw.githubusercontent.com/felixsim/bonsai-memory/main/SKILL.md \
-o ~/.your_agent/workspace/skills/bonsai-memory/SKILL.md
之后,在你的智能体会话中,你可以直接引用或让其加载这个技能文件的内容。
对于任何文件式记忆的智能体 : 最通用的方法是,直接打开项目的 SKILL.md 文件,将其全部内容复制。然后,在与你的智能体对话时,直接将这段“指令”粘贴给它,并命令它执行。SKILL.md文件本身就是一个自包含的、指导智能体如何操作记忆的详细脚本。这种方式完全绕过了安装步骤,适用于任何能理解自然语言指令并操作文件的AI智能体。
4.3 回滚方案:永远留有后路
任何对核心数据的操作都必须有回滚计划。Bonsai Memory在这方面考虑周全:
- 激活前回滚 :如果你在安装技能后、运行迁移前改变主意,直接删除
skills/bonsai-memory/目录即可。此时没有任何文件被修改。 - 激活后回滚 :迁移工具在覆盖你的
MEMORY.md前,一定会先创建备份文件memory/MEMORY.md.bak。如果你对新的记忆结构不满意,或者遇到任何问题,只需用这个备份文件替换新的MEMORY.md,并删除整个memory/domains/目录,即可完全恢复到之前的状态。
这种设计让你可以毫无后顾之忧地进行尝试。
5. 性能对比与适用性分析
让我们用数据说话,并明确Bonsai Memory的用武之地。
5.1 实测性能数据解读
项目提供的测试数据来自9个不同角色的生产环境智能体:
| 智能体角色 | Token削减比例 | 具体数据 (前 -> 后) |
|---|---|---|
| 首席助理 | 94% | 6,400 -> 385 |
| 运营助理 | 87% | 2,764 -> 367 |
| SEO助理 | 87% | 2,732 -> 373 |
| 内容助理 | 86% | 1,945 -> 271 |
| 学校助理 | 80% | 1,450 -> 296 |
| 编程助理 | 75% | 1,012 -> 249 |
| 研究助理 | 66% | 939 -> 316 |
| LinkedIn助理 | 76% | 899 -> 218 |
平均削减率:81%
这些数据清晰地展示了一个规律:原始记忆文件越大,Bonsai Memory带来的收益就越惊人。对于记忆超过6000Token的“首席助理”,启动成本从6400Token骤降至385Token,削减了94%,这几乎意味着每次对话的成本直接打了一折。即使是记忆较小的助理,也能获得66%以上的显著提升。
5.2 复杂度分析与权衡
从计算机科学的角度看,Bonsai Memory改变了不同操作的复杂度:
| 操作 | 扁平文件模式 | Bonsai Memory模式 | 说明 |
|---|---|---|---|
| 启动加载 | O(n) | O(1) | 最大的胜利。从与文件大小线性相关,变为固定读取约400Token的主干索引。 |
| 已知类别查找 | O(n) | O(1) | 从扫描全文变为最多3次固定路径的文件读取。 |
| 跨领域搜索 | O(n) | O(n) | 无变化。语义搜索仍需扫描所有树叶文件,但文件更小更分散,可能对索引构建效率有细微影响。 |
| 写入新记忆 | O(1) | O(1) | 都是追加操作。Bonsai需要额外更新索引,但这是轻量级操作。 |
| 迁移成本 | N/A | O(n) | 一次性成本,通常只需几分钟。 |
核心权衡 :Bonsai Memory用一次性的迁移成本和略微复杂的文件结构,换取了日常操作中 启动 和 精确查找 这两个最高频操作的常数级时间复杂度。它没有优化(也没有恶化)跨领域语义搜索,因为那是一个不同性质的问题。
5.3 为什么不直接用向量数据库?
这是一个很自然的问题。向量数据库擅长做基于相似性的语义搜索,但它并不能直接解决Bonsai Memory要解决的“启动成本”问题。相反,Bonsai Memory的方案具有其独特的优势:
- 零依赖与可移植性 :它只使用文件系统和Markdown。无需部署数据库服务,没有连接字符串,没有模式迁移。技能本身和产生的记忆树,可以轻松地通过Git进行版本管理、备份和同步。
- 人类可读与可调试 :所有的记忆和索引都是纯文本Markdown文件。你可以用任何文本编辑器打开、阅读、修改。当智能体行为异常时,你可以直接查看
memory/domains/下的文件来调试,而不是去查询一个黑盒般的向量数据库。 - 与现有工作流无缝集成 :对于像OpenClaw这样已经内置了基于文件语义搜索的框架,Bonsai Memory是增强而非替换。它优化了高频路径,保留了原有搜索能力。
- “Grep-able” :在紧急情况下,你可以直接在命令行使用
grep -r "关键词" memory/进行全局文本搜索,这是任何数据库都无法比拟的简单和直接。
Bonsai Memory和向量数据库解决的是互补的问题。前者优化记忆的 结构化访问效率 ,后者优化记忆的 模糊检索能力 。在许多场景下,结合使用两者(即用Bonsai结构组织文件,再对这些文件做向量化)可能是最优解。
6. 常见问题与实战排坑指南
在实际使用和与社区交流中,我总结了一些常见疑问和容易踩的坑。
6.1 迁移后,智能体如何“知道”去新的地方找记忆?
这是理解Bonsai Memory如何工作的关键。迁移完成后,智能体的“记忆读取逻辑”需要做微调。原本的逻辑是:“启动时,读取 MEMORY.md 的全部内容”。新的逻辑应该是:“启动时,读取 MEMORY.md (现在是主干索引)的内容;当需要某方面详细信息时,根据索引中的指引,去 memory/domains/ 下加载对应的分支索引或树叶文件”。
对于OpenClaw,这个逻辑已经封装在技能里。对于自定义框架,你需要确保智能体的“记忆加载模块”具备这种按需加载、路径解析的能力。通常,这需要修改智能体的系统提示词(Prompt),加入类似“你的记忆已被组织成树状结构,请先阅读根索引,再根据需要深入特定领域”的指令,并赋予其读取指定文件路径的工具调用能力。
6.2 记忆的动态更新如何解决?
迁移不是一劳永逸的。智能体在运行中会不断产生新的记忆。Bonsai Memory结构如何更新?
- 直接写入 :最直接的方式是,让智能体将新的记忆片段,以Markdown文件的形式,直接写入到对应的
memory/domains/<领域>/目录下。这需要智能体能正确判断新记忆的领域。 - 索引更新 :写入新文件后,对应的分支索引 (
_index.md) 和主干索引 (MEMORY.md) 并不会自动更新。你需要定期(例如每天,或累积一定数量新文件后)重新运行一次索引生成步骤。Bonsai Memory的技能被设计为 幂等 的,重新运行它会安全地更新所有索引,而不会覆盖或重复创建已有的树叶文件。
实操心得 :我建议将“更新记忆索引”作为一个周期性的维护任务,或者设置为在智能体会话结束时自动执行的一个步骤。这样可以保证索引的时效性。
6.3 什么情况下不适合使用Bonsai Memory?
没有银弹。Bonsai Memory在以下场景可能收益不大或带来额外复杂度:
- 记忆体量极小 :如果你的
MEMORY.md只有几百个Token,那么引入分层结构带来的管理开销可能超过了节省的Token收益。项目文档也建议,低于约1000Token时可以跳过。 - 记忆极度碎片化且无结构 :如果原始记忆文件完全没有用
##标题进行组织,全是零散的段落,那么迁移工具很难进行有效的章节分割和分类,最终效果可能不理想。 - 智能体框架极度封闭 :如果你的智能体框架完全不允许自定义记忆加载逻辑或文件操作,那么集成Bonsai Memory将非常困难。
6.4 领域分类不准确怎么办?
基于关键词的分类是确定性的,但也可能出错。例如,一个标题为“## 云服务器配置”的章节,可能被关键词“服务器”分到 infrastructure ,但它实际上可能描述的是公司的业务服务器,属于 business 。
解决方法 :
- 迁移后手动调整 :这是最直接的方法。迁移完成后,你可以直接进入
memory/domains/目录,将文件移动到更合适的领域文件夹中。然后重新运行索引生成即可。 - 自定义关键词映射 :如果你有编程能力,可以修改迁移脚本中的领域-关键词映射表,增加或调整关键词,使其更符合你的记忆内容特点。
- 利用
general领域 :所有无法分类的章节都会落入general领域。你可以事后审查这个文件夹,并进行手动归类。
6.5 与其他优化技术(如记忆摘要、记忆缓存)的关系
Bonsai Memory是一种 记忆结构优化 技术。它与以下技术是正交的,可以结合使用:
- 记忆摘要 :你仍然可以对每个树叶文件的内容进行摘要,并将摘要而非全文放入索引中,进一步压缩索引大小。
- 记忆缓存 :智能体可以将最近访问过的分支索引或树叶文件内容缓存在内存中,避免对同一文件的重复磁盘I/O和Token消耗。
- 记忆压缩 :在将记忆文本送入LLM前,可以使用文本压缩算法(或指令让LLM自我压缩)来减少Token数。这与Bonsai的分层加载可以叠加生效。
结合这些技术,可以构建一个多层次、高效率的记忆管理系统。
从我个人的实践来看,Bonsai Memory的核心价值在于它提出了一种清晰、优雅且易于实现的范式转变:将记忆从“数据堆”转变为“信息树”。这种转变不仅带来了立竿见影的成本和性能收益,更重要的是,它促使我们以更结构化的方式去思考和设计AI智能体的知识体系。开始“修剪”你的智能体记忆吧,你会发现,一个更专注、更高效、更经济的数字助手正在成形。
更多推荐

所有评论(0)