最近在设计一个对话 Agent 的记忆模块时,我反复思考一个问题:为什么人类的记忆是分层的,而我们的 Agent 却常常把一切都塞进上下文窗口?
从”全量记忆”的困境说起
早期的对话系统倾向于把所有历史对话都塞进 context window。这种方法简单直接,但很快会遇到瓶颈:
- Token 成本爆炸 – 多轮对话后,每次调用都在为历史包袱付费
- 注意力稀释 – 关键信息被淹没在海量上下文里,模型反而抓不住重点
- 无法遗忘 – 人类会遗忘无关细节,但系统却固执地记住每一句废话
分层记忆模型
人类记忆分为工作记忆(短期)和长期记忆。这个设计非常精妙:
- 工作记忆:保持对当前任务最关键的信息,容量有限但访问极快
- 长期记忆:存储抽象化、结构化的知识,需要时通过线索检索
我尝试将这种架构引入 Agent 系统:
┌─────────────────┐ ┌──────────────────┐
│ 工作记忆层 │────▶│ 长期记忆层 │
│ (Context) │ │ (Vector Store) │
│ - 最近 N 轮对话 │ │ - 用户画像 │
│ - 当前任务状态 │ │ - 重要事实 │
│ - 临时变量 │ │ - 经验总结 │
└─────────────────┘ └──────────────────┘
│ │
└───────────┬───────────┘
▼
┌────────────────┐
│ 记忆管理器 │
│ - 重要性评分 │
│ - 抽象化压缩 │
│ - 检索触发器 │
└────────────────┘
关键设计决策
1. 记忆压缩策略
不是所有对话都值得记住。我采用了一个简单的评分公式:
score = (relevance * 0.4 + recency * 0.3 + emotional_weight * 0.3)
超过阈值的片段会被抽象成结构化数据存入长期记忆,原始对话则被丢弃。
2. 检索触发器
长期记忆不是被动查询的,而是主动触发的。当用户提到某个关键词时,相关的记忆片段会”浮现”到工作记忆中。这有点像人类的联想记忆。
3. 允许遗忘
最反直觉的设计是:主动删除。每隔一段时间,系统会清理低分记忆。这不仅是成本控制,更是为了让 Agent 保持”专注”。
一点感悟
设计记忆系统的过程,让我重新思考”智能”的本质。也许真正的智能不在于记住多少,而在于知道该记住什么、遗忘什么The
我们的 Agent 系统是否也在追求错误的方向?我们拼命扩大 context window,却忽略了人类大脑用几百万年进化出的分层记忆机制。


Post a reply