核心要点

  • 基础做法:每轮把历史消息按顺序拼进上下文一起发给模型

  • 对话变长超上下文窗口:用滑动窗口截断 + 摘要压缩历史

  • 长对话/跨会话:把关键信息(用户偏好、订单)存库,用向量检索按需召回

  • 用会话 id 持久化,区分短期(本轮)与长期(跨会话)记忆

标准回答

核心原理

LLM 本身无状态,「记住」靠的是每次把历史塞进上下文。所以记忆方案本质是「该往上下文里放什么」。

分层方案

  1. 直接拼接历史:短对话最简单,把过往 user/assistant 消息按序放进上下文即可。
  2. 滑动窗口截断:对话变长超出上下文窗口时,只保留最近 N 轮,丢弃过旧消息。
  3. 摘要压缩:把较早的历史用模型总结成一段摘要,替代原始长文,既省 token 又保留要点。
  4. 向量记忆检索:把历史片段或事实存进向量库,新一轮按当前问题语义检索最相关的几条注入上下文(适合超长/跨会话)。
  5. 结构化记忆:用户偏好、姓名、订单号等关键信息单独抽取存成键值/数据库,需要时精确读取,不依赖模糊召回。

工程落地

用会话 id 持久化每个用户的历史与结构化记忆;区分短期记忆(本轮对话)和长期记忆(跨会话画像)。参考 Agent 记忆系统

常见误区

⚠️ 常见踩坑

把全部历史无脑塞进上下文,导致 token 成本飙升、超窗口报错或被无关内容干扰;以及只做内存级记忆、服务重启或换会话就全忘,没有持久化。

追问

追问 1对话特别长、远超上下文窗口怎么办?

组合策略:近期几轮原样保留保证连贯,较早历史用摘要压缩成短文,更早或跨会话的事实存向量库按需检索注入。这样在固定 token 预算内兼顾连贯性和长期记忆。

追问 2怎么让它跨会话记住用户是谁、有什么偏好?

这属于长期记忆:用用户 id 把关键信息(昵称、偏好、历史订单)抽取后存数据库或向量库,新会话开始时按 id 读取并注入 system 上下文,而不是依赖单次会话的消息历史。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。