从 RAG 到 Agent Memory 的技术演进分析
一、概述
1. 背景
随着 AI Agent 技术的发展,如何让 AI 系统具备持久化记忆能力成为关键问题。本文从第一性原理出发,分析从检索增强生成(RAG)到 Agentic RAG,再到 Agent Memory 的技术演进路径。
2. 核心问题
A. 问题定义
传统大语言模型(LLM)是无状态的,其知识仅限于训练阶段的参数化知识。如何让 LLM 在推理过程中访问外部知识源,并实现持久化记忆?
B. 解决思路演进
- RAG:一次性检索外部知识
- Agentic RAG:通过工具动态检索
- Agent Memory:通过工具读写实现持久化记忆
3. 技术本质
从本质上讲,RAG、Agentic RAG 和 Agent Memory 都是在解决同一个问题:如何在外部知识源(如文本文件或数据库)中创建、读取、更新和删除信息,并将其与 LLM 的上下文窗口进行交互。
二、RAG:只读的一次性检索
1. 核心概念
检索增强生成(Retrieval-Augmented Generation,RAG)于 2020 年由 Lewis 等人提出,2023 年开始流行。它是首个让无状态 LLM 能够访问过去对话和训练时未见过的外部知识的概念。
2. 工作原理
A. 系统组成
- 离线索引阶段:将文档存储到外部知识源(如向量数据库)
- 在线查询阶段:根据用户查询检索相关上下文,结合查询一起输入 LLM
B. 工作流程
graph LR
A[文档集合] -->|离线索引| B[向量数据库]
C[用户查询] -->|生成embedding| D[相似度搜索]
D -->|检索top-k| B
B -->|返回相关上下文| E[LLM生成]
C --> E
E --> F[最终回答]C. 伪代码实现
# Stage 1: Offline ingestion
def store_documents(documents):
for doc in documents:
embedding = embed(doc)
database.store(doc, embedding)
# Stage 2: Online Retrieval + Generation
def search(query):
query_embedding = embed(query)
results = database.similarity_search(query_embedding, top_k=5)
return results
def answer_question(question):
# Always retrieve first, then generate
context = search(question)
prompt = f"Context: {context}\nQuestion: {question}\nAnswer:"
response = llm.generate(prompt)
return response3. 关键限制
RAG 是一次性解决方案,存在以下局限:
A. 盲目检索
无论是否必要,都会从外部知识源检索额外信息
B. 单次检索
只检索一次,不考虑检索结果是否相关或正确
C. 单一数据源
所有额外信息来自同一个外部知识源
D. 只读操作
信息只能离线存储,推理时无法写入、修改或删除
三、Agentic RAG:工具调用的只读检索
1. 核心改进
Agentic RAG 将检索步骤定义为 Agent 可以使用的工具,解决了 Naive RAG 的多个限制:
A. 智能决策
Agent 首先判断是否需要额外信息
B. 工具选择
决定使用哪个工具进行检索(如专有数据库 vs 网络搜索)
C. 结果评估
评估检索到的信息是否与用户查询相关
2. 工作流程
graph LR
A[用户查询] --> B{Agent决策}
B -->|需要检索| C[选择工具]
C --> D[SearchTool]
D --> E[向量数据库]
D --> F[网络搜索]
E --> G{评估结果}
F --> G
G -->|相关| H[LLM生成回答]
G -->|不相关| C
B -->|不需要| H
H --> I[返回用户]3. 伪代码实现
class SearchTool:
def __init__(self, database):
self.database = database
def search(self, query):
query_embedding = embed(query)
results = self.database.similarity_search(query_embedding, top_k=5)
return results
def agent_loop(question):
messages = [{"role": "user", "content": question}]
while True:
response = llm.generate(
messages,
tools=[SearchTool]
)
if response.tool_calls:
for tool_call in response.tool_calls:
if tool_call.name == "search":
results = search_tool.search(tool_call.arguments["query"])
messages.append({
"role": "tool",
"content": f"Search results: {results}"
})
else:
return response.content4. 持续限制
虽然 Agentic RAG 实现了动态检索,但信息仍然是在离线阶段存储的,推理时只能读取而不能写入、修改或删除。这意味着系统无法从过去的交互中学习和改进。
四、Agent Memory:工具调用的读写操作
1. 核心突破
Agent Memory 通过引入内存管理概念,克服了 RAG 和 Agentic RAG 的限制,使 Agent 能够从过去的交互中学习,并通过更个性化的方式提升用户体验。
2. 工作原理
A. 基础架构
基于 Agentic RAG 的基本原理,使用工具从外部知识源(内存)检索信息。
B. 关键扩展
与 Agentic RAG 不同,Agent Memory 还使用工具向外部知识源写入信息。
C. 工作流程
graph LR
A[用户查询] --> B{Agent决策}
B -->|需要检索| C[SearchTool]
B -->|重要信息| D[WriteTool]
C --> E[内存系统]
D --> E
E -->|返回记忆| F[LLM生成]
F --> G[返回用户]
G -->|交互完成| D3. 内存管理策略
A. 简单实现
将原始对话历史存储在集合中,Agent 可以搜索过去的对话以查找相关信息。
B. 扩展实现
- 对话摘要:提示内存管理系统创建对话摘要供将来参考
- 事件驱动记忆:Agent 在对话中注意到重要信息(如用户偏好 emoji 或生日)并基于此事件创建记忆
C. 伪代码实现
class SearchTool:
def __init__(self, database):
self.database = database
def search(self, query):
results = self.database.search(query)
return results
class WriteTool:
def __init__(self, database):
self.database = database
def store(self, information):
self.database.store(information)
def agent_loop(question):
messages = [{"role": "user", "content": question}]
while True:
response = llm.generate(
messages,
tools=[SearchTool, WriteTool]
)
if response.tool_calls:
for tool_call in response.tool_calls:
if tool_call.name == "search":
results = search_tool.search(tool_call.arguments["query"])
messages.append({
"role": "tool",
"content": results
})
elif tool_call.name == "store":
result = write_tool.store(
tool_call.arguments["information"]
)
messages.append({
"role": "tool",
"content": result
})
else:
return response.content4. 新挑战
Agent Memory 虽然实现了持久化,但也引入了新挑战:
- 内存损坏
- 需要内存管理策略(如遗忘机制)
五、三种技术对比
1. 功能对比表
| 技术 | 存储信息 | 检索信息 | 编辑和删除信息 |
|---|---|---|---|
| RAG | 离线索引阶段 | 一次性检索 | 手动操作 |
| Agentic RAG | 离线索引阶段 | 通过工具动态检索 | 手动操作 |
| Agent Memory | 通过工具动态存储 | 通过工具动态检索 | 通过工具动态操作 |
2. 技术演进路径
graph TD
A[RAG] -->|工具化| B[Agentic RAG]
B -->|写入能力| C[Agent Memory]
A1[离线存储] --> A
A2[一次性检索] --> A
A3[只读操作] --> A
B1[离线存储] --> B
B2[动态检索] --> B
B3[只读操作] --> B
C1[动态存储] --> C
C2[动态检索] --> C
C3[动态读写] --> C3. 关注点演变
A. 第一阶段:如何检索信息
优化 Naive RAG 的检索方面,使用不同的检索技术:
- 向量搜索
- 混合搜索
- 关键词搜索
B. 第二阶段:从哪里检索
使用正确的工具从不同知识源检索信息:
- 是否需要检索信息?
- 如果需要,从哪里检索?
C. 第三阶段:如何管理信息
随着 Agent Memory 的出现,重点转向信息管理:
- 信息的创建、修改和删除
- 内存管理和遗忘策略
- 个性化用户体验
六、简化模型的局限性
1. 单一内存源
上述简化模型只展示了单一内存源,但在实际应用中,可以使用多个数据集合来存储不同类型的内存:
A. 程序性内存(Procedural Memory)
例如:与用户互动时使用 emoji
B. 情景内存(Episodic Memory)
例如:用户在 10 月 30 日讨论旅行计划
C. 语义内存(Semantic Memory)
例如:埃菲尔铁塔高 330 米
D. 对话历史
原始对话历史的单独数据集合
2. 内存管理策略
简化模型缺少 CRUD 操作之外的高级内存管理策略,如 MemGPT 中实现的:
- 内存压缩
- 重要性评估
- 遗忘机制
3. 相关研究
CoALA(Complement and Augment Language Agents)论文详细讨论了多类型内存系统的设计。
七、技术实现要点
1. 核心组件
A. 向量数据库
- 存储文档 embedding
- 支持相似度搜索
- 常见选择:Chroma、FAISS、Pinecone
B. Embedding 模型
- 将文本转换为向量表示
- 常见选择:OpenAI embeddings、Sentence Transformers
C. LLM
- 生成回答和决策
- 需要支持工具调用(Function Calling)
- 常见选择:GPT-4、Claude、开源模型
2. 工具设计原则
A. SearchTool
- 输入:查询文本
- 输出:相关文档列表
- 实现:向量相似度搜索
B. WriteTool
- 输入:要存储的信息
- 输出:存储确认
- 实现:数据库写入操作
C. 其他工具
- UpdateTool:更新现有记忆
- DeleteTool:删除过时记忆
- ConsolidateTool:合并相似记忆
3. 提示工程
设计合适的系统提示,使 Agent 能够:
- 识别何时需要检索信息
- 识别何时需要存储信息
- 评估检索结果的相关性
- 生成有价值的记忆摘要
八、应用场景
1. 个人助理
- 记住用户偏好和习惯
- 跟踪重要事件和日期
- 提供个性化建议
2. 客户服务
- 记录客户历史问题
- 提供连续性服务体验
- 自动生成常见问题解答
3. 知识管理
- 构建企业知识库
- 自动总结会议记录
- 跨会话信息关联
4. 教育辅导
- 跟踪学习进度
- 记住学生薄弱环节
- 提供个性化学习路径
九、总结
1. 技术本质
从 RAG 到 Agentic RAG 再到 Agent Memory 的演进,本质上是在解决同一个问题:如何在外部知识源中管理信息并与 LLM 交互。
2. 关键差异
- RAG:离线存储、一次性检索、只读
- Agentic RAG:离线存储、动态检索、只读
- Agent Memory:动态存储、动态检索、读写
3. 发展趋势
技术发展的重点从如何检索信息,到从哪里检索,最终发展到如何管理信息。Agent Memory 通过引入持久化和个性化能力,为 AI Agent 系统带来了更接近人类记忆的特性。
4. 未来方向
- 更复杂的内存管理策略
- 多模态记忆(图像、音频等)
- 分布式内存系统
- 隐私保护和安全记忆