1. 背景

为了让 LLM 不只是一次性对话,而是能自主执行任务、与外部工具交互、保持上下文状态,人们提出了 LLM Agent 概念。

真实世界任务往往不是一次性完成,需要多轮交互、跨会话处理,甚至长时间跟踪任务进度。

为什么单纯的 LLM 不够
  • 原生的 LLM 通常只有短期上下文窗口(context window),在会话结束后不会记住用户信息。
  • 对于复杂任务,如个人助理、项目管理、游戏 NPC,需要长期记忆个性化状态
  • 这就催生了 记忆模块(Memory Module) 的研究与实践。

早期探索

  • 在对话系统(如早期的聊天机器人)中,记忆功能很早就存在,例如保存用户偏好、历史记录。
  • 传统方法:将状态保存在数据库中,通过规则调用。

LLM Agent 时代

  • 随着 LLM 能力增强,开发者开始用 向量数据库 + 检索增强生成(RAG) 的方式存储和调用记忆。
  • 代表性开源框架:LangChain、LlamaIndex、Haystack 等,都提供 Memory 类或模块。
  • 商业产品(如 ChatGPT 的“自定义指令”和“长期记忆”功能)也在实验如何安全地存储用户信息。

2. 概念

2.1. 存在意义

  1. 保持上下文连续性

    • 没有记忆,Agent 每次响应都是“重新开始”,无法延续之前的对话逻辑。
    • 有记忆后,可以让 Agent 知道之前做了什么、说过什么。
  2. 个性化与定制化

    • 长期记忆可以存储用户的偏好、习惯,让交互更贴近用户需求。
  3. 处理复杂任务

    • 多步骤任务需要记住中间结果,否则无法正确推进。
    • 例如:旅行规划、代码开发、长期项目管理。
  4. 提高效率

    • 避免重复获取或询问同一信息。
    • 减少上下文窗口的占用,把长期信息放在外部存储,需要时再检索。
  5. 模拟类人智能

    • 人类的智能依赖于记忆系统(短期、长期),Agent 模拟这种能力更自然。

2.2. 核心功能

  1. 存储(Store)

    • 接收来自 LLM 的重要信息(用户输入、事件、推理结果)。
    • 转换为嵌入向量或结构化数据存储。
  2. 更新(Update)

    • 当有新信息时,更新已有记录(例如用户地址变化)。
    • 需要考虑冲突解决和版本管理。
  3. 检索(Retrieve)

    • 根据当前任务语境,从记忆库中找到相关信息。
    • 检索结果会被注入到 prompt 中,让 LLM “回忆”相关内容。
  4. 遗忘(Forget / Prune)

    • 长期运行的 Agent 需要定期清理无关或过时信息,减少存储压力。

3. 时间维度划分

按时间维度划分的记忆类型,通常可以分为:

  1. 短期记忆(Short-term Memory)
  2. 长期记忆(Long-term Memory)
    3

下面我们逐一详细介绍。

3.1. 短期记忆

定义

短期记忆保存的是当前会话或任务的最近上下文信息,用于维持对话或任务的连贯性。
类似人类的“工作记忆”,只在短时间内有效。

特点
  • 生命周期短(通常是当前会话内)
  • 容量受 LLM 上下文窗口限制(例如 GPT-4 可能是 8K~128K tokens)
  • 信息量小,但相关性强
  • 当信息超出窗口时需要压缩或丢弃
常见实现方式
  1. 滑动窗口(Sliding Window)

    • 保留最近 N 条消息
    • 旧消息被移出上下文
  2. 对话摘要(Summarization)

    • 将旧内容压缩成简短摘要
    • 节省 token,同时保留关键信息
  3. 缓存变量

    • 在内存中直接存储最近的对话状态
实际场景示例
  • 在线客服 Agent

    • 用户连续提问:“我昨天订了酒店,但是没收到确认邮件” → “是的,我用信用卡支付的”
    • 短期记忆保留这两轮对话,使 Agent 知道“信用卡支付”是针对酒店预订的。
  • 编程助手

    • 用户在当前会话中逐步构建代码,短期记忆保留当前代码版本,以便下一步修改时知道上下文。

3.2. 长期记忆

定义

长期记忆保存的是重要的历史信息,可以跨会话调用,不会因为上下文窗口限制而丢失。
类似人类的“长期记忆”,可以记住过去的经历、知识、用户偏好等。

特点
  • 生命周期长(跨会话甚至永久)
  • 容量大,可持久化存储(数据库、文件系统)
  • 需要检索机制(RAG:检索增强生成)才能在推理时使用
  • 存储的是经过筛选的重要信息,而不是所有原始数据
常见实现方式
  1. 向量数据库(Vector Store)

    • 将文本转成向量(Embedding)
    • 存入 FAISS、Milvus、Pinecone 等
    • 检索时按语义相似度匹配
  2. 事件日志(Event Log)

    • 按时间和主题记录关键事件
  3. 用户画像(User Profile)

    • 存储用户兴趣、习惯、偏好等信息
实际场景示例
  • 个人助理 Agent

    • 记住用户喜欢的餐厅类型、常去的旅行目的地
    • 新对话时主动推荐符合偏好的选项
  • 企业知识管理 Agent

    • 保存过去项目的文档、会议纪要
    • 新任务时自动检索相关历史案例

3.4. 总结

对比表

类型生命周期容量存储方式检索方式场景示例
短期记忆当前会话内存缓存/摘要直接拼接到Prompt在线客服、编程助手
长期记忆跨会话长期或永久向量数据库/用户画像语义检索个人助理、知识管理

