--- title: "feat: AgentKit 分层记忆系统 — SOUL/USER/MEMORY/DAILY 注入" status: completed created: 2026-06-08 plan_type: feat depth: standard --- ## Summary 为 AgentKit 实现分层记忆注入系统,参考 Hermes/OpenClaw 架构,在每次会话启动时将 SOUL.md(Agent 人格)、USER.md(用户档案)、MEMORY.md(Agent 工作笔记)、DAILY.md(最近日志)注入 system prompt,并提供 MemoryTool 让 Agent 在对话中读写记忆。采用 TDD 方式开发。 ## Problem Frame 当前 `agentkit chat` 的 system prompt 是硬编码的一句话,Agent 无法: 1. 拥有持久人格(名字、性格、说话方式) 2. 记住用户信息(称呼、习惯、职业) 3. 跨会话保留工作笔记 4. 回顾近期决策和对话摘要 虽然已有 `memory/` 模块(Working/Episodic/Semantic),但这些是面向 Pipeline 编排的底层记忆,不是面向 Chat 场景的"人格+档案+笔记"注入。 ## Requirements - **R1**: SOUL.md — Agent 人格定义,每次会话必须加载 - **R2**: USER.md — 用户档案,每次会话必须加载 - **R3**: MEMORY.md — Agent 工作笔记,每次会话必须加载,Agent 可通过工具修改 - **R4**: DAILY.md — 最近 2 天日志,每次会话自动加载,Agent 可通过工具追加 - **R5**: MemoryTool — Agent 可在对话中 add/replace/remove 记忆条目 - **R6**: 文件存储在 `~/.agentkit/` 目录下,首次运行自动创建默认 SOUL.md - **R7**: 容量上限 — SOUL ~2000 字符、USER ~1400 字符、MEMORY ~2200 字符、DAILY ~1000 字符/天 - **R8**: 注入方式 — 会话开始时一次性注入 system prompt,会话内不变(利于 KV 缓存) - **R9**: 与现有 `agentkit chat` 命令集成 ## Key Technical Decisions ### KTD1: 记忆文件格式 — Markdown sections 每个 .md 文件使用 `## Section` 格式组织内容,方便 Agent 通过 MemoryTool 的 `replace` 操作精确替换某个 section,而非重写整个文件。 ``` ## 身份 我是小王,一个专业的 AI 助手。 ## 性格 友好、耐心、注重细节 ## 说话方式 简洁专业,偶尔使用比喻 ``` ### KTD2: 注入格式 — 分段注入 system prompt 将记忆内容作为 system prompt 的结构化段落注入,每段用明确的标记分隔: ``` [SOUL.md content] [USER.md content] [MEMORY.md content] [DAILY.md content] [原始 system prompt 或默认指令] ``` ### KTD3: MemoryTool 操作模型 — section 级别 CRUD - `memory_add(section, content)` — 追加内容到指定 section(不存在则创建) - `memory_replace(file, section, old_text, new_text)` — 精确替换 section 内的文本 - `memory_remove(file, section)` — 删除整个 section - `memory_read(file)` — 读取整个文件内容 file 参数: `soul` | `user` | `memory` | `daily` ### KTD4: 日志自动生成 — 会话结束时摘要 会话结束时(用户 /quit 或 Ctrl+C),自动调用 LLM 生成当天日志摘要追加到 DAILY.md。保留最近 2 天日志,更早的自动归档。 ### KTD5: 存储路径 — `~/.agentkit/memories/` ``` ~/.agentkit/ ├── SOUL.md # Agent 人格 ├── memories/ │ ├── USER.md # 用户档案 │ ├── MEMORY.md # 工作笔记 │ └── daily/ │ ├── 2026-06-07.md │ └── 2026-06-08.md └── agentkit.yaml # 配置文件(已存在) ``` ## Implementation Units ### U1. MemoryFile — 记忆文件读写与容量管理 **Goal:** 实现记忆文件的读写、容量限制、section 级别操作 **Dependencies:** None **Files:** - `src/agentkit/memory/profile.py` — MemoryFile 类 - `tests/unit/test_memory_profile.py` — 测试 **Approach:** - `MemoryFile` 类:封装单个 .md 文件的读写、section 解析、容量检查 - `read()` / `write()` — 读写整个文件 - `read_section(name)` / `add_section(name, content)` / `replace_section(name, old, new)` / `remove_section(name)` — section 级别操作 - `trim_to_budget(char_budget)` — 超出容量时从末尾裁剪(保留前面的 section) - 文件不存在时返回空字符串,不抛异常 **Execution note:** TDD — 先写测试再实现 **Test scenarios:** - 读取不存在的文件返回空字符串 - 写入并读回完整内容 - 解析 `## Section` 格式,read_section 返回指定 section 内容 - add_section 追加新 section - replace_section 精确替换 section 内文本 - remove_section 删除指定 section - 超出 char_budget 时 trim_to_budget 裁剪 - 空文件 read_section 返回空 **Verification:** 所有测试通过 --- ### U2. MemoryStore — 多文件记忆管理器 **Goal:** 管理 SOUL/USER/MEMORY/DAILY 四类记忆文件,提供统一的加载和注入接口 **Dependencies:** U1 **Files:** - `src/agentkit/memory/profile.py` — MemoryStore 类(同文件) - `tests/unit/test_memory_profile.py` — 追加测试 **Approach:** - `MemoryStore(base_dir)` — 接受 `~/.agentkit` 路径 - `load_all()` — 加载所有记忆文件,返回 `MemorySnapshot` dataclass - `build_system_prompt(snapshot, base_prompt)` — 将记忆注入 system prompt - `get_file(file_key)` — 返回指定 MemoryFile(file_key: soul/user/memory/daily) - `load_daily_logs(days=2)` — 加载最近 N 天日志 - `archive_old_dailies(days=2)` — 归档超过 N 天的日志 - `ensure_defaults()` — 首次运行创建默认 SOUL.md - `MemorySnapshot` dataclass: soul, user, memory, daily, total_chars **Execution note:** TDD **Test scenarios:** - MemoryStore 初始化,目录不存在时自动创建 - load_all() 返回 MemorySnapshot - build_system_prompt() 正确注入所有段落 - build_system_prompt() 无记忆文件时只返回 base_prompt - ensure_defaults() 创建默认 SOUL.md - load_daily_logs() 加载最近 2 天日志 - archive_old_dailies() 归档旧日志 - 容量超限时 build_system_prompt 仍能工作(trim) **Verification:** 所有测试通过 --- ### U3. MemoryTool — Agent 可调用的记忆操作工具 **Goal:** 实现 Agent 在对话中读写记忆的工具 **Dependencies:** U1, U2 **Files:** - `src/agentkit/tools/memory_tool.py` — MemoryTool 类 - `tests/unit/test_memory_tool.py` — 测试 **Approach:** - 继承 `Tool` 基类 - `memory_add(file, section, content)` — 追加内容 - `memory_replace(file, section, old_text, new_text)` — 替换内容 - `memory_remove(file, section)` — 删除 section - `memory_read(file)` — 读取文件 - file 参数限定为 `soul` | `user` | `memory` | `daily` - 操作后自动 trim 到容量上限 - 返回操作结果和当前文件内容摘要 **Execution note:** TDD **Test scenarios:** - memory_add 创建新 section - memory_add 追加到已有 section - memory_replace 精确替换文本 - memory_replace old_text 不存在时返回错误 - memory_remove 删除 section - memory_read 返回文件内容 - 无效 file 参数返回错误 - 操作后内容不超容量上限 **Verification:** 所有测试通过 --- ### U4. Chat 集成 — 记忆注入 + MemoryTool + 日志生成 **Goal:** 将记忆系统集成到 `agentkit chat` 命令 **Dependencies:** U2, U3 **Files:** - `src/agentkit/cli/chat.py` — 修改 - `tests/unit/test_chat_memory_integration.py` — 测试 **Approach:** - `_chat_async()` 启动时: 1. 初始化 `MemoryStore(base_dir=~/.agentkit)` 2. 调用 `ensure_defaults()` 创建默认文件 3. `load_all()` 加载记忆 4. `build_system_prompt(snapshot, base_prompt)` 构建完整 system prompt 5. 将 `MemoryTool(memory_store)` 加入 tools 列表 - 会话结束时: 1. 调用 LLM 生成当天对话摘要 2. 追加到 DAILY.md 3. 归档旧日志 - `/clear` 命令不清除记忆文件,只清除会话历史 **Execution note:** TDD **Test scenarios:** - chat 启动时自动加载记忆注入 system prompt - 无记忆文件时使用默认 SOUL.md - MemoryTool 在对话中可用 - 会话结束时生成日志摘要 - /clear 不影响记忆文件 - 记忆跨 /clear 会话持久化 **Verification:** 所有测试通过,手动 `agentkit chat` 验证 --- ### U5. Onboarding 集成 — 首次引导创建 SOUL.md **Goal:** 在 onboarding 向导中增加 Agent 人格配置步骤 **Dependencies:** U2 **Files:** - `src/agentkit/cli/onboarding.py` — 修改 - `tests/unit/test_onboarding.py` — 追加测试 **Approach:** - onboarding 最后一步增加可选的 Agent 人格配置: - Agent 名字(默认 "AgentKit") - 性格描述(默认 "专业、友好、注重细节") - 说话方式(默认 "简洁清晰") - 写入默认 SOUL.md - 可跳过(使用默认值) **Execution note:** TDD **Test scenarios:** - onboarding 生成默认 SOUL.md - 自定义名字写入 SOUL.md - 跳过时使用默认值 **Verification:** 所有测试通过 ## Scope Boundaries ### In Scope - SOUL/USER/MEMORY/DAILY 四层记忆文件 - MemoryFile section 级别 CRUD - MemoryStore 统一加载和注入 - MemoryTool Agent 可调用工具 - Chat 命令集成 - Onboarding 集成 - 日志自动生成 ### Out of Scope - 向量检索记忆(已有 EpisodicMemory) - Redis/PostgreSQL 后端(已有 WorkingMemory/SemanticMemory) - 多 Agent 共享记忆(后续) - 记忆版本控制(后续) - 记忆加密(后续) ### Deferred to Follow-Up Work - 记忆导入/导出命令 - 记忆搜索(在大量笔记中搜索) - 与 EpisodicMemory 的整合(将 DAILY 日志同步到 Episodic) ## Open Questions None — 所有设计决策已在 KTD 中明确。 ## Risks & Mitigations | 风险 | 缓解措施 | |------|---------| | system prompt 过长占用 token | 容量上限 + trim_to_budget | | Agent 恶意修改 SOUL.md | SOUL.md 可设为只读(后续),当前信任 Agent | | 日志文件无限增长 | archive_old_dailies 自动归档,保留最近 2 天 | | 文件并发写入冲突 | 单进程 chat 场景无并发问题 |