智能体记忆:短期与长期
大模型本身没有记忆——每次请求都是"全新开始"。所谓记忆,是应用层把历史信息重新装回上下文的能力。智能体要连续多轮对话、跨天记住用户偏好,就必须分层管理记忆。
记忆分类总览
按存储位置与生命周期,记忆通常分三类:
| 类型 | 位置 | 生命周期 | 典型实现 |
|---|---|---|---|
| 工作记忆 | 上下文窗口内 | 单次请求内 | 系统提示 + 本轮消息 + 工具结果 |
| 短期会话记忆 | 会话服务端 | 一次多轮会话 | 消息历史列表、会话摘要 |
| 长期记忆 | 外部存储 | 跨会话、跨天 | 向量库、键值库、关系数据库 |
实现手段之一:历史消息
最直接的做法是把历史消息原样带上,符合 Chat 接口的 messages 结构:
messages = [{"role": "system", "content": "你是客服助手"},
{"role": "user", "content": "我叫小明"},
{"role": "assistant", "content": "你好小明!"},
{"role": "user", "content": "我姓什么?"}] # 靠上文回答
实现手段之二:摘要
历史过长会撑爆窗口、抬高成本。定期让模型把旧对话压成一段摘要,只留关键事实:
summary = llm("把以下对话压缩成 100 字摘要,保留用户身份与待办:\n" + old_messages)
messages = [sys_msg, {"role": "user", "content": "历史摘要:" + summary}, new_msg]
实现手段之三:向量存储
把事实"向量化"存入向量库,需要时按相关性召回,适合"我记得你上次提过某项目"这类模糊记忆,可复用第 12 章 RAG 的技术栈。
实现手段之四:键值与数据库
结构化记忆(用户 ID、订阅状态、积分)更适合键值库或数据库精确读写,查询快、可统计,不占 token:
# Redis 示例:存一个用户偏好
SET user:10086:pref '{"theme":"dark","city":"北京"}'
GET user:10086:pref
# 输出:{"theme":"dark","city":"北京"}
2025 年动态:记忆走向工具化
2025 年前后,主流厂商开始把记忆做成标准能力:Anthropic 等提出了记忆工具(memory tool)形态,让模型通过工具调用主动读写长期记忆,而不是靠开发者硬编码拼历史。各家实现与接口仍在演进,细节以官方文档为准。
记忆的遗忘与隐私
- 记忆要有"写入确认与删除入口",用户可查看和清除,符合数据合规要求;
- 敏感信息(密码、证件号)不进长期记忆,或做脱敏;
- 记忆过期要有策略(如 30 天未交互自动清理),避免陈旧信息误导模型。
小结
记忆分层是智能体工程的基石:工作记忆靠上下文,短期靠消息列表与摘要,长期靠向量库和数据库。记忆工具化是 2025 年的新趋势,但无论技术如何演进,"记得住、忘得掉、隐私有边界"是设计底线。