短期记忆
本节定位
很多人一提“Agent 记忆”,脑子里先想到“长期存档”。
但真实系统里,最先决定体验的,往往反而是短期记忆:
系统能不能稳稳记住“这次任务正在发生什么”。
这一节讲的就是这层“工作记忆”。
学习目标
- 理解短期记忆和长期记忆的区别
- 理解为什么不能把整段历史无限塞给模型
- 掌握对话窗口、运行态状态、摘要记忆三种常见短期记忆方式
- 看懂一个简单的短期记忆管理器
- 知道短期记忆最常见的失效方式
一、短期记忆到底是什么?
1.1 一句话理解
短期记忆可以先理解成:
系统为了完成当前这轮任务,暂时保留的上下文和中间状态。
它通常包括:
- 最近几轮对话
- 当前任务目标
- 已执行步骤
- 临时中间结果
1.2 和长期记忆有什么不同?
| 类型 | 关注什么 |
|---|---|
| 短期记忆 | 当前这次任务要用的信息 |
| 长期记忆 | 跨任务、跨会话仍然有价值的信息 |
例如:
- “用户上一句说想查退款政策” -> 短期记忆
- “这个用户喜欢简洁回答” -> 更像长期记忆
二、为什么不能把所有历史都一直塞给模型?
2.1 因为上下文窗口不是无限的
模型能看的上下文长度有限。
如果你把所有历史都不断塞进去,会遇到:
- token 成本越来越高
- 响应越来越慢
- 重要信息被淹没
2.2 信息越多,不一定越好
很多新人会觉得:
“多给模型一点历史,总不会错吧?”
其实不一定。
因为如果上下文里混了太多无关内容,模型反而更容易:
- 抓错重点
- 复读旧信息
- 忘掉当前真正要做的事
所以短期记忆真正要解决的不是“记得越多越好”,而是:
在有限预算里,保留当前最有用的信息。
三、短期记忆最常见的三种形态
3.1 对话窗口(sliding window)
最简单的方式:
- 只保留最近 N 轮消息
优点:
- 简单
- 实现成本低
缺点:
- 太久之前的重要信息会被挤掉
3.2 运行态状态(task state)
不是只记聊天文本,而是明确记:
- 当前任务目标
- 已经查过什么
- 下一步该做什么
这类状态对 Agent 特别重要。
3.3 摘要记忆(summary memory)
当历史太长时,不是全丢掉,而是先压缩成摘要。
例如:
- 保留最近 4 轮原文
- 更早的内容压成一段总结
这是一种很常见的折中方式。
四、一个最简单的短期记忆:滑动 窗口
4.1 可运行示例
messages = [
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好,我可以帮你做什么?"},
{"role": "user", "content": "我想了解退款政策"},
{"role": "assistant", "content": "你是想了解时间范围,还是具体条件?"},
{"role": "user", "content": "主要看时间范围"},
]
window_size = 3
short_term_memory = messages[-window_size:]
for msg in short_term_memory:
print(msg)
4.2 这段代码虽然简单,但已经很重要
它教你一件最本质的事: