知识模块
🤖 Agent 知识模块
记忆模块概述

记忆系统概述

记忆系统是 Agent 区别于普通 LLM 应用的核心特征。它使 Agent 能够跨越单次请求的限制,积累经验、保持上下文连贯、实现个性化服务。


一、什么是 Agent 记忆系统?

1.1 定义

Agent 记忆系统是一套用于存储、检索和管理 Agent 历史信息和状态的基础设施,使 Agent 能够:

  • 保持上下文连贯:理解多轮对话中的指代和关联
  • 积累知识经验:从历史交互中学习和改进
  • 实现个性化:根据用户偏好提供定制服务
  • 支持任务连续性:长任务中断后可恢复执行

1.2 为什么需要记忆系统?

问题无记忆系统有记忆系统
多轮对话每次请求独立,无法理解"它"、"那个"等指代保持上下文,理解对话连贯性
用户偏好无法记住用户习惯,每次都要重新说明自动应用用户偏好设置
知识积累无法保留新学到的信息持久化存储重要知识
错误避免重复犯同样的错误从历史中学习,避免重复错误
任务恢复长任务中断后无法继续保存中间状态,断点续传

1.3 记忆系统与人类认知的类比

┌─────────────────────────────────────────────────────────────┐
│                  人类认知 vs Agent 记忆系统                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  人类认知心理学                    Agent 记忆系统            │
│  ─────────────                    ─────────────             │
│                                                             │
│  ┌─────────────────┐            ┌─────────────────┐        │
│  │   感觉记忆      │            │   输入缓冲      │        │
│  │  (毫秒级)       │  ←类比→    │   原始数据暂存   │        │
│  └─────────────────┘            └─────────────────┘        │
│          │                              │                  │
│          ↓                              ↓                  │
│  ┌─────────────────┐            ┌─────────────────┐        │
│  │   短期记忆      │            │   短期记忆      │        │
│  │  (工作记忆)     │  ←类比→    │  (Context Window)│       │
│  │  容量有限       │            │  上下文窗口     │        │
│  │  20-30秒       │            │  4K-200K Token  │        │
│  └─────────────────┘            └─────────────────┘        │
│          │                              │                  │
│          │ 复述/编码                     │ 持久化           │
│          ↓                              ↓                  │
│  ┌─────────────────┐            ┌─────────────────┐        │
│  │   长期记忆      │            │   长期记忆      │        │
│  │  (永久存储)     │  ←类比→    │  (向量数据库)   │        │
│  │  容量无限       │            │  向量存储       │        │
│  │  需要检索       │            │  语义检索       │        │
│  └─────────────────┘            └─────────────────┘        │
│                                                             │
│  记忆过程:编码 → 存储 → 检索                               │
│  Agent:    写入 → 持久化 → 召回                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

二、记忆系统分类

2.1 三层记忆模型

Agent 记忆系统借鉴认知心理学,采用三层架构:

短期记忆 (Short-Term Memory)

┌─────────────────────────────────────────────────────────────┐
│                      短期记忆                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  特点:                                                     │
│  • 存储位置:LLM Context Window                             │
│  • 生命周期:会话期间                                        │
│  • 容量限制:受模型上下文窗口限制 (4K-200K Token)            │
│  • 访问速度:极快,直接参与推理                              │
│                                                             │
│  存储内容:                                                 │
│  • 当前会话的对话历史                                        │
│  • 系统提示词 (System Prompt)                               │
│  • 最近几轮的交互记录                                        │
│                                                             │
│  典型场景:                                                 │
│  • 多轮对话中的指代消解                                      │
│  • 上下文相关的问答                                          │
│  • 任务执行中的即时反馈                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

长期记忆 (Long-Term Memory)

┌─────────────────────────────────────────────────────────────┐
│                      长期记忆                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  特点:                                                     │
│  • 存储位置:外部存储(向量数据库、关系数据库)               │
│  • 生命周期:永久                                            │
│  • 容量限制:理论上无限制                                    │
│  • 访问速度:需要检索 IO,相对较慢                           │
│                                                             │
│  存储内容:                                                 │
│  • 用户画像和偏好设置                                        │
│  • 历史对话记录                                              │
│  • 领域知识库                                                │
│  • 任务状态和中间结果                                        │
│                                                             │
│  典型场景:                                                 │
│  • 跨会话的用户偏好应用                                      │
│  • 知识库问答                                                │
│  • 历史经验复用                                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

