Appearance
32. 短期、中期、长期记忆各自适合什么场景?
难度 P1 高频 · 岗位 应用 · 频率 ★★★★☆ · 预计阅读 8 min 公司 OpenAI · Anthropic 相关题 Q84 记忆机制 · Q76 上下文工程 · Q56 Manus
本题阅读地图
- 面试场景还原 — 1 min
- TL;DR 速记 — 30 sec
- 图解 — 30 sec
- 详细解析 — 5 min
- 4.1 为什么需要分层记忆?
- 4.2 短期记忆:当前会话的精确约束
- 4.3 中期记忆:跨会话的任务状态
- 4.4 长期记忆:用户画像与知识积累
- 4.5 三层记忆的协同工作
- 常见踩坑与反例 — 1 min
- 面试官可能继续追问 — 1 min
面试场景还原
👔面试官:假设你在做一个客服 Agent,用户昨天咨询了一个退款问题,今天又来找你。Agent 应该怎么记住昨天聊到哪儿了?
🙋♂️我:可以用记忆功能,把昨天的对话存下来。
👔面试官:对,但如果把昨天的完整对话都塞进今天的 Prompt,可能超出上下文限制。而且昨天的对话里有些信息是临时的(比如"等一下我去查一下"),有些是重要的(比如"退款原因:商品损坏")。怎么处理?
🙋♂️我:呃……可以做摘要?
👔面试官:很好。这就是中期记忆——保留任务状态的关键摘要。除此之外,Agent 还需要短期记忆保留当前会话的精确信息,以及长期记忆保留用户的画像和偏好。你能详细说说这三种记忆的适用场景吗?
TL;DR 速记
- 短期记忆:当前会话的精确约束,保留原文,最近 N 轮
- 中期记忆:跨会话的任务状态,保留摘要,跨天/跨会话
- 长期记忆:用户画像与知识积累,向量/结构化存储,永久保留
- 选择依据:要精确原文?→ 短期;要任务上下文?→ 中期;要用户背景?→ 长期
- 实现关键:摘要生成、向量化检索、结构化查询
图解
图 1:三层记忆架构与适用场景
图 2:客服场景中的记忆流转示例
详细解析
为什么需要分层记忆?
Agent 的记忆需求是多样的,单一记忆机制无法满足所有场景:
| 需求维度 | 短期记忆 | 中期记忆 | 长期记忆 |
|---|---|---|---|
| 精确性 | 需要原文 | 摘要即可 | 特征提取 |
| 时效性 | 当前会话 | 跨会话 | 永久 |
| 容量 | 有限(窗口限制) | 中等 | 无限(数据库存储) |
| 检索方式 | 直接读取 | 摘要查询 | 语义检索/结构化查询 |
| 实现成本 | 低(内存) | 中(缓存/数据库) | 高(向量库+关系库) |
分层的好处:
- 精确性与效率平衡:短期保精确,中长期保效率
- 成本控制:不是所有信息都需要永久存储
- 检索效率:不同场景用不同检索方式
- 隐私安全:敏感信息可以设置不同的保留策略
短期记忆:当前会话的精确约束
核心作用:保留当前会话的精确原文,确保 Agent 不会「忘记」用户刚刚说过的话。
适用场景:
精确数字和信息
- "我的订单号是 12345"
- "退款金额是 299.50元"
- "联系电话是 138xxxx1234"
临时约束和澄清
- "不要发邮件,要打电话通知我"
- "刚才说的 蓝色 款,改成 黑色 款"
- "** urgency:高**,需要今天处理"
多轮对话的上下文
- 第 3 轮提到的需求,第 8 轮还需要引用
- 用户的否定和修正("不对,我说的是 A 不是 B")
技术实现:
python
# 短期记忆:保留最近 N 轮对话
short_term_memory = [
{"role": "user", "content": "订单号12345", "timestamp": "..."},
{"role": "assistant", "content": "收到,订单12345...", "timestamp": "..."},
{"role": "user", "content": "等等,订单号错了,是12346", "timestamp": "..."},
# 保留最近 10 轮
]关键要点:
- 原文保留:不做摘要,保持用户的原话
- 有限容量:只保留最近 N 轮(如 10-20 轮)
- 会话结束清空:不长期占用资源
成本考虑:
- Token 消耗高(保留全文)
- 窗口有限(128K / 200K tokens)
- 需要定期清理或压缩
中期记忆:跨会话的任务状态
核心作用:在会话之间保持任务连续性,让用户今天没聊完的事情,明天可以继续。
适用场景:
未完成的任务
- "退款申请已提交,等待审核"
- "上次咨询的产品对比表还没做完"
已确认的事实
- "用户已确认地址:北京市朝阳区..."
- "预算上限:5000元"
用户的澄清和修正
- "用户强调:不要推荐安卓机"
- "上次已说明:对续航要求很高"
待办事项
- "等待用户提供:身份证复印件"
- "需要查询:库存状态"
技术实现:
方式 1:LLM 生成摘要
python
# 会话结束时,用 LLM 生成摘要
summary_prompt = """
请总结本次会话的关键信息,用于下次会话恢复上下文:
- 用户的主要诉求
- 已确认的事实
- 待处理的事项
- 用户的特殊要求
对话记录:{conversation_history}
"""
summary = llm.generate(summary_prompt)
# 存储到数据库
mid_term_memory.store(session_id, summary)方式 2:规则提取关键字段
python
# 结构化提取
mid_term_data = {
"session_id": "sess_xxx",
"user_id": "user_123",
"topic": "退款申请",
"status": "等待用户上传凭证",
"confirmed_facts": {
"order_id": "12345",
"reason": "商品损坏",
"amount": 299.50
},
"pending_items": ["用户上传凭证照片"],
"user_preferences": {"urgency": "high"},
"updated_at": "2024-01-15"
}关键要点:
- 摘要形式:不需要原文,保留关键信息即可
- 结构化存储:便于查询和恢复
- 时效性:保留最近几天的会话(如 7-30 天)
- 检索方式:通过 user_id + session_id 查询
长期记忆:用户画像与知识积累
核心作用:构建对用户的深度理解,实现个性化服务;积累领域知识,提升专业能力。
适用场景:
用户画像
- 偏好:正式语气 vs 随意语气
- 习惯:喜欢详细解释 vs 只要结论
- VIP 等级:普通用户 / 会员 / VIP
- 历史行为:常买电子产品、偏好某品牌
知识积累
- 领域知识:医疗术语理解、法律条款掌握
- 组织知识:公司内部流程、产品规格
- 最佳实践:常见问题的解决方案
关系历史
- 投诉历史(需要特别关注)
- 满意度记录
- 沟通风格偏好
技术实现:
方式 1:向量存储(语义检索)
python
# 将记忆向量化存储
memory_chunks = [
"用户是VIP会员,偏好快速响应",
"用户对电子产品感兴趣,常询问手机、电脑",
"用户不喜欢冗长解释,偏好简洁回答",
"用户去年投诉过发货延迟,对物流敏感"
]
# 生成向量并存储
for chunk in memory_chunks:
embedding = embedding_model.encode(chunk)
vector_store.add(embedding, metadata={"user_id": "123", "type": "preference"})
# 检索时,根据当前查询召回相关记忆
query_embedding = embedding_model.encode("推荐手机")
relevant_memories = vector_store.search(query_embedding, top_k=5)
# 召回:"用户对电子产品感兴趣..."方式 2:结构化存储(属性查询)
python
# 用户画像表
user_profile = {
"user_id": "123",
"tier": "VIP",
"communication_style": "concise",
"interests": ["electronics", "photography"],
"sensitivities": ["shipping_delay"],
"preferred_brands": ["Apple", "Sony"],
"avg_order_value": 5000,
"last_updated": "2024-01-15"
}
# 直接查询
if user_profile["tier"] == "VIP":
response = prioritize_response(response)关键要点:
- 特征提取:从对话中提取稳定特征,而非存储原文
- 多模态检索:向量检索 + 结构化查询结合
- 隐私控制:敏感信息分级存储,支持遗忘机制
- 持续更新:用户画像随对话不断更新
三层记忆的协同工作
实际场景中,三层记忆需要协同:
用户输入 → 检索长期记忆(画像)
↓
恢复中期记忆(上次会话状态)
↓
叠加短期记忆(当前对话上下文)
↓
生成回复
↓
更新短期记忆 → 会话结束 → 更新中期记忆 → 特征提取 → 更新长期记忆示例:电商客服 Agent
python
# 1. 检索长期记忆:用户画像
user_profile = long_term_memory.get(user_id)
# → VIP用户,偏好快速响应,对物流敏感
# 2. 恢复中期记忆:上次会话
session_summary = mid_term_memory.get_last_session(user_id)
# → 订单12345退款,等待用户上传凭证
# 3. 构建短期记忆:当前对话上下文
short_context = build_context(
system_prompt=f"用户是{user_profile['tier']},{user_profile['preferences']}",
session_history=session_summary,
recent_turns=recent_messages # 最近 N 轮
)
# 4. 生成回复
response = llm.generate(short_context + current_query)
# 5. 更新记忆
short_term_memory.add(turn) # 实时更新
# 会话结束后 → mid_term_memory.update(summary)
# 特征提取后 → long_term_memory.update(profile)常见踩坑与反例
踩坑 1:所有记忆都原文保留
错误做法: 把一个月前的完整对话都塞进 Prompt。
问题:
- 超出上下文限制
- Token 成本爆炸
- 关键信息被淹没
正确做法: 分层处理:短期原文、中期摘要、长期特征。
踩坑 2:中期记忆不做摘要
错误做法: 会话结束时直接存储最后 N 轮对话,不做信息提取。
问题:
- 包含大量临时信息("等一下"、"我查查")
- 下次恢复时信息冗余
- 关键状态被淹没
正确做法: 用 LLM 或规则提取关键信息,生成结构化摘要。
踩坑 3:长期记忆只存原文
错误做法: 把所有历史对话都存向量库,不做特征提取。
问题:
- 检索效果差(语义匹配不稳定)
- 存储成本高
- 隐私风险大
正确做法: 提取稳定的用户画像特征,结构化存储 + 向量索引结合。
踩坑 4:忽视记忆更新机制
错误做法: 记忆一旦写入就不更新,用户偏好变了也没感知。
正确做法: 设计记忆更新机制:
- 短期:实时追加
- 中期:会话结束更新
- 长期:定期重新提取特征
踩坑 5:隐私和安全忽视
错误做法: 敏感信息(身份证号、地址)长期存储,无删除机制。
正确做法:
- 敏感信息仅短期保留,用完即删
- 支持用户「遗忘」请求
- 长期记忆只存特征,不存原文
面试官可能继续追问
追问 1:中期记忆的摘要怎么生成?有什么注意事项? 答题要点:LLM 生成(自然语言摘要)vs 规则提取(结构化字段);注意保留关键实体(订单号、金额)、状态(待处理)、约束(用户特殊要求);过滤临时性信息("等一下"、"我查查")。
追问 2:长期记忆向量检索效果不好怎么优化? 答题要点:分块策略优化(语义完整的句子);元数据过滤(先按类型/时间过滤再向量检索);重排序(初召回 + 精排序);混合检索(关键词 + 向量)。
追问 3:用户说"忘了我说过什么",Agent 怎么处理? 答题要点:短期记忆清空当前会话;中期记忆标记为「用户要求遗忘」;长期记忆的特征是否需要更新(如果用户明确表示偏好变了);注意隐私合规(GDPR 被遗忘权)。
追问 4:三层记忆的存储选型? 答题要点:短期 → 内存/Redis;中期 → 关系数据库(PostgreSQL);长期 → 向量数据库(Pinecone/Milvus)+ 关系数据库(画像表)。
面试总结
Agent 记忆系统是工程设计的核心。面试时强调三点:
- 分层设计:短期保精确、中期保任务、长期保画像,各层有不同的存储形式和检索方式
- 选择依据:需要原文精确性 → 短期;需要任务连续性 → 中期;需要个性化服务 → 长期
- 实现关键:短期原文保留、中期摘要提取、长期特征向量化 + 结构化
记住:不是所有信息都值得永久保存。分层记忆的核心是「按需保留」,短期用完即丢,中期保留关键状态,长期只存稳定特征。这是 Agent 从「一次性对话」进化到「持续性服务」的关键。