目录
1. 认知科学基础
1.1 人类记忆系统层次
人类记忆分为三个主要层次:
- 感觉记忆:持续时间极短(0.5-3秒),容量巨大,临时保存感官信息
- 工作记忆:持续时间短(15-30秒),容量有限(7±2个项目),负责当前任务
- 长期记忆 :持续时间长(可达终生),容量几乎无限,分为:
- 程序性记忆:技能和习惯(如骑自行车)
- 陈述性记忆:语义记忆(知识和概念)+ 情景记忆(个人经历)
1.2 智能体的局限与解决方案
- 无状态导致对话遗忘 → 引入记忆系统
- 知识局限性 → 引入RAG(检索增强生成)技术
2. 记忆系统架构
2.0 记忆与RAG系统整体架构
记忆系统架构(四层架构)
Agents记忆系统
├── 基础设施层 (Infrastructure Layer)
│ ├── MemoryManager - 记忆管理器(统一调度和协调)
│ ├── MemoryItem - 记忆数据结构(标准化记忆项)
│ ├── MemoryConfig - 配置管理(系统参数设置)
│ └── BaseMemory - 记忆基类(通用接口定义)
├── 记忆类型层 (Memory Types Layer)
│ ├── WorkingMemory - 工作记忆(临时信息,TTL管理)
│ ├── EpisodicMemory - 情景记忆(具体事件,时间序列)
│ ├── SemanticMemory - 语义记忆(抽象知识,图谱关系)
│ └── PerceptualMemory - 感知记忆(多模态数据)
├── 存储后端层 (Storage Backend Layer)
│ ├── QdrantVectorStore - 向量存储(高性能语义检索)
│ ├── Neo4jGraphStore - 图存储(知识图谱管理)
│ └── SQLiteDocumentStore - 文档存储(结构化持久化)
└── 嵌入服务层 (Embedding Service Layer)
├── DashScopeEmbedding - 通义千问嵌入(云端API)
├── LocalTransformerEmbedding - 本地嵌入(离线部署)
└── TFIDFEmbedding - TFIDF嵌入(轻量级兜底)
RAG系统架构(四层架构)
Agents RAG系统
├── 文档处理层 (Document Processing Layer)
│ ├── DocumentProcessor - 文档处理器(多格式解析)
│ ├── Document - 文档对象(元数据管理)
│ └── Pipeline - RAG管道(端到端处理)
├── 嵌入表示层 (Embedding Layer)
│ └── 统一嵌入接口 - 复用记忆系统的嵌入服务
├── 向量存储层 (Vector Storage Layer)
│ └── QdrantVectorStore - 向量数据库(命名空间隔离)
└── 智能问答层 (Intelligent Q&A Layer)
├── 多策略检索 - 向量检索 + MQE + HyDE
├── 上下文构建 - 智能片段合并与截断
└── LLM增强生成 - 基于上下文的准确问答
图 2.0 Agents记忆与RAG系统整体架构
记忆系统和RAG系统是两个独立但可协同工作的工具:
- memory_tool:负责存储和维护对话过程中的交互信息
- rag_tool:负责从知识库中检索相关信息作为上下文,并可将重要结果自动存储到记忆系统中
2.1 记忆形成过程
记忆形成的五个阶段(认知过程)
输入信息 → 编码 → 存储 → 检索 → 整合 → 遗忘
↓ ↓ ↓ ↓
转换格式 保存信息 提取信息 短期→长期
记忆形成的具体阶段:
- 编码:将感知到的信息转换为可存储的形式
- 存储:将编码后的信息保存在记忆系统中
- 检索:根据需要从记忆中提取相关信息
- 整合:将短期记忆转化为长期记忆
- 遗忘:删除不重要或过时的信息
图 2.1 记忆形成的认知过程
人类记忆形成经历五个关键阶段:
- 编码:将信息转换为可存储的形式
- 存储:保存信息到记忆系统
- 检索:根据需要提取相关信息
- 整合:将短期记忆转为长期记忆
- 遗忘:删除不重要或过时的信息
2.2 记忆系统完整工作流程
记忆系统工作流程
新信息进入
↓
[编码]:生成向量表示 + 添加元数据(时间戳、重要性等)
↓
[存储]:分发到相应的记忆模块
│
├─→ 工作记忆(纯内存,TTL管理)
├─→ 情景记忆(SQLite+Qdrant)
├─→ 语义记忆(Neo4j+Qdrant)
└─→ 感知记忆(Qdrant模态分离)
↓
[检索]:接收查询 → 多模块并行搜索 → 结果融合排序 → 返回
↓
[整合]:定期扫描 → 识别重要记忆 → 转换为长期记忆
↓
[遗忘]:三种策略:
├─ 基于重要性:删除低重要性记忆
├─ 基于时间:删除过期记忆
└─ 基于容量:存储超限时删除最不重要记忆
图 2.2 Agents记忆系统的完整工作流程
2.2 四层架构设计
- 基础设施层:MemoryManager(指挥中心)、MemoryItem(标准化记忆项)、MemoryConfig(配置管理)、BaseMemory(基类接口)
- 记忆类型层:工作记忆、情景记忆、语义记忆、感知记忆
- 存储后端层:Qdrant(向量存储)、Neo4j(知识图谱)、SQLite(文档存储)
- 嵌入服务层:百炼API(云端)、本地模型(离线)、TF-IDF(兜底)
3. 四种记忆类型
3.0 具体例子说明:四种记忆在实际场景中的应用
为了更好地理解四种记忆类型的区别和用途,让我们用一个真实的**"个人学习助手"**场景来举例说明。
假设你正在构建一个帮助学生学习编程的智能助手,以下是四种记忆如何协同工作:
场景示例:学生"小明"正在学习Python
| 记忆类型(英文) | 记忆类型(中文) | 实际内容示例 | 存储方式 | 关键点说明 |
|---|---|---|---|---|
| Working Memory | 工作记忆 | "小明刚才问了'Python列表怎么切片?',上一轮我们讲了索引从0开始,当前正在看第五章的内容" | 纯内存存储 | 信息只在当前对话有用,需要极快的访问速度,对话结束后可以丢弃,不需要持久化到数据库 |
| Episodic Memory | 情景记忆 | "2024年3月15日,小明完成了他的第一个Python程序:Hello World。3月18日,小明在做第三章习题时遇到了困难,我们一起解决了循环问题。3月20日,小明问了5个关于函数的问题,理解进展很好" | SQLite+Qdrant混合存储 | SQLite存储时间戳、会话ID等结构化数据,Qdrant存储向量表示便于语义检索,既可以按"3月的所有事件"查询,也可以按"Python相关的问题"检索 |
| Semantic Memory | 语义记忆 | "小明喜欢用简洁的示例代码,更擅长理解用实际项目举例的概念,小明的目标是做Web开发,重点需要学习Django。Python是解释型语言,支持面向对象编程" | Neo4j+Qdrant混合存储 | Neo4j存储知识图谱:小明→目标→Web开发→需要学习→Django,Qdrant存储向量表示,可以推理:小明今天问了Python,那我应该提一下Django,适合存储用户偏好、领域知识等长期记忆 |
| Perceptual Memory | 感知记忆 | "小明上传了一张他写的代码截图,里面有一个语法错误。小明发了一段他运行程序时的错误日志截图。小明分享了一个他参考的视频教程链接" | Qdrant模态分离存储 | 每个模态(图像、音频)有独立的向量集合,用CLIP模型实现"用文本描述搜索图片",支持跨模态检索:"帮我找到小明上次上传的有语法错误的截图" |
为什么选择不同的存储介质?
工作记忆为什么用纯内存?
想象一下,如果每次对话都要读写数据库来获取上一句话,响应会有多慢!工作记忆需要毫秒级的响应,所以必须存在内存里。而且这些临时信息对话结束后就没用了,不需要持久化。
情景记忆为什么用SQLite+Qdrant?
你可能想查"3月份小明学了什么",这需要按时间查询(SQLite擅长);也可能想查"小明遇到过什么循环问题",这需要语义搜索(Qdrant擅长)。两者结合,既有结构化查询的灵活性,又有语义检索的智能性。
语义记忆为什么用Neo4j+Qdrant?
纯向量搜索只能找到"相关"的知识,但知识图谱能理解"关系"。比如系统知道"小明→目标→Web开发→需要→Django",这就可以做推理:"小明今天问了Python,那我应该提一下Django,因为他想做Web开发"。这是纯向量检索做不到的。
感知记忆为什么用模态分离存储?
图片和文本的向量维度完全不同,如果硬塞在一起会互相干扰。分开存储,每个模态用专门的编码器,效果最好。而且CLIP模型可以让它们在语义空间中对齐,实现跨模态搜索。
3.1 四种记忆类型对比
| 记忆类型(英文) | 记忆类型(中文) | 特点 | 存储方式 | 评分重点 | 应用场景 |
|---|---|---|---|---|---|
| Working Memory | 工作记忆 | 容量有限(50条)+ TTL自动清理 | 纯内存 | 语义相似度 + 时间衰减 + 重要性权重 | 临时会话信息 |
| Episodic Memory | 情景记忆 | 长期存储事件和经历 | SQLite+Qdrant | 语义相似度 + 时间近因性 + 重要性 | 学习历程、交互事件 |
| Semantic Memory | 语义记忆 | 抽象知识和概念 | Neo4j+Qdrant | 语义相似度 + 图检索 + 重要性 | 用户偏好、领域知识 |
| Perceptual Memory | 感知记忆 | 多模态信息(图像、音频等) | Qdrant(模态分离) | 语义相似度 + 时间近因性 + 重要性 | 文档特征、多模态内容 |
3.2 工作记忆(Working Memory)
- 纯内存存储,访问速度极快
- TTL机制自动清理过期数据(默认60分钟)
- 容量限制防止内存溢出(默认50条)
- 混合检索策略:TF-IDF向量化 + 关键词匹配
3.3 情景记忆(Episodic Memory)
- SQLite存储结构化元数据,Qdrant存储语义向量
- 支持时间序列和会话级检索
- 复杂评分机制:语义相似度(0.8权重)+ 时间近因性(0.2权重)
- 适合记录具体事件和学习经历
3.4 语义记忆(Semantic Memory)
- 知识图谱存储实体和关系,向量存储语义表示
- 混合检索:向量检索(语义理解)+ 图检索(关系推理)
- 评分公式:(向量×0.7 + 图检索×0.3)×重要性权重
- 支持复杂的关系推理和知识发现
3.5 感知记忆(Perceptual Memory)
- 模态分离的存储策略,支持文本、图像、音频检索
- 使用CLIP模型实现跨模态语义对齐
- 评分公式与情景记忆类似,但针对多模态进行优化
- 适合处理文档特征和多媒体内容
4. MemoryTool核心操作
4.1 统一接口设计
MemoryTool提供统一的入口,支持所有记忆操作。核心操作包括:
- add(添加记忆) :支持四种类型,自动管理会话和元数据
- 重要参数:content(内容)、memory_type(类型)、importance(重要性,0.0-1.0)
- search(搜索记忆):语义检索,支持类型和重要性过滤
- forget(遗忘记忆) :三种策略
- 重要性策略:删除低于阈值的记忆
- 时间策略:删除超过天数的记忆
- 容量策略:存储超限时删除最不重要的记忆
- consolidate(整合记忆) :自动将重要的短期记忆转为长期记忆
- 默认:工作记忆 → 情景记忆(重要性≥0.7)
5. 检索增强生成(RAG)系统
5.1 基本概念
RAG系统工作流程
┌────────────────────────────────────────────────────────────────────┐
│ 数据准备阶段 │
└────────────────────────────────────────────────────────────────────┘
任意格式文档(PDF/Word/图片/音频)
↓
MarkItDown统一转换
↓
Markdown文本
↓
智能分块(基于Markdown标题结构)
↓
向量化(嵌入模型)
↓
存储到Qdrant向量数据库
┌────────────────────────────────────────────────────────────────────┐
│ 查询与生成阶段 │
└────────────────────────────────────────────────────────────────────┘
用户查询
↓
转换为向量表示
↓
Qdrant向量检索(支持MQE+HyDE)
↓
注入到LLM的prompt中
↓
生成包含来源参考的准确回答
图 5.1 RAG系统的核心工作原理
RAG(检索增强生成)是结合信息检索和文本生成的技术,流程分为两个主要模式:
数据处理流程:处理和存储知识文档
- 使用MarkItDown将任意格式文档统一转换为Markdown格式
- 基于Markdown结构进行智能分块
- 对每个分块进行向量化
- 存储到Qdrant向量数据库
查询与生成流程:根据查询检索相关信息并生成回答
- 将用户查询转换为向量表示
- 在向量数据库中检索相关文档分块
- 将检索到的信息作为上下文注入到LLM的prompt中
- 生成包含来源参考的准确回答
5.2 核心技术
5.2.1 多模态文档处理
使用MarkItDown统一转换:
- 支持PDF、Word、Excel、图片、音频等格式
- 图像通过OCR识别,音频通过转录
- 一切格式 → Markdown格式
5.2.2 智能分块策略
基于Markdown结构的精确分割:
- 标题层次解析
- 段落语义分割
- Token计算分块(中英文混合支持)
- 重叠策略保持上下文连续性
5.2.3 高级检索策略
- MQE(多查询扩展):生成语义等价的多样化查询,提升召回率30%-50%
- HyDE(假设文档嵌入):生成假设答案文档,改善检索精度
- 扩展检索框架:统一管理多种检索策略,支持并行执行和结果合并
6. 学习要点与建议
6.1 关键设计思想
- 认知科学启发:模仿人类记忆的分层架构
- 关注点分离:MemoryTool处理接口,MemoryManager负责核心逻辑
- 混合存储:向量存储(快速检索)+ 图存储(关系推理)+ 文档存储(元数据)
- 统一接口:单一入口,支持所有操作
- 自动化管理:TTL自动清理、智能整合、选择性遗忘
6.2 最佳实践
- 选择合适的记忆类型:临时信息→工作记忆,事件→情景记忆,知识→语义记忆
- 使用重要性参数:为重要信息设置高评分(≥0.7)
- 定期整合:让系统自动提升重要记忆到长期存储
- 合理配置分块:根据文档类型调整大小(默认1000Token)
- 启用高级检索:MQE+HyDE提升专业领域问题的准确性
6.3 进阶方向
- 多模态RAG:处理图像、音频、视频
- 持续学习:让智能体从经历中学习
- 记忆编辑:允许用户修正智能体的记忆
- 性能优化:提升大知识库的检索速度
总结
│
├── 1. 认知科学基础
│ ├── 人类记忆系统层次
│ │ ├── 感觉记忆(0.5-3秒)
│ │ ├── 工作记忆(15-30秒,7±2个项目)
│ │ └── 长期记忆
│ │ ├── 程序性记忆(技能和习惯)
│ │ └── 陈述性记忆
│ │ ├── 语义记忆(知识概念)
│ │ └── 情景记忆(个人经历)
│ └── 智能体的局限与解决方案
│ ├── 无状态导致对话遗忘 → 记忆系统
│ └── 知识局限性 → RAG系统
│
├── 2. 记忆系统架构
│ ├── 记忆形成过程
│ │ ├── 编码 → 存储 → 检索 → 整合 → 遗忘
│ ├── 四层架构设计
│ │ ├── 基础设施层:MemoryManager、MemoryItem、MemoryConfig、BaseMemory
│ │ ├── 记忆类型层:Working、Episodic、Semantic、Perceptual
│ │ ├── 存储后端层:Qdrant、Neo4j、SQLite
│ │ └── 嵌入服务层:DashScope、Local、TF-IDF
│ └── 完整工作流程:编码→存储→检索→整合→遗忘
│
├── 3. 四种记忆类型
│ ├── Working Memory(工作记忆):纯内存+TTL
│ ├── Episodic Memory(情景记忆):SQLite+Qdrant
│ ├── Semantic Memory(语义记忆):Neo4j+Qdrant
│ └── Perceptual Memory(感知记忆):Qdrant模态分离
│
├── 4. MemoryTool核心操作
│ ├── add:添加记忆
│ ├── search:搜索记忆
│ ├── forget:遗忘记忆(三种策略)
│ └── consolidate:整合记忆(短期→长期)
│
├── 5. RAG系统
│ ├── 数据处理流程:文档处理→分块→向量化→存储
│ ├── 查询与生成流程:查询→检索→增强→生成
│ ├── 核心技术
│ │ ├── 多模态文档处理(MarkItDown)
│ │ ├── 智能分块策略(基于Markdown)
│ │ └── 高级检索策略(MQE + HyDE)
│
├── 6. 智能文档问答助手
│ └── PDFLearningAssistant类:RAGTool + MemoryTool
│
└── 7. 学习要点与建议
├── 关键设计思想
├── 最佳实践
└── 进阶方向
图 8.1 agents第八章知识总结
记忆系统让智能体能够"记住"过去,RAG系统让智能体能够"学习"新知。两者结合,构建了真正"智能"的助手。关键创新:
- 分层记忆架构:工作→情景→语义→感知,覆盖所有场景
- 认知科学算法:遗忘、整合、检索策略模拟人类大脑
- 统一文档处理:MarkItDown转换任意格式为标准Markdown
- 高级检索:MQE+HyDE解决用词差异和语义鸿沟
- 可扩展设计:支持云端、本地、混合部署方案
这种架构可以应用于:
- 个人助理:记住用户偏好和习惯
- 知识问答:基于文档提供专业解答
- 客户服务:个性化服务和历史查询
- 学习系统:追踪学习历程和进度