工作记忆 (Working Memory)

┌─────────────────────────────────────────────────────────────┐
│                      工作记忆                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  特点:                                                     │
│  • 存储位置:内存变量、Scratchpad                            │
│  • 生命周期:单次任务执行期间                                │
│  • 容量限制:无固定限制,取决于系统内存                       │
│  • 访问速度:最快,直接内存访问                              │
│                                                             │
│  存储内容:                                                 │
│  • 当前推理过程的中间结果                                    │
│  • 任务执行状态                                              │
│  • 临时计算结果                                              │
│                                                             │
│  典型场景:                                                 │
│  • ReAct 框架中的 Thought/Observation                        │
│  • 多步骤任务的状态跟踪                                      │
│  • 中间结果的暂存和传递                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2.2 三种记忆的协作流程

┌─────────────────────────────────────────────────────────────┐
│                    记忆协作流程                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  用户输入                                                   │
│     │                                                       │
│     ↓                                                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  1. 检索长期记忆                                     │   │
│  │     • 根据用户ID获取偏好                             │   │
│  │     • 语义检索相关历史知识                           │   │
│  └──────────────────────┬──────────────────────────────┘   │
│                         ↓                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  2. 组装短期记忆                                     │   │
│  │     • 加载最近N轮对话                                │   │
│  │     • 注入系统提示词                                 │   │
│  │     • 合并长期记忆检索结果                           │   │
│  └──────────────────────┬──────────────────────────────┘   │
│                         ↓                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  3. 工作记忆推理                                     │   │
│  │     • 执行推理过程                                   │   │
│  │     • 存储中间结果                                   │   │
│  │     • 跟踪任务状态                                   │   │
│  └──────────────────────┬──────────────────────────────┘   │
│                         ↓                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  4. 输出与持久化                                     │   │
│  │     • 生成响应                                       │   │
│  │     • 更新短期记忆(对话历史)                        │   │
│  │     • 写入长期记忆(重要信息)                        │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

三、记忆系统架构设计

3.1 整体架构

┌─────────────────────────────────────────────────────────────────────┐
│                    Agent 记忆系统整体架构                            │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│                         ┌─────────────┐                             │
│                         │  用户交互   │                             │
│                         └──────┬──────┘                             │
│                                │                                    │
│         ┌──────────────────────┴──────────────────────┐            │
│         │                                              │            │
│         ↓                                              ↓            │
│  ┌─────────────┐                              ┌─────────────┐       │
│  │  记忆写入   │                              │  记忆检索   │       │
│  │  Write      │                              │  Retrieve   │       │
│  └──────┬──────┘                              └──────┬──────┘       │
│         │                                            │              │
│         │         ┌──────────────────────────────────┤              │
│         │         │                                  │              │
│         ↓         ↓                                  ↓              │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                      记忆存储层                              │   │
│  │  ┌───────────┐  ┌───────────┐  ┌───────────────────────┐   │   │
│  │  │ 短期记忆  │  │ 工作记忆  │  │      长期记忆         │   │   │
│  │  │ Context   │  │ Scratchpad│  │  ┌─────┐  ┌─────────┐ │   │   │
│  │  │ Window    │  │           │  │  │向量 │  │ 关系型  │ │   │   │
│  │  └───────────┘  └───────────┘  │  │ DB  │  │   DB    │ │   │   │
│  │                                │  └─────┘  └─────────┘ │   │   │
│  │                                └───────────────────────┘   │   │
│  └─────────────────────────────────────────────────────────────┘   │
│         │                                                          │
│         ↓                                                          │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                      记忆管理层                              │   │
│  │  ┌───────────┐  ┌───────────┐  ┌───────────┐  ┌───────────┐│   │
│  │  │ 记忆压缩  │  │ 记忆更新  │  │ 记忆遗忘  │  │ 记忆优先级││   │
│  │  │Compress   │  │  Update   │  │  Forget   │  │ Priority  ││   │
│  │  └───────────┘  └───────────┘  └───────────┘  └───────────┘│   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

