从 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[最终回答]

RAG工作流程

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 response

3. 关键限制

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[返回用户]

Agentic RAG工作流程

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.content

4. 持续限制

虽然 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 -->|交互完成| D

Agent Memory工作流程

3. 内存管理策略

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.content

4. 新挑战

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[动态读写] --> C

技术演进路径

3. 关注点演变

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. 未来方向

  • 更复杂的内存管理策略
  • 多模态记忆(图像、音频等)
  • 分布式内存系统
  • 隐私保护和安全记忆

参考资料

  1. The Evolution from RAG to Agentic RAG to Agent Memory – Leonie Monigatti
最后修改:2026 年 01 月 17 日
如果觉得我的文章对你有用,请随意赞赏