Interview AiBoxInterview AiBox 实时 AI 助手,让你自信应答每一场面试
OpenClaw Memory 实现详解:AI Agent 的三层记忆架构
深入技术分析 OpenClaw 的记忆系统——如何分离持久化文件、可检索索引和运行时召回机制。理解生产级 AI Agent 记忆设计的必读材料。
- sellAI 洞察
- sellAi Agent Tools
- sellTechnical Deep Dive
大多数 AI Agent 都声称有"记忆"。但很少有人解释这在实际实现中到底意味着什么。OpenClaw 的架构揭示了一种三层方法论,将持久化存储、可检索索引和运行时召回分离——这是生产团队应该仔细研究的模式。
记忆幻觉
当开发者说"AI 有记忆"时,他们通常意味着两种情况之一:
- 上下文持久化:对话历史被维护
- 基于文件的存储:笔记被写入磁盘
两者都不是实际意义上的真正记忆。真正重要的是:AI 是否在重要时刻记住重要的事情,而不污染上下文?
OpenClaw 用三层架构来回答这个问题,值得详细了解。
第一层:持久化记忆文件
基础层将持久信息存储在工作区文件中:
memory/
├── YYYY-MM-DD.md # 每日整合笔记
├── user-profile.md # 用户偏好和模式
├── project-context.md # 项目特定知识
└── decisions.md # 做出的架构决策这些文件是"长期记忆",会话结束后依然存在。与上下文窗口不同,它们无限期持久化。与简单笔记不同,它们有结构化的组织。
关键特性:
- 位置感知:文件与代码共存于工作区
- 人类可读:Markdown 格式既可机器解析又可人类编辑
- 版本控制:Git 历史记录记忆演变
- 显式性:Agent 知道记忆存储在哪里
第二层:可检索的 Transcript 索引
第二层解决检索问题。只有记忆文件是不够的——你需要能找到相关信息。
OpenClaw 在以下内容上构建索引:
- 记忆文件:第一层的持久化文件
- 会话 transcript:历史对话
- 外部来源:可选的文档和参考资料
class MemoryIndexManager {
// 监听记忆文件和 transcripts
private watcher = chokidar.watch([
'MEMORY.md',
'memory.md',
'memory/**/*.md',
'sessions/**/*.md'
]);
// 用关键词和语义搜索索引内容
async search(query: string): Promise<SearchResult[]> {
const keywordResults = await this.searchKeyword(query);
const vectorResults = await this.searchVector(query);
return this.mergeHybridResults(keywordResults, vectorResults);
}
}为什么混合搜索很重要:
- 关键词搜索:技术术语、函数名、路径的精确匹配
- 向量搜索:概念查询的语义相似性
- 合并结果:结合精确率和召回率
索引在文件更改时自动更新,无需手动维护即可保持搜索相关性。
第三层:运行时召回机制
第三层决定记忆何时以及如何进入模型上下文。这是大多数实现失败的地方——它们把一切都灌入上下文,用噪音淹没模型。
OpenClaw 的方法是精准的:
召回规则注入
系统提示词包含显式的召回指令:
## Memory Recall
在回答任何关于之前工作、决策、日期、人员、偏好或待办事项之前:
在 MEMORY.md + memory/*.md + 索引的 session transcripts 上运行 memory_search;
然后使用 memory_get 提取所需的行。模型被指示先搜索,再回答。记忆不是强制的——它是按需可用的。
基于工具的检索
两个工具处理召回:
- memory_search:查找相关记忆文件
- memory_get:从文件中提取特定行
const memorySearchTool = {
name: 'memory_search',
description: '搜索记忆文件以获取相关信息',
execute: async (query: string) => {
const results = await index.search(query);
return formatSearchResults(results);
}
};模型根据召回规则决定何时调用这些工具。这不同于"总是注入所有记忆"——只有相关片段进入上下文。
记忆 Flush:会话结束时
当会话达到上下文限制时会发生什么?OpenClaw 实现了"记忆 flush"——在压缩前提取持久记忆的专门过程。
触发条件
Flush 在以下情况下激活:
- 总 tokens 接近上下文阈值
- Transcript 变得太大
- 即将运行压缩周期
Flush 过程
不是在压缩期间丢失信息,而是专门的 Agent 运行提取关键学习:
Session → Flush 触发 → 专门 Agent → 每日笔记(append-only)const memoryFlushPlan = {
prompt: '从这个会话中提取持久记忆...',
relativePath: 'memory/YYYY-MM-DD.md',
allowedTools: ['read', 'write'] // 为安全限制工具
};Append-Only 约束
关键安全特性:flush 写入是 append-only。Agent 不能删除或覆盖现有记忆。这防止了:
- 重要上下文被意外删除
- 有缺陷的提取导致记忆损坏
- 历史决策丢失
记忆如何进入模型上下文
这是最容易被误解的部分。记忆不会自动"进入模型"。它遵循特定路径:
路径 1:系统提示词规则
记忆召回规则嵌入系统提示词中。模型知道记忆在哪里以及如何访问。
路径 2:工具结果
当模型调用 memory_search 或 memory_get 时:
- 工具返回相关片段
- 片段作为工具结果出现在对话中
- 模型将这些信息整合到响应中
路径 3:上下文引擎组装
在最终模型调用之前,上下文引擎可以注入额外的记忆上下文:
const assembled = await assembleAttemptContextEngine({
contextEngine: params.contextEngine,
messages: activeSession.messages,
// 记忆可以通过 systemPromptAddition 在这里添加
});完整闭环
用户输入 → 系统提示词(带有召回规则)
↓
模型决定:"我需要记忆吗?"
↓
是 → memory_search → memory_get → 工具结果
↓
模型将记忆整合到响应中
↓
会话结束 → memory-flush → 每日笔记追加
↓
下一会话 → 系统提示词(新召回规则)
↓
循环重复为什么这个架构有效
有界上下文
只有相关片段进入上下文。模型不会被不相关的记忆淹没。搜索结果被排序和过滤。
安全约束
- Append-only flush 防止删除
- 受限工具防止记忆损坏
- 显式规则防止未授权访问
优雅降级
如果记忆搜索失败,系统继续运行而不受影响。如果 flush 失败,会话仍然完成。记忆有价值但非关键。
面试含义
当面试官问关于 AI Agent 记忆系统时,他们在测试:
- 架构思维:你能设计多层系统吗?
- 约束意识:你理解为什么朴素实现会失败吗?
- 生产经验:你处理过上下文限制、检索失败、记忆损坏吗?
常见问题:"你如何为一个 AI 助手实现记忆?"
强有力的回答结构:
1. 承认问题:上下文窗口是有限的
2. 提出三层:持久化存储、索引、运行时召回
3. 解释检索挑战:不是"如何存储"而是"如何找到"
4. 解决上下文问题:不是"注入一切"而是"先搜索"
5. 讨论安全:Append-only、受限工具、显式规则应避免的反模式
永远不要说:"只是保存一切到文件然后读回来。"
这忽略了:
- 上下文窗口限制
- 检索相关性
- 记忆损坏风险
- 性能成本
这对你的 AI 应用意味着什么
无论你正在构建:
- 面试准备助手
- 编码 Agent
- 客服机器人
- 研究工具
记忆架构模式都适用:
- 分离存储和检索
- 使用混合搜索实现相关性
- 让模型决定何时召回
- 约束写入操作
- 用有界上下文测试
Interview AiBox 的位置
Interview AiBox 为面试准备实现了复杂的上下文管理。系统需要记住:
- 你的目标公司和职位
- 过去的面试经历和反馈
- 技术优势和劣势
- 会话特定上下文
这需要与 OpenClaw 展示的相同架构思维:分层记忆、选择性召回和安全约束。
在功能概览中了解更多关于 Interview AiBox 如何处理上下文。
相关阅读
Interview AiBoxInterview AiBox — 面试搭档
不只是准备,更是实时陪练
Interview AiBox 在面试过程中提供实时屏幕提示、AI 模拟面试和智能复盘,让你每一次回答都更有信心。
AI 助读
一键发送到常用 AI
智能总结
深度解读
考点定位
思路启发
分享文章
复制链接,或一键分享到常用平台