3.2 核心组件说明

组件职责关键技术
记忆写入将新信息存储到相应记忆层实体识别、重要性评估
记忆检索根据查询召回相关记忆向量检索、关键词检索、混合检索
记忆存储层不同类型记忆的物理存储Context Window、向量数据库、关系数据库
记忆管理层记忆的生命周期管理压缩摘要、更新合并、过期清理

四、记忆存储技术选型

4.1 技术对比详解

向量数据库

# Chroma 向量数据库示例
import chromadb
from chromadb.utils import embedding_functions
 
# 初始化客户端
client = chromadb.Client()
embedding_fn = embedding_functions.DefaultEmbeddingFunction()
 
# 创建集合
collection = client.create_collection(
    name="agent_memory",
    embedding_function=embedding_fn
)
 
# 存储记忆
collection.add(
    documents=["用户喜欢简洁的回答", "用户偏好中文交互"],
    metadatas=[{"type": "preference"}, {"type": "preference"}],
    ids=["pref_1", "pref_2"]
)
 
# 检索记忆
results = collection.query(
    query_texts=["用户的沟通风格偏好"],
    n_results=3
)

优势

  • 支持语义相似度检索
  • 能理解同义词和概念关联
  • 适合非结构化文本记忆

劣势

  • 不支持复杂的关系查询
  • 精确匹配性能不如关键词检索
  • 需要维护 Embedding 模型

关系型数据库

# SQLite 关系型数据库示例
import sqlite3
import json
 
# 创建连接
conn = sqlite3.connect('agent_memory.db')
cursor = conn.cursor()
 
# 创建用户偏好表
cursor.execute('''
    CREATE TABLE IF NOT EXISTS user_preferences (
        user_id TEXT PRIMARY KEY,
        preferences JSON,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
''')
 
# 存储用户偏好
preferences = {"language": "zh", "style": "concise", "tone": "friendly"}
cursor.execute('''
    INSERT OR REPLACE INTO user_preferences (user_id, preferences)
    VALUES (?, ?)
''', ("user_123", json.dumps(preferences)))
 
# 查询用户偏好
cursor.execute('SELECT preferences FROM user_preferences WHERE user_id = ?', ("user_123",))
result = cursor.fetchone()

优势

  • 支持 SQL 复杂查询
  • ACID 事务保证数据一致性
  • 成熟稳定,生态完善

劣势

  • 无法直接进行语义检索
  • 非结构化数据存储效率低
  • 扩展性受限于单机架构

4.2 选型决策矩阵

场景推荐技术理由
对话历史存储向量数据库需要语义检索相似对话
用户偏好管理关系型数据库结构化数据,需要精确查询
任务状态跟踪关系型数据库 + 内存需要事务保证,同时追求速度
知识库问答向量数据库语义检索是核心需求
临时缓存Redis / 内存追求极致速度

五、记忆系统设计原则

5.1 核心设计原则

┌─────────────────────────────────────────────────────────────┐
│                    记忆系统设计原则                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 分层存储原则                                            │
│     ┌─────────────────────────────────────────────────┐    │
│     │ • 热数据 → 短期记忆(Context Window)            │    │
│     │ • 温数据 → 工作记忆(内存变量)                  │    │
│     │ • 冷数据 → 长期记忆(外部存储)                  │    │
│     └─────────────────────────────────────────────────┘    │
│                                                             │
│  2. 检索效率优先                                            │
│     ┌─────────────────────────────────────────────────┐    │
│     │ • 精准检索 > 全量加载                            │    │
│     │ • 混合检索 > 单一检索                            │    │
│     │ • 缓存热点记忆                                   │    │
│     └─────────────────────────────────────────────────┘    │
│                                                             │
│  3. 记忆质量管理                                            │
│     ┌─────────────────────────────────────────────────┐    │
│     │ • 重要性评估:区分关键信息与噪声                 │    │
│     │ • 时效性管理:过期记忆自动清理                   │    │
│     │ • 冲突处理:新信息覆盖旧记忆                     │    │
│     └─────────────────────────────────────────────────┘    │
│                                                             │
│  4. 成本控制                                                │
│     ┌─────────────────────────────────────────────────┐    │
│     │ • Context Window 合理使用                       │    │
│     │ • 检索结果数量限制                               │    │
│     │ • 记忆压缩减少存储                               │    │
│     └─────────────────────────────────────────────────┘    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

