| 层 | Harness 覆盖 | 你的经验 |
|---|---|---|
| 工作记忆 | ✅ 上下文管理 | 有文章,有实践 |
| 情景记忆 | ❌ 未覆盖 | 你天天在"断片" |
| 语义知识 | ✅ 知识沉淀 | 有 skill 系统 |
前两篇我们把工作记忆和语义知识都覆盖了。但你感受最深的"断片"——新会话一切归零——根源是情景记忆缺失。
场景 1:早上调试字段映射 → 中午修好 → 下午开新会话继续
问题:下午的 Agent 不知道早上发生了什么
场景 2:上周确定了数据库设计方案 → 这周开始编码
问题:Agent 不记得设计决策的上下文
场景 3:排查一个复杂 bug → 试了 3 种方案 → 第 2 种方案不行
问题:Agent 不记得"方案 B 已经试过了" 这些场景的共同模式是:信息产生于会话 A,需要在会话 B 中被使用。 没有情景记忆,每个新会话都是一张白纸。
原则:不要存全部,存结构化的关键信息。
| 该存的 | 不该存的 |
|---|---|
| 关键决策(选 A 不选 B) | 完整的对话日志 |
| 问题根因和结论 | 调试过程的每一步 |
| 当前工作状态 | 中间态的错误信息 |
| 技术约束和限制 | 已经解决的环境问题 |
一个结构化的情景记忆条目:
{
"id": "mem_abc123",
"session": "sess_xyz",
"timestamp": "2026-07-07T10:30:00",
"type": "decision",
"domain": "sync_engine",
"subject": "字段映射",
"context": "上游 API 返回的字段名变了",
"decision": "从 field_mapping 表动态读取",
"alternatives": ["hardcode 新字段名"],
"rationale": "配置化更灵活",
"status": "resolved"
} 推荐方案: 用关系表(或 SQLite)存结构化的字段(时间/类型/领域/状态),再加上关键词标签做简单匹配。先不要上向量库——复杂度高、收益不确定,等检索质量成为瓶颈再升级。
| 模式 | 触发条件 | 例子 |
|---|---|---|
| 主动加载 | 新会话启动时 | "你上次在调 sync_engine,有个决策没落地" |
| 按需检索 | Agent 发现和历史相关 | "字段映射之前怎么处理的?" |
| 时间线检索 | 用户指定时间范围 | "这周关于数据库的决策有哪些?" |
主动加载比按需检索重要得多。情景记忆的价值在于 Agent 主动告诉你有东西要继承,而不是等你想起来去搜。
Hermes 已经有了两个与情景记忆相关的工具:memory(持久化事实)和 session_search(历史会话检索)。但问题在于:需要用户主动触发,不是自动的。
不需要写复杂的后端代码。可以用一个 JSON 文件来实现最简版本的情景记忆:
// ~/.hermes/memory-bank.json
[
{
"session_date": "2026-07-07",
"domain": "sync_engine",
"decisions": ["字段映射改为配置化读取"],
"pending": ["API 限流策略未定"],
"entities": ["sync_engine", "field_mapping"],
"summary": "修复了字段映射问题"
}
] Agent 在新会话启动时,读取这个文件,自动筛选出 pending 不为空或与当前工作域相关的条目。
工作记忆(当前会话)→ 自动转存 → 情景记忆(历史记录)
↓
重复模式 → 手动提炼 → 语义知识(固化技能) 衔接规则:
见效最快的改进——只改系统提示词,不写代码:
今天就改你的 Agent 系统提示词:加上会话启动检索指令和会话结束摘要指令。运行两天,看看"断片"的频率有没有降低。
下一篇: 遗忘的艺术——什么时候该忘记
💬 评论