在真实 LLM Agent 系统中,这几种时间维度的记忆往往是组合使用

  • 短期 + 长期
    保持当前对话连贯,同时利用历史知识增强推理
  • 短期 + 中期 + 长期
    项目型任务中,短期用于当前讨论,中期保存项目阶段信息,长期保存最终成果

4. 示例:多轮对话

如果多轮对话不超限很好办,直接使用短期记忆,每轮对话将历史对话都拼接上。

但如果多轮对话会让上下文越来越长,超过模型的上下文窗口(context window)就会导致信息丢失或推理失败,就需要考虑其他记忆方案的实现。,

前面说真实 LLM Agent 系统中,这几种时间维度的记忆往往是组合使用。可以拿多轮对话的场景来看看。

4.1. 对话摘要

思路
把旧的对话内容用模型或算法压缩成摘要,保留关键信息,减少 token 占用。

方法

  • 定期摘要:每隔 N 轮对话,把前面的内容总结成几句话
  • 分层摘要:先对每段对话摘要,再将多个摘要合并成更短的摘要

优点

  • 保留主要语义
  • 节省大量 token
  • 可结合长期记忆使用

缺点

  • 摘要可能丢失细节
  • 依赖摘要质量

实际场景示例

  • 在线客服 Agent
    客户咨询很长的订单问题,Agent 每 5 轮对话就生成一个摘要,如:

    “客户在 7 月 5 日下单酒店,支付方式为信用卡,未收到确认邮件,已联系航空公司确认航班正常。”
    后续对话只保留摘要 + 最近几轮原文。

4.2. 滑动窗口

思路
只保留最近 N 条消息作为上下文,其余丢弃或存入长期记忆。

方法

  • 固定窗口大小(如最近 10 轮)
  • 动态窗口大小(根据 token 数计算,超出则移除旧内容)

优点

  • 简单易实现
  • 保证上下文新鲜度

缺点

  • 旧信息丢失
  • 对长任务不友好

实际场景示例

  • 编程助手 Agent
    只保留最近几轮代码修改的上下文,旧代码版本存到文件或数据库,避免 prompt 爆掉。

4.3. RAG

思路
旧对话不直接放进 prompt,而是存到向量数据库,需要时按语义检索相关内容,再拼接到 prompt。

方法

  • 将对话分片(chunk)
  • 对每个分片生成 embedding
  • 存入向量数据库(FAISS, Milvus, Pinecone)
  • 当前轮对话时检索相关分片

优点

  • 只加载相关信息
  • 上下文可无限扩展

缺点

  • 检索质量影响回答
  • 需要额外存储与检索服务

实际场景示例

  • 法律咨询 Agent
    将过去的法律问答存到向量库,用户再次问相关问题时,检索出相关历史对话拼到 prompt。

4.4. 分会话记忆

思路
把长对话分成多个“子会话”,每个子会话独立处理,必要时通过摘要或检索连接。

方法

  • 按主题拆分(如“订单问题” vs “退款问题”)
  • 按时间拆分(如每天一个会话)

优点

  • 避免上下文混乱
  • 方便管理和检索

缺点

  • 主题切换时需要额外关联信息

实际场景示例

  • 项目管理 Agent
    将项目沟通按“需求讨论”、“技术实现”、“测试反馈”拆成独立会话,每个会话独立摘要和存储。

4.5. 混合策略

思路
结合多种方法,例如:

  • 最近对话用滑动窗口保留
  • 历史对话摘要存入长期记忆
  • 需要细节时用 RAG 检索

实际场景示例

  • 个人助理 Agent

    1. 最近 5 轮对话直接保留
    2. 更早的内容生成摘要并存到长期记忆
    3. 用户提到“上次的旅游计划”时,用 RAG 检索详细记录
方案对比表
方案优点缺点适用场景
对话摘要节省 token,保留语义可能丢细节客服、长任务
滑动窗口简单,实时性好旧信息丢失编程助手、短任务
RAG 检索上下文无限扩展依赖检索质量知识问答、法律咨询
分会话记忆管理方便主题切换需额外处理项目管理
混合策略灵活适应实现复杂长期陪伴型 Agent
总结建议

如果你的 Agent 是 任务型(短期),可以用 滑动窗口 + 摘要
如果是 知识型或长期陪伴型,建议用 RAG + 关键信息提取 + 摘要 结合,这样既能节省 token,又能保证信息可追溯。

5. 发展与挑战

LLM Agent 的记忆模块是让智能体具备持续性、个性化和复杂任务处理能力的关键组件。它的设计涉及短期与长期记忆的结合、信息的存储与检索机制,以及隐私安全和性能优化等问题。

未来,随着 LLM 的应用场景扩展,记忆模块会越来越重要,甚至可能演化为支持多模态(文本、图像、音频)记忆的系统,进一步提升 Agent 的智能水平。

挑战与思考
  1. 隐私与安全

    • 长期记忆可能包含敏感信息,需要加密、权限控制。
  2. 记忆质量

    • 需要判断哪些信息值得记住,避免冗余。
  3. 检索准确性

    • 检索结果相关性直接影响 LLM 回答质量。
  4. 遗忘机制

    • 如何自动淘汰无用信息,防止记忆库膨胀。
  5. 成本控制

    • 存储与检索会增加计算和存储成本。

KerryWu
679 声望171 粉丝

保持饥饿