5.2 设计最佳实践

实践说明示例
记忆分级根据重要性分配存储资源核心偏好永久存储,临时信息短期保存
增量更新只更新变化的部分用户修改偏好时,只更新对应字段
批量操作减少存储层访问次数批量写入对话历史
异步持久化不阻塞主流程先响应,后台写入长期记忆
索引优化加速检索查询为用户ID、时间戳建立索引

六、面试高频问题

Q1: Agent 的短期记忆和长期记忆有什么区别?

答案要点

维度短期记忆长期记忆
存储位置LLM Context Window外部存储(向量库/关系库)
生命周期会话期间永久
访问速度极快,直接参与推理较慢,需要检索 IO
容量限制受模型窗口限制理论无限制
典型内容当前对话历史、系统提示用户偏好、知识库、历史记录

不能只用长期记忆的原因

  1. 成本问题:每次都要检索,延迟和成本增加
  2. 上下文限制:检索结果仍需放入 Context Window
  3. 噪声干扰:过多无关记忆会影响推理质量

Q2: 为什么需要三层记忆模型,不能只用短期记忆吗?

答案要点

  1. 容量限制:Context Window 有限(4K-200K Token),无法存储所有历史
  2. 跨会话需求:用户希望 Agent 记住之前的偏好和约定
  3. 成本控制:全量输入 Context Window 成本高昂
  4. 推理效率:过多上下文会导致注意力分散,降低推理质量

Q3: 如何设计一个支持"用户偏好记忆"的 Agent?

答案要点

设计步骤:
1. 提取:识别用户偏好信息(如"我喜欢简洁的回答")
2. 存储:存入关系型数据库的 User_Preferences 表
3. 检索:每次对话开始时,根据用户ID检索偏好
4. 注入:将偏好注入到系统提示词中
5. 更新:当用户表达新偏好时,触发记忆更新

Q4: 解释一下 Generative Agents 中的记忆流概念?

答案要点

Generative Agents(Stanford 2023)提出了一种记忆流架构:

  1. 记忆流(Memory Stream)

    • 包含所有 Agent 观察、思考和计划的完整自然语言记录列表
    • 每条记忆包含:内容、创建时间、重要性分数
  2. 检索机制

    • 基于三个分数加权:最近性(Recency)、重要性(Importance)、相关性(Relevance)
    • Score = α × Recency + β × Importance + γ × Relevance
  3. 反思(Reflection)

    • Agent 定期暂停,从记忆流中抽取高分记忆
    • 生成抽象总结,形成更高层次的知识

Q5: 上下文窗口越来越大,记忆系统还重要吗?

答案要点

依然重要,原因如下

  1. 注意力分散

    • 全量输入会导致模型注意力分散
    • 相关信息被噪声淹没,推理质量下降
  2. 成本问题

    • 处理 100K Token 的推理成本远高于精准检索
    • 输入 Token 费用累积会很高
  3. 无限历史

    • 用户与 Agent 的交互历史理论上是无限的
    • 即使 200K 窗口也无法容纳所有历史
  4. 检索精准性

    • 精准检索相关记忆比全量输入更有效
    • RAG 的价值就在于此

七、总结

核心概念回顾

概念定义关键要点
三层记忆模型短期、长期、工作三种记忆分层存储,各司其职
短期记忆Context Window 中的上下文快速访问,容量有限
长期记忆外部持久化存储跨会话,需要检索
工作记忆推理过程的临时状态任务级生命周期
存储选型向量库 vs 关系库看是否需要语义检索

一句话总结

Agent 记忆系统通过三层架构(短期/长期/工作记忆)实现信息分层存储,结合合理的存储选型和检索策略,赋予 Agent 跨会话的连续性和知识积累能力。


最后更新:2026年3月18日