---
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 场景无并发问题 |