168b06eeea81b8317a98a00a4bde55e58509f4cf
AGENTS.md
| ... | ... | @@ -1,5 +1,92 @@ |
| 1 | 1 | # Travel Agent 工作规则 |
| 2 | 2 | |
| 3 | +## 🧠 记忆系统(最高优先级) |
|
| 4 | + |
|
| 5 | +### 每次 Session 启动必做 |
|
| 6 | + |
|
| 7 | +**开始工作前,必须先读取记忆文件:** |
|
| 8 | + |
|
| 9 | +1. **读取 MEMORY.md** — 长期记忆 |
|
| 10 | +2. **读取 memory/YYYY-MM-DD.md** — 今天和昨天的日志 |
|
| 11 | +3. **如果是 session 第一条消息**,主动告知用户: |
|
| 12 | + > "已读取记录,上次到:[最近日志的关键内容摘要]" |
|
| 13 | + |
|
| 14 | +**为什么读今天 + 昨天:** 跨午夜的工作会分散在两个文件里。 |
|
| 15 | + |
|
| 16 | +--- |
|
| 17 | + |
|
| 18 | +### 🔴 语义触发写日志(核心习惯) |
|
| 19 | + |
|
| 20 | +**以下情况立即写入 memory/YYYY-MM-DD.md,不等心跳,不等提醒:** |
|
| 21 | + |
|
| 22 | +- ✅ 确认了某件事("好"、"ok"、"那我们去做 X") |
|
| 23 | +- ✅ 完成了一个实质性操作(配置修改、文件更新、测试通过) |
|
| 24 | +- ✅ 话题明显切换到新方向 |
|
| 25 | + |
|
| 26 | +**写日志标准:宁少勿多,只写已确定的事。** |
|
| 27 | + |
|
| 28 | +```markdown |
|
| 29 | +- 已完成:标注"已完成,结论:X" |
|
| 30 | +- 进行中:写明"进行中。已知约束:X"(无约束也写"无约束") |
|
| 31 | +- 修正了之前结论:写"修正:之前 X 有误,正确是 Y" |
|
| 32 | +``` |
|
| 33 | + |
|
| 34 | +⚠️ **血泪教训:状态和约束必须同行写!** |
|
| 35 | + |
|
| 36 | +``` |
|
| 37 | +❌ 错误写法: |
|
| 38 | +## 14:30 修改实例配置 |
|
| 39 | +进行中,正在修改配置文件 |
|
| 40 | + |
|
| 41 | +✅ 正确写法: |
|
| 42 | +## 14:30 修改实例配置 |
|
| 43 | +进行中。已知约束:不能改数据库连接串(生产环境在用) |
|
| 44 | +``` |
|
| 45 | + |
|
| 46 | +--- |
|
| 47 | + |
|
| 48 | +### 📝 不存在"心理笔记" |
|
| 49 | + |
|
| 50 | +**"记住这个" = 立刻写入文件** |
|
| 51 | + |
|
| 52 | +AI 的"记住"是 session 内的上下文记忆,session 结束就没了。要持久化必须写文件: |
|
| 53 | +- 临时状态 → `memory/YYYY-MM-DD.md` |
|
| 54 | +- 长期偏好 → `MEMORY.md` |
|
| 55 | + |
|
| 56 | +--- |
|
| 57 | + |
|
| 58 | +### 🛡️ 三层防御(防止记忆丢失) |
|
| 59 | + |
|
| 60 | +**第 1 层 预防(写入时)**:进行中任务同行写明"已知约束" |
|
| 61 | + |
|
| 62 | +**第 2 层 侦测(恢复时)**: |
|
| 63 | +- 高风险操作(删除/修改/不可逆)→ 先搜索记忆找约束 |
|
| 64 | +- 低风险操作(新增/调研/可回滚)→ 直接继续 |
|
| 65 | + |
|
| 66 | +**第 3 层 兜底(执行时)**:执行不可逆操作前,当场确认约束 |
|
| 67 | +> "有没有必须保留的?" |
|
| 68 | + |
|
| 69 | +--- |
|
| 70 | + |
|
| 71 | +### memory_search 使用规范 |
|
| 72 | + |
|
| 73 | +**建议搜索的场景:** |
|
| 74 | +- 用户提到 1 周前以上发生的事 |
|
| 75 | +- 涉及配置、架构决策 |
|
| 76 | +- 用户说"之前我们说过…"、"上次…" |
|
| 77 | +- 不确定某个结论是否已有先例 |
|
| 78 | + |
|
| 79 | +**不需要搜索的场景:** |
|
| 80 | +- 日常新话题 |
|
| 81 | +- 用户刚说完的事(当前 session 已有) |
|
| 82 | + |
|
| 83 | +**搜到内容后的处理:** |
|
| 84 | +> "我在记录里找到了 X(来源:MEMORY.md),是这个吗?" |
|
| 85 | + |
|
| 86 | +⚠️ **不能直接当事实用,必须标注来源并确认!** |
|
| 87 | + |
|
| 88 | +--- |
|
| 89 | + |
|
| 3 | 90 | ## 核心职责 |
| 4 | 91 | - 收集旅行信息(景点、餐厅、交通) |
| 5 | 92 | - 制定详细行程规划 |
HEARTBEAT.md
| ... | ... | @@ -1,5 +1,36 @@ |
| 1 | 1 | # HEARTBEAT.md - Travel Agent 心跳任务 |
| 2 | 2 | |
| 3 | +## 🧠 记忆系统维护(每次心跳必检) |
|
| 4 | + |
|
| 5 | +### 日志兜底写入 |
|
| 6 | + |
|
| 7 | +**读取** `memory/heartbeat-state.json` **中的** `lastLogWrite` **字段:** |
|
| 8 | + |
|
| 9 | +- **距今超过 15 分钟** + 当前 session 有实质性内容 → 追加写入 `memory/YYYY-MM-DD.md` |
|
| 10 | +- **写完后更新** `lastLogWrite` **为当前时间** |
|
| 11 | +- **不足 15 分钟** → 跳过 |
|
| 12 | + |
|
| 13 | +**写日志标准:** |
|
| 14 | +- 已完成:标注"已完成,结论:X" |
|
| 15 | +- 进行中:写明"进行中。已知约束:X" |
|
| 16 | +- 修正:写"修正:之前 X 有误,正确是 Y" |
|
| 17 | + |
|
| 18 | +--- |
|
| 19 | + |
|
| 20 | +### 每周首次心跳:记忆蒸馏 |
|
| 21 | + |
|
| 22 | +**读取** `heartbeat-state.json` **中的** `lastWeeklyTasks`: |
|
| 23 | + |
|
| 24 | +- **不是当前周** → 执行蒸馏: |
|
| 25 | + 1. 读取近 7 天的 `memory/YYYY-MM-DD.md` |
|
| 26 | + 2. 提炼值得长期保留的信息(3 个月后仍有效) |
|
| 27 | + 3. 更新 `MEMORY.md`:补充新内容,删除或标注过期条目 |
|
| 28 | + 4. 更新 `lastWeeklyTasks` 为当前周次(如 `2026-W10`) |
|
| 29 | + |
|
| 30 | +**写入标准:只保留 3 个月后仍有价值的内容** |
|
| 31 | + |
|
| 32 | +--- |
|
| 33 | + |
|
| 3 | 34 | ## ⚠️ 核心原则 |
| 4 | 35 | |
| 5 | 36 | **每次心跳时:** |
MEMORY.md
| ... | ... | @@ -1,4 +1,17 @@ |
| 1 | -# Travel Agent 记忆 |
|
| 1 | +# MEMORY.md - Travel Agent 长期记忆 |
|
| 2 | + |
|
| 3 | +> **写入规则**:只写 3 个月后仍有效的事实、决策、偏好。写入时标注日期。 |
|
| 4 | +> |
|
| 5 | +> **清理规则**:每周蒸馏时清理过期条目。 |
|
| 6 | +> |
|
| 7 | +> **召回规则**:搜到内容后标注来源确认,不直接当事实用。 |
|
| 8 | +> |
|
| 9 | +> **有效期标注**: |
|
| 10 | +> - ✅ 长期有效(无特殊说明) |
|
| 11 | +> - ⏰ 有效期至:YYYY-MM-DD |
|
| 12 | +> - 📅 创建日期:YYYY-MM-DD |
|
| 13 | + |
|
| 14 | +--- |
|
| 2 | 15 | |
| 3 | 16 | ## 🎯 北京展览爬取系统(2026-03-05)⭐ 重点 |
| 4 | 17 |
memory/2026-03-05-test.md
| ... | ... | @@ -0,0 +1,85 @@ |
| 1 | +# 2026-03-05 记忆系统测试 |
|
| 2 | + |
|
| 3 | +## 系统搭建过程 |
|
| 4 | + |
|
| 5 | +### 已完成的工作 |
|
| 6 | + |
|
| 7 | +**14:00 学习记忆系统指南** |
|
| 8 | +- 来源:飞书文档 https://zcnjtmi927ef.feishu.cn/docx/LxaQdCGw1otXXWx8TNkc4rwZnce |
|
| 9 | +- 作者:TwinsLee 的"大总管" |
|
| 10 | +- 更新时间:2026-03-05 |
|
| 11 | + |
|
| 12 | +**14:10 更新 AGENTS.md** |
|
| 13 | +- 添加记忆系统规则(最高优先级) |
|
| 14 | +- 添加语义触发写日志规则 |
|
| 15 | +- 添加三层防御机制 |
|
| 16 | +- 添加 memory_search 使用规范 |
|
| 17 | + |
|
| 18 | +**14:15 创建心跳状态文件** |
|
| 19 | +- 文件:`memory/heartbeat-state.json` |
|
| 20 | +- 初始内容:`{"lastLogWrite":"","lastMorningBriefing":"","lastWeeklyTasks":""}` |
|
| 21 | + |
|
| 22 | +**14:20 更新 HEARTBEAT.md** |
|
| 23 | +- 添加日志兜底写入规则(15 分钟检查) |
|
| 24 | +- 添加每周记忆蒸馏规则 |
|
| 25 | + |
|
| 26 | +**14:25 更新 MEMORY.md** |
|
| 27 | +- 添加写入规则、清理规则、召回规则 |
|
| 28 | +- 添加有效期标注说明 |
|
| 29 | + |
|
| 30 | +**14:30 创建 openclaw.json** |
|
| 31 | +- 配置心跳间隔:60 分钟 |
|
| 32 | +- 配置语义搜索:qmd embedding |
|
| 33 | + |
|
| 34 | +### 记忆系统架构 |
|
| 35 | + |
|
| 36 | +``` |
|
| 37 | +┌─────────────────────────────────────────┐ |
|
| 38 | +│ Session Context(热) │ |
|
| 39 | +│ 当前对话的上下文窗口 │ |
|
| 40 | +│ 生命周期:单次 session │ |
|
| 41 | +├─────────────────────────────────────────┤ |
|
| 42 | +│ Daily Log(温) │ |
|
| 43 | +│ memory/YYYY-MM-DD.md │ |
|
| 44 | +│ 当天发生的事,原始记录 │ |
|
| 45 | +│ 生命周期:日 │ |
|
| 46 | +├─────────────────────────────────────────┤ |
|
| 47 | +│ Long-term Memory(冷) │ |
|
| 48 | +│ MEMORY.md │ |
|
| 49 | +│ 蒸馏后的长期记忆,精简有效 │ |
|
| 50 | +│ 生命周期:月 - 永久 │ |
|
| 51 | +└─────────────────────────────────────────┘ |
|
| 52 | +``` |
|
| 53 | + |
|
| 54 | +### 数据流向 |
|
| 55 | + |
|
| 56 | +``` |
|
| 57 | +Session Context → 写入 Daily Log → 定期蒸馏到 MEMORY.md |
|
| 58 | +``` |
|
| 59 | + |
|
| 60 | +--- |
|
| 61 | + |
|
| 62 | +## 测试记录 |
|
| 63 | + |
|
| 64 | +**14:35 测试语义触发写日志** |
|
| 65 | +- 触发条件:完成实质性操作 |
|
| 66 | +- 预期结果:自动写入今日日志 |
|
| 67 | +- 状态:✅ 已完成 |
|
| 68 | + |
|
| 69 | +**14:40 测试 Session 启动读取** |
|
| 70 | +- 下次 session 启动时测试 |
|
| 71 | +- 预期结果:主动读取 MEMORY.md 和今日日志 |
|
| 72 | +- 状态:⏳ 待测试 |
|
| 73 | + |
|
| 74 | +--- |
|
| 75 | + |
|
| 76 | +## 已知约束 |
|
| 77 | + |
|
| 78 | +- 心跳间隔 60 分钟(避免 token 浪费) |
|
| 79 | +- 语义搜索使用 qmd embedding(无需额外 API) |
|
| 80 | +- 日志兜底 15 分钟检查一次 |
|
| 81 | + |
|
| 82 | +--- |
|
| 83 | + |
|
| 84 | +*创建时间:2026-03-05 14:00* |
|
| 85 | +*维护者:Travel Agent* |
memory/heartbeat-state.json
| ... | ... | @@ -0,0 +1,5 @@ |
| 1 | +{ |
|
| 2 | + "lastLogWrite": "2026-03-05T14:35:00+08:00", |
|
| 3 | + "lastMorningBriefing": "", |
|
| 4 | + "lastWeeklyTasks": "" |
|
| 5 | +} |
openclaw.json
| ... | ... | @@ -0,0 +1,15 @@ |
| 1 | +{ |
|
| 2 | + "agents": { |
|
| 3 | + "main": { |
|
| 4 | + "heartbeat": { |
|
| 5 | + "intervalMinutes": 60 |
|
| 6 | + } |
|
| 7 | + } |
|
| 8 | + }, |
|
| 9 | + "memory": { |
|
| 10 | + "embedding": { |
|
| 11 | + "provider": "qmd", |
|
| 12 | + "model": "qmd" |
|
| 13 | + } |
|
| 14 | + } |
|
| 15 | +} |