Appearance
0. 为什么需要记忆?
传统大模型的局限性
- 大语言模型(LLM)本质上是无状态的:每次响应仅基于当前输入的提示词(prompt),不会自动记住之前的交互内容。
- 若缺乏记忆机制,用户在多轮对话中必须重复提供背景信息,体验割裂且效率低下。
真实场景的连续性需求
- 智能客服 / 问答助手:需理解用户的追问上下文(如“刚才说的那个方案还有其他选项吗?”)。
- 医疗 / 教育系统:需持续跟踪病人的病情进展、学生的知识掌握情况等长期状态。
- 个性化服务:如记住用户偏好、历史行为,提供定制化建议。
记忆的核心价值
- 通过将历史交互信息显式注入 prompt,弥补 LLM 无记忆的缺陷;
- 使系统具备上下文感知能力,实现连贯、高效、个性化的交互。
1. 记忆的应用场景
多轮对话系统
- 智能客服、虚拟助理、聊天机器人等需要维持对话逻辑连贯性的场景。
用户画像与长期跟踪
- 智能医疗:记录病史、用药记录、症状变化;
- 教育平台:跟踪学习进度、错题记录、知识薄弱点;
- 电商/推荐系统:保存用户兴趣偏好、浏览/购买历史。
2. 记忆的类型
短期记忆(Short-term Memory)
- 生命周期:仅在当前会话内有效;
- 特点:高保真、低延迟,用于维持对话流畅性;
- 典型实现:缓存最近几轮对话,直接拼入 prompt。
长期记忆(Long-term Memory)
- 生命周期:跨会话持久化存储;
- 特点:支持个性化、历史追溯,但需处理存储与检索效率;
- 典型实现:结构化数据库 + 向量数据库结合。
长短期记忆对比
| 维度 | 短期记忆 | 长期记忆 |
|---|---|---|
| 生命周期 | 仅当前会话 | 跨会话、长期持久化 |
| 实现方式 | 缓存(如 Redis),全量拼入 prompt | 定期摘要归档或主动触发写入 |
| 存储策略 | 每个 session_id 对应一个对话缓存,设上限;超限后触发摘要或去重 | 结构化数据存 MySQL/图数据库,语义记忆存向量库(如 FAISS、Chroma) |
| 内容类型 | 最近几轮原始对话 | 多会话摘要、用户特征、偏好、关键事件 |
| 主要用途 | 保证当前对话连贯性 | 支持个性化、历史上下文理解 |
| 使用策略 | 优先使用,必选 | 按需检索,附加使用 |
3. 记忆的实现手段
Prompt 缓存记忆(Context Window Injection)
- 将历史对话直接拼接到当前 prompt 中;
- 实现简单,但受模型上下文长度(token 限制)制约;
- 适用于短期记忆。
向量记忆(Vector-based Memory)
- 将历史对话或摘要嵌入为向量,存入向量数据库;
- 推理时,根据当前问题的语义检索最相关的历史片段;
- 模拟人类“联想回忆”机制,适合长期、海量记忆管理。
4. 记忆的选取策略
为避免信息过载并提升相关性,需对记忆进行智能筛选:
1. 任务相关性过滤
- 仅选取与当前任务类型匹配的记忆(如医疗问诊只加载病历相关记忆)。
2. 语义相似度召回
- 使用 embedding 计算当前问题与历史记忆的相似度,召回 top-K 相关项。
3. 时效性优先
- 近期记忆权重更高,优先使用(如最近 24 小时 > 一周前)。
4. 动态 Token 配额
- 根据问题复杂度分配记忆 token:
- 简单问题:2K token;
- 复杂推理:可达 8K token。
5. Token 裁剪机制
- 设定记忆总 token 上限;
- 超出时自动触发摘要压缩或去重,确保 prompt 不溢出。
5. 记忆过长的处理方案
当对话历史过长、超出上下文窗口时,需进行压缩与优化:
摘要压缩(Summarization)
- 使用轻量级 LLM 对历史对话生成摘要;
- 保留核心信息,大幅减少 token 消耗。
语义去重(Deduplication)
- 向量聚类:对历史片段做 embedding + KMeans 聚类,每类保留代表性样本;
- 相似度过滤:若新记忆与某旧记忆的余弦相似度 > 阈值(如 0.9),视为重复,丢弃。
记忆过期淘汰
- 采用类似 LRU(Least Recently Used) 的缓存淘汰策略;
- 自动清除长时间未使用或低价值的旧记忆。
分层处理策略
- 短期(最近 3 轮):原始对话全量保留;
- 中期(3~20 轮):摘要后保留;
- 长期(>20 轮):仅保留关键事件或用户画像信息。
6. 记忆中存在矛盾如何处理?
1. 时效优先原则
- 默认以最新记忆为准,覆盖旧信息(如用户更新了联系方式)。
2. 冲突显式处理
在 prompt 中加入指令,如:
“若历史信息存在矛盾,请优先采用最新内容;若无法判断,请向用户澄清。”
引导 LLM 主动识别冲突并追问用户确认,避免错误推理。
3. 保留多版本(可选)
- 对关键信息(如诊断结论)保留多个版本及时间戳,供后续审计或回溯。
7. RAG 与记忆的区别与联系
核心区别
| 维度 | RAG(Retrieval-Augmented Generation) | 记忆(Memory) |
|---|---|---|
| 目的 | 引入外部领域知识(如文档、知识库) | 记录用户交互历史(你是谁、做过什么) |
| 数据来源 | 静态知识库、企业文档、网页等 | 动态生成的对话日志、用户行为 |
| 解决的问题 | “模型不知道这个领域知识” | “模型不记得你之前说过什么” |
协同关系
- 可结合使用:
- 用 记忆 获取用户上下文(如“我上次问过糖尿病饮食”);
- 用 RAG 检索最新医学指南;
- 两者共同构建个性化 + 专业性的回答。
- 典型架构:
Memory → 用户上下文+RAG → 领域知识→ LLM 生成最终回复。
8. Agent中的记忆(Memory)模块通常如何实现?分为哪些类型?
AI Agent 的记忆模块负责存储、提取与更新任务相关的信息,常分为短期记忆、长期记忆和工作记忆三类。支持 Agent 保持上下文、利用经验、长期规划,是实现智能行为的关键。
实现方式包括滑动窗口、向量数据库、知识图谱等,核心操作包括读、写、更新和遗忘。
记忆模块对比
| 记忆类型 | 作用 | 常见实现方式 | 特点/用途 |
|---|---|---|---|
| 短期记忆 (STM) | 存储当前上下文 | 滑动窗口、对话摘要、原始历史 | 快速、易忘 |
| 长期记忆 (LTM) | 存储持久知识/经验 | 向量数据库、知识图谱、关系库、文件 | 可扩展、需检索 |
| 工作记忆 (WM) | 暂存中间状态和变量 | 临时变量、数据结构、执行状态 | 动态、紧跟任务 |
核心操作
| 操作 | 说明 |
|---|---|
| 写入 | 提取关键信息 → 摘要/向量化 → 存入数据库 |
| 读取 | 语义检索、时间回溯、重要性筛选、结构化查询 |
| 更新 | 修改旧信息,如用户偏好、任务状态等 |
| 遗忘 | 定期清理无用信息,保持高相关性 |
Agent 就像一个“笔记员”
短期记忆 便利贴:记的是刚刚发生的事(随时可能丢)
长期记忆 知识笔记本:存放过去经历、重点知识(需要目录检索)
工作记忆 临时草稿区:当前任务中用到的变量(任务一结束就清空)
易错点提醒
不要混淆短期记忆和工作记忆:前者是上下文,后者是中间变量。
长期记忆 ≠ 一定是向量库:也可以是知识图谱或数据库,关键是“可持久、可检索”。
遗忘机制不是删除数据这么简单,而是策略性丢弃无用信息。
9. LangChain 中 Memory(记忆)组件详解
一、核心作用
LangChain 的 Memory 组件用于在 Chain(链)或 Agent 的多次交互之间维持状态,使 LLM 应用具备“记忆能力”,从而实现更连贯、上下文感知的对话体验。
具体作用包括:
- 维持对话上下文:记住用户与 AI 之前的对话内容,使后续回复具备历史依据;
- 存储关键信息:自动提取并保存用户偏好、实体信息(如姓名、地点)等;
- 支持长期交互:在多轮甚至跨会话场景中积累和复用知识;
- 提升用户体验:避免重复提问,实现个性化、流畅的交互流程。
二、常见 Memory 类型
LangChain 提供了多种 Memory 实现,适用于不同场景下的上下文管理需求:
1. 缓冲区类(Buffer-based)
适用于短期、简单上下文记忆。
ConversationBufferMemory- 存储完整的原始对话历史(用户输入 + AI 回复);
- 优点:信息完整;
- 缺点:随对话增长迅速消耗 Token,可能超出模型上下文窗口。
ConversationBufferWindowMemory- 仅保留最近 K 轮对话(滑动窗口);
- 优点:控制 Token 使用;
- 缺点:可能丢失早期但关键的信息。
2. 摘要类(Summary-based)
适用于需要压缩历史、节省 Token 的场景。
ConversationSummaryMemory- 使用 LLM 对历史对话动态生成摘要;
- 每轮将新对话内容追加到摘要中;
- 优点:Token 效率高;
- 缺点:摘要可能丢失细节,且每次需调用 LLM 生成。
ConversationSummaryBufferMemory(混合型)- 结合缓冲区 + 摘要:保留最近 N 条原始消息,其余用摘要表示;
- 在 信息保真度 与 Token 效率 之间取得平衡。
3. 实体感知类(Entity-aware)
ConversationEntityMemory- 自动从对话中识别实体(如人名、地点、产品);
- 为每个实体维护独立的记忆片段;
- 后续提及该实体时,自动注入相关上下文;
- 适合需要跟踪多实体状态的复杂对话。
4. 知识图谱类(Knowledge Graph)
ConversationKGMemory- 将对话中提取的实体及其关系构建成知识图谱;
- 支持结构化存储与查询;
- 适用于需要推理实体间关系的高级场景(如客服、智能助理)。
5. 向量存储类(Vector Store-backed)
- 将对话片段或摘要嵌入为向量,存入向量数据库(如 FAISS、Chroma);
- 每次交互时,根据当前问题语义检索最相关的过往记忆;
- 优势:可扩展性强,适合海量历史数据;
- 典型应用:长期记忆、个性化推荐、跨会话上下文恢复。
6. 组合记忆(Combined Memory)
- 支持将多种 Memory 类型组合使用;
- 例如:
BufferMemory(保留最近对话) +SummaryMemory(压缩早期历史);EntityMemory+VectorStoreMemory(兼顾结构化与语义检索);
- 通过
CombinedMemory类实现灵活配置。
三、使用方式
- 在创建 Chain 或 Agent 时,传入一个 Memory 实例(如
ConversationBufferMemory()); - 组件会自动:
- 读取历史记忆;
- 更新新交互内容;
- 注入相关上下文到 Prompt 中(通常作为
history变量);
- 开发者无需手动管理对话状态,LangChain 自动处理序列化与整合。
四、选型建议
| 需求场景 | 推荐 Memory 类型 |
|---|---|
| 简单短对话 | ConversationBufferMemory |
| 长对话 + Token 限制 | ConversationSummaryBufferMemory |
| 需要跟踪用户/实体信息 | ConversationEntityMemory |
| 结构化关系推理 | ConversationKGMemory |
| 海量历史 + 语义检索 | 向量存储记忆 |
| 复杂混合需求 | CombinedMemory 组合使用 |
关键权衡因素:Token 消耗、信息保真度、计算开销、实现复杂度。
