# 10. Agent 记忆机制调研与 ZK Data Agent 对比 本文整理主流 Agent / AI 产品的记忆实现方式,并对照 ZK Data Agent 当前实现。目标不是判断哪一种“最好”,而是说明不同记忆机制分别解决什么问题,以及为什么我们当前选择“用户记忆 + Skill 使用记忆 + 异步整理队列 + Markdown 可编辑文件”的路线。 调研时间:2026-05-19。 ## 1. 结论摘要 主流记忆实现大致分为六类: | 类型 | 代表 | 核心做法 | 适合场景 | |------|------|----------|----------| | 产品级长期记忆 | ChatGPT Memory | 平台自动保存用户偏好和事实,并在后续对话中注入 | 通用个人助手 | | 会话状态记忆 | OpenAI Agents SDK Sessions、AutoGen Memory | 自动保存历史消息或把外部记忆注入上下文 | 线程连续对话 | | 文件化项目记忆 | Claude Code `CLAUDE.md`、Claw 基座 memory files | 通过项目/用户级 Markdown 文件向 Agent 注入稳定规则 | 工程项目、团队约定 | | 图/向量检索记忆 | LangGraph Store、Mem0、Zep/Graphiti | 抽取事实,存入向量库或知识图谱,按语义检索 | 长期、跨会话、海量事实 | | Agent 自主管理记忆 | Letta / MemGPT | Agent 有显式 memory blocks 和 archival memory,可读写管理 | 状态型 Agent、长期角色 | | 框架内置任务记忆 | CrewAI | 短期、长期、实体、上下文记忆组合 | 多 Agent 任务协作 | ZK Data Agent 当前更接近: ```text 文件化项目记忆 + 产品级用户记忆 + Skill 作用域记忆 + 异步记忆整理队列 ``` 它没有优先做向量库或知识图谱,而是选择 Markdown 文件作为最终记忆正文。这个取舍适合当前团队场景:记忆内容需要能被用户看到、编辑、删除,并且要按 Skill 作用域精准注入。 ## 2. 主流实现机制 ### 2.1 ChatGPT Memory:产品级个人长期记忆 ChatGPT Memory 的核心是平台级用户记忆。它会保存用户偏好、事实和历史对话中有持续价值的信息,并在后续对话中使用。用户可以查看、管理、删除保存的记忆,也可以关闭相关能力。 机制特点: - 记忆作用域是用户账号。 - 由产品后台判断哪些内容值得保存。 - 注入方式对用户透明,用户看到的是“助手更了解我”。 - 适合通用个人助手,不适合表达复杂业务流程结构。 和我们的关系: ZK Data Agent 的“用户记忆”借鉴了这个方向,但没有把全部记忆做成黑盒。我们把最终正文落到 `user.md`,并在 UI 里允许用户编辑。 ### 2.2 OpenAI Agents SDK Sessions:会话状态记忆 OpenAI Agents SDK 的 Sessions 主要解决“同一个会话线程里自动保留历史上下文”。开发者不需要每轮手动传入完整历史,Session 会保存对话项,并在下一轮运行时自动带上。 机制特点: - 更偏 conversation state,而不是长期个人偏好。 - 适合多轮会话连续执行。 - 常见实现是 SQLite / SQLAlchemy / 自定义 session backend。 - 记忆对象主要是消息历史,不是抽象后的长期知识。 和我们的关系: ZK Data Agent 也有 session 持久化,但我们把它和“长期记忆”分开: ```text session.json 保存当前会话消息、工具调用、产物和运行事件。 memory/user.md、memory/skills/*.md 保存跨会话长期偏好和 Skill 使用经验。 ``` 这个区分很重要:会话历史服务“恢复当前任务”,长期记忆服务“下次任务更懂用户和业务”。 ### 2.3 Claude Code / OpenClaw / Claw:文件化项目记忆 Claude Code 使用 `CLAUDE.md` 作为项目或用户级记忆文件,常用于保存仓库规则、构建命令、代码风格、项目约定等。OpenClaw / Claw 类 Code Agent 基座通常也会保留这条路线:从全局或工作目录发现记忆文件,并把内容注入上下文。 在当前仓库里,对应实现主要是: ```text src/agent_context.py src/session_memory_compact.py ``` 其中 `agent_context.py` 负责发现全局和目录级 memory files,`session_memory_compact.py` 负责会话压缩场景下的 session memory 摘要。 机制特点: - 记忆是文本文件,天然可读、可版本化。 - 非常适合工程项目规则和团队约定。 - 注入通常按目录/项目作用域进行。 - 记忆更新更多依赖人工维护,而不是完全自动。 和我们的关系: ZK Data Agent 继承了“文件化、可编辑、可解释”的优点,但把作用域进一步细分: ```text user.md 用户级偏好和稳定习惯。 skills/.md 某个 Skill 的使用经验、踩坑、格式偏好和边界修正。 ``` 也就是说,我们不是只有“项目记忆”,而是增加了“Skill 记忆”这一层。 ### 2.4 LangGraph:线程状态 + 长期 Memory Store LangGraph 把 memory 分成 short-term memory 和 long-term memory。短期记忆通常跟 thread 绑定,用来维持一次会话;长期记忆通过 store 按 namespace 保存,可以跨 thread 召回。它还把长期记忆进一步拆成 semantic、episodic、procedural 等类型。 机制特点: - thread state 解决会话内上下文。 - store 解决跨会话长期信息。 - 支持按 user id / namespace 组织记忆。 - 长期记忆可以由应用逻辑或 Agent 写入、搜索、更新。 和我们的关系: ZK Data Agent 当前没有引入通用 Store / VectorStore,而是用文件系统和 SQLite 队列实现一个轻量版本: ```text namespace = account_id + memory kind + skill_name storage = Markdown files + SQLite queue retrieval = user memory always considered, skill memory按启用 Skill 精准注入 ``` 这比 LangGraph Store 简单,但更直接服务我们当前的 Skill 工作台。 ### 2.5 Mem0:独立记忆层 Mem0 更像一个独立 memory layer。典型链路是:从对话中抽取事实,存入记忆系统;后续根据 query 检索相关记忆,再注入给模型。它强调 add / search / update / delete 这类记忆 API,也支持面向用户、Agent、session 等维度组织。 机制特点: - 记忆层和 Agent 框架解耦。 - 常见存储后端是向量、图或混合检索。 - 强调自动抽取、去重、更新和语义召回。 - 适合大规模个性化 Agent 或跨应用记忆服务。 和我们的关系: ZK Data Agent 目前没有把记忆做成独立检索服务。原因是我们的高频需求不是“从海量事实里语义搜索”,而是“把少量稳定经验准确注入到对应 Skill”。如果未来 Skill 记忆膨胀,可以在 Markdown 之外增加 Mem0 类似的检索层。 ### 2.6 Letta / MemGPT:Agent 自主管理内存 Letta 延续 MemGPT 思路,把 Agent 看成有长期状态的主体。它通常区分 core memory 和 archival memory:core memory 是短小、常驻上下文的重要信息;archival memory 是更大的外部记忆空间,Agent 可以通过工具读写。 机制特点: - Agent 可以主动管理自己的记忆。 - core memory 常驻,archival memory 需要检索。 - 适合长期角色 Agent、个人助理、需要自我状态连续性的 Agent。 - 复杂度更高,需要更强的记忆写入约束和审计。 和我们的关系: ZK Data Agent 没有让主 Agent 在执行链路里自由修改记忆。我们把记忆写入放到后台 worker,避免主任务因为记忆整理变慢或出错。这是一个更保守的团队平台取舍。 ### 2.7 Zep / Graphiti:时间感知知识图谱记忆 Zep / Graphiti 代表的是 temporal knowledge graph 路线:从对话或事件中抽取实体和关系,形成带时间属性的知识图谱。它解决的问题不是简单偏好记忆,而是“事实如何随时间变化”“实体关系如何演进”。 机制特点: - 记忆结构是实体、关系、事件、时间。 - 适合复杂事实网络和时间演化。 - 检索结果可以包含关系路径和上下文。 - 实现成本和运维复杂度高于 Markdown 或向量检索。 和我们的关系: 标签边界、业务规则、Skill 使用经验目前更适合文本化规则,不一定需要图谱。但如果未来要做“用户、Skill、数据集、标签、错误类型、修复策略”之间的关系分析,图谱路线会有价值。 ### 2.8 CrewAI:多 Agent 任务记忆 CrewAI 的记忆体系主要服务多 Agent 协作,通常包含 short-term memory、long-term memory、entity memory 和 contextual memory。它关注的是任务过程中多个 Agent 如何共享上下文和持续改进。 机制特点: - 和 Crew / Agent / Task 结构绑定。 - 强调任务协作过程中的上下文复用。 - 对实体、任务经验有独立组织方式。 和我们的关系: ZK Data Agent 当前不是多 Agent 编排优先,而是单个工作台 Agent + Skill 能力包优先。Skill 记忆在某种程度上承担了“任务经验记忆”的角色。 ### 2.9 AutoGen:Memory 组件注入上下文 AutoGen 的 AgentChat 提供 Memory 抽象,可以把 list memory、vector memory 等组件挂到 AssistantAgent 上。运行时 Memory 会根据消息更新上下文,或把检索结果添加到模型输入。 机制特点: - Memory 是 Agent 可插拔组件。 - 可以使用简单列表,也可以接向量检索。 - 更偏框架扩展点,而不是产品级记忆管理 UI。 和我们的关系: ZK Data Agent 的记忆也可以理解为一个可插拔上下文组件,但我们额外做了用户 UI、Skill 作用域和后台队列。 ## 3. ZK Data Agent 当前实现 实现入口: ```text src/personal_memory.py backend/api/server.py frontend/app/components/assistant-ui/threadlist-sidebar.tsx ``` ### 3.1 存储结构 每个账号有独立记忆目录: ```text .port_sessions/accounts//memory/ user.md skills/ .md memory.db ``` 其中: - `user.md`:用户级长期记忆。 - `skills/.md`:某个 Skill 的使用记忆。 - `memory.db`:事件队列、状态和 revision 账本。 ### 3.2 注入逻辑 模型调用前,后端调用: ```text memory_manager.render_injection(account_id, enabled_skill_names) ``` 注入规则: ```text 用户记忆 账号级,作为长期偏好注入。 Skill 使用记忆 只读取当前启用 Skill 对应的 skills/.md。 冲突优先级 用户本轮明确要求 > 个性化记忆。 ``` 这避免了一个常见问题:所有记忆都无差别注入导致上下文污染。 ### 3.3 生成时机 每次交互结束后,后端调用: ```text memory_manager.enqueue_interaction(...) ``` 系统不会每轮同步整理记忆,而是先检测信号: ```text 显式记忆词: 记住、以后、下次、默认、总是、不要、应该、固定 纠错词: 不对、不是这样、格式错、之前说过、还是不行 Skill 经验: skill、工具、流程、格式 工具经验: 模型返回的工具参数不是合法 JSON ``` 命中后写入 SQLite pending 队列。显式记忆优先级更高。 ### 3.4 异步整理 后台 worker 每 5 秒扫描账号事件,每次最多处理 8 条 pending event: ```text pending -> processing -> done / failed ``` 整理方式: 1. 读取已有 `user.md` 和相关 `skills/.md`。 2. 把一批事件交给模型做“整理式合并”。 3. 模型必须输出 JSON: ```json { "user_memory": "完整 Markdown 或空字符串", "skill_memories": { "skill-name": "完整 Markdown" } } ``` 4. 如果模型输出不可解析,则走 fallback 规则。 5. 写入 Markdown 文件,并更新 revision。 ### 3.5 用户可编辑 前端左下角“记忆”入口支持: - 查看用户记忆行数。 - 查看 Skill 记忆列表。 - 编辑用户记忆。 - 编辑某个 Skill 记忆。 - 查看记忆队列状态。 管理后台只看队列、用量等统计,不展示其他用户具体记忆内容。 ## 4. 对比表 | 维度 | ChatGPT | Claude Code / OpenClaw | LangGraph / Mem0 / Zep | Letta | ZK Data Agent | |------|---------|--------------------|-------------------------|-------|---------------| | 主要目标 | 个人助手个性化 | 项目规则注入 | 长期检索记忆 | 状态型长期 Agent | 团队 Skill 工作台 | | 记忆粒度 | 用户 | 用户/项目/目录 | 用户/线程/实体/namespace | Agent memory block | 用户 + Skill | | 存储形态 | 平台内部 | Markdown 文件 | Store / 向量 / 图 | Core + archival memory | Markdown + SQLite queue | | 生成时机 | 产品后台自动 | 多为人工维护 | 自动抽取 / API 写入 | Agent 主动管理 | 交互结束后异步整理 | | 检索方式 | 平台决定 | 直接注入文件 | 语义搜索 / 图检索 | Core 常驻 + archival 检索 | 用户记忆 + 当前 Skill 记忆注入 | | 可编辑性 | 用户可管理 | 文件可编辑 | 取决于产品/API | 通常需要工具/API | UI 可编辑 Markdown | | 适合业务流程沉淀 | 中 | 中 | 高,但工程复杂 | 高,但复杂 | 高,且轻量 | | 风险 | 黑盒、难按业务作用域隔离 | 容易依赖人工维护 | 检索和更新复杂 | 主链路复杂度高 | 暂无语义召回和图谱能力 | ## 5. 为什么当前方案适合我们 ### 5.1 我们需要的是 Skill 使用经验,而不只是用户偏好 通用记忆多关注“用户是谁、用户喜欢什么”。我们的高频需求更像: ```text product-data 生成数据时,用户偏好什么确认流程? 标签大师判断时,哪些边界经常被纠正? online-mining-v2 查询线上日志时,哪些字段和表更稳定? 某个 Skill 写文件时,模型容易踩什么坑? ``` 这些经验天然和 Skill 绑定。因此 `skills/.md` 比单一用户记忆更准确。 ### 5.2 我们需要可审计、可编辑,而不是完全黑盒 团队平台里,记忆不能只存在模型或向量库内部。用户需要能看到: - 记住了什么。 - 为什么下一次会注入。 - 哪里可以手动修改。 - 哪些记忆是用户级,哪些是 Skill 级。 Markdown 文件在这点上比纯向量库更直接。 ### 5.3 主链路不能被记忆整理拖慢 数据生成、线上挖掘、标签判断本身就是长任务。记忆整理如果同步放在主链路里,会增加延迟和失败面。 当前设计是: ```text 主链路:只读取已有记忆 + 入队事件 后台:异步整理、合并、失败重试/记录 ``` 这和团队生产工具的稳定性要求更匹配。 ### 5.4 Skill 作用域注入能降低上下文污染 如果所有记忆每次都注入,模型会被无关偏好干扰。当前只注入启用 Skill 的记忆: ```text 启用 product-data -> 注入 product-data 使用记忆 启用 label-master -> 注入 label-master 使用记忆 未启用某 Skill -> 不注入该 Skill 记忆 ``` 这使记忆更像“能力使用手册的增量补丁”,而不是一坨全局上下文。 ## 6. 当前不足和后续方向 ### 6.1 缺少语义召回 当前 Skill 记忆是按 Skill 文件整体注入,不做向量检索。如果某个 Skill 记忆变得很长,可能需要: - 按章节拆分。 - 引入轻量 embedding 检索。 - 只注入和当前 query 相关的片段。 ### 6.2 缺少结构化 schema Markdown 易编辑,但不方便做强约束。后续可以让 Skill 记忆同时存在: ```text human.md structured.json ``` 其中 Markdown 给人看,JSON 给程序做筛选和校验。 ### 6.3 缺少记忆质量评估 目前能看到队列状态,但还没有系统评估: - 哪些记忆被注入。 - 注入后是否减少纠错。 - 哪些记忆过期。 - 哪些 Skill 记忆导致误导。 后续可以把 memory revision 与 session outcome 关联起来。 ### 6.4 缺少跨用户团队记忆 当前是账号级记忆。团队共性经验仍主要沉淀在 Skill 本体里。未来可以区分: ```text 个人 Skill 记忆 某个用户自己的偏好和使用习惯。 团队 Skill 记忆 多人使用后沉淀的稳定经验,经 review 后合入 Skill。 ``` 这样可以形成从“个人经验”到“团队 Skill 知识”的晋升路径。 ## 7. 建议的技术路线 短期保持当前架构: ```text Markdown 可编辑记忆 SQLite 异步队列 按 Skill 注入 UI 可查看可修改 后台可观测队列 ``` 中期增强: ```text 记忆片段化 记忆注入日志 过期/冲突检测 记忆质量指标 ``` 长期可选: ```text 向量检索:解决 Skill 记忆膨胀后的相关片段召回。 图谱记忆:解决用户、Skill、标签、数据集、错误类型之间的关系分析。 团队记忆晋升:把多用户共性 Skill 经验 review 后写回 Git Skill。 ``` ## 8. 资料来源 - OpenAI Help:ChatGPT Memory FAQ https://help.openai.com/en/articles/8590148-memory-faq - OpenAI Agents SDK:Sessions https://openai.github.io/openai-agents-python/sessions/ - Anthropic Claude Code:Memory https://docs.anthropic.com/en/docs/claude-code/memory - LangChain / LangGraph:Memory concepts https://docs.langchain.com/oss/python/concepts/memory - Mem0 documentation https://docs.mem0.ai/ - Letta documentation https://docs.letta.com/ - Zep / Graphiti documentation https://help.getzep.com/ - CrewAI Memory concepts https://docs.crewai.com/concepts/memory - Microsoft AutoGen AgentChat Memory https://microsoft.github.io/autogen/dev/user-guide/agentchat-user-guide/memory.html - ZK Data Agent 当前实现 `src/personal_memory.py`、`docs/technical-architecture/05-workspace-memory-observability.md`