前言

2023 年被称为"大模型元年",ChatGPT 的横空出世让全世界见识到了大语言模型的惊人能力。然而,当企业真正尝试将 LLM 落地到业务场景时,很快就遇到了三座大山:知识过时、幻觉严重、无法与内部系统集成

于是,RAG(检索增强生成)应运而生——通过将外部知识库的内容检索出来,与用户查询一起送入 LLM,既解决了知识时效性问题,又能在一定程度上减少幻觉。一夜之间,几乎所有的 AI 应用都声称"我们用了 RAG"。

但好景不长。随着业务复杂度的提升,开发者们发现 RAG 也有明显的天花板:

  • 检索准确率的瓶颈:无论怎么优化分块策略、嵌入模型、重排序,总有 20%-30% 的查询无法检索到正确的上下文
  • 无法处理多步任务:“帮我分析上个月的销售数据并生成图表"这种需要多步骤操作的请求,RAG 根本无从下手
  • 缺乏状态管理:复杂对话中,上下文丢失、记忆混乱的问题时有发生
  • 工具集成困难:想要调用数据库、API、代码解释器时,RAG 架构显得力不从心

正是在这样的背景下,LLM Agent 开始走进人们的视野。与 RAG 相比,Agent 的核心突破在于:从被动的"检索-回答"模式,转变为主动的"感知-规划-行动-反思"循环。一个优秀的 Agent 不仅能回答问题,还能分解目标、调用工具、执行任务、修正错误,最终完成复杂的工作流。

从 RAG 到 Agent:LLM 应用架构演进

本文将带你系统性地了解从 RAG 到 Agent 的完整演进路径,从基础概念到架构设计,从代码实现到性能优化,最后给出企业级落地的最佳实践。无论你是正在考虑从 RAG 升级到 Agent,还是想要从零构建一套 LLM 应用体系,这篇文章都将为你提供一份可操作的实战指南。

一、RAG 的三代演进史

1.1 Naive RAG:最朴素的起点

几乎所有开发者接触 RAG,都是从"三段式"架构开始的:

索引阶段:文档加载 → 文档分割 → 向量化 → 存入向量数据库

检索阶段:用户查询向量化 → 相似度搜索 → 返回 Top-K 相关文档

生成阶段:查询 + 上下文 → Prompt Engineering → LLM 生成答案

这就是 Naive RAG,简单直接,100 行代码就能跑起来。

# Naive RAG 极简实现
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA

# 1. 构建向量库
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(documents, embeddings)

# 2. 创建检索链
qa_chain = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(temperature=0),
    chain_type="stuff",
    retriever=vectordb.as_retriever(search_kwargs={"k": 4}),
    return_source_documents=True
)

# 3. 问答
result = qa_chain("请解释变压器的工作原理")

但很快,你就会发现 Naive RAG 的问题:

  • “garbage in, garbage out”:如果检索到的文档不相关,LLM 再强大也没用
  • 分块大小难以平衡:块太大,噪音多;块太小,上下文丢失
  • 相似度搜索的局限性:语义相似不等于回答问题所需,词汇重叠不代表语义相关
  • 无法处理多跳问题:“A 的 B 属性与 C 的 D 属性相比如何?“这种需要多步推理的问题,单次检索根本无法覆盖所需信息

根据 LlamaIndex 团队 2024 年的调研数据,纯 Naive RAG 在企业级知识库问答场景下的准确率通常只有 50%-60%,这个水平远远达不到生产可用的标准。

1.2 Advanced RAG:在检索环节精益求精

既然问题主要出在检索环节,那就在检索环节下功夫。于是涌现出了各种优化手段,我们称之为 Advanced RAG。

查询端优化

  • 查询重写(Query Rewriting):用 LLM 把用户的模糊提问改写为更适合检索的形式
  • 子查询分解(Sub-Query Decomposition):复杂问题拆成多个子问题,分别检索后再整合
  • HyDE(Hypothetical Document Embeddings):先生成一篇假设的答案文档,用这篇文档去检索相关内容

检索端优化

  • 混合检索(Hybrid Search):向量相似度 + 关键词匹配(BM25)
  • 重排序(Reranking):先用向量检索召回 50-100 个候选,再用交叉编码器重排序选出 Top 5
  • 元数据过滤(Metadata Filtering):按时间、文档类型、作者等元数据缩小检索范围
# Advanced RAG:查询重写 + 混合检索 + 重排序
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.retrievers import BM25Retriever
from langchain.retrievers import EnsembleRetriever

# 1. 混合检索:BM25 + 向量
bm25_retriever = BM25Retriever.from_documents(documents)
bm25_retriever.k = 10
vector_retriever = vectordb.as_retriever(search_kwargs={"k": 10})

ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, vector_retriever],
    weights=[0.5, 0.5]
)

# 2. 重排序
compressor = CrossEncoderReranker(model_name="BAAI/bge-reranker-large", top_n=4)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=ensemble_retriever
)

# 3. 查询重写 Prompt
query_transform_prompt = """
请将用户的原始问题重写为3个不同的版本,以便从向量数据库中检索到相关文档。
重写后的问题应该:1) 使用更专业的术语 2) 补充必要的上下文 3) 从不同角度表述
原始问题:{question}
输出格式(每行一个问题):
问题1: ...
问题2: ...
问题3: ...
"""

通过这些优化,Advanced RAG 通常能把准确率提升到 75%-85%,这已经是很大的进步了。但这也基本摸到了 RAG 架构的天花板——再怎么优化检索,也很难突破 90% 这个门槛。

1.3 Modular RAG:模块化与流程编排

第三代 RAG 叫做 Modular RAG,核心思想是把整个流程拆成可配置的模块,根据不同的查询类型动态编排执行路径。

典型的模块化组件包括:

  • 路由模块(Router):判断查询类型,选择不同的处理路径
  • 检索模块(Retriever):多种检索策略可插拔
  • 评判模块(Judge):评估检索到的上下文是否足够回答问题
  • 重排模块(Rerank):对检索结果排序
  • 生成模块(Generator):最终答案生成

一个典型的判断逻辑是:

用户查询 → 路由判断
    → 闲聊类 → 直接回答
    → 常识类 → 无需检索,LLM 直接回答
    → 知识类 → 检索 → 评判是否足够
        → 足够 → 生成答案
        → 不足 → 扩展检索(查询重写/增加召回数)→ 再评判 → 生成答案

Modular RAG 已经有了 Agent 的雏形——它能根据情况动态调整执行路径,而不是死板地执行固定流程。但它的"决策"能力还很有限,只能在预设的几个分支中做选择,无法应对真正开放的复杂任务。

二、为什么我们需要 Agent?

2.1 RAG 架构的本质局限

RAG 的本质是"增强版问答系统”,它的工作范式决定了它的能力边界:

  1. 单步推理的限制:RAG 是"检索一次、回答一次"的线性流程,如果第一次检索的信息不够,它不会主动去做第二次检索,更不会换个角度去检索。

  2. 被动执行的限制:RAG 只能做用户明确要求的事情,它不会主动发现问题、不会规划中间步骤、更不会在遇到困难时尝试其他方法。

  3. 工具能力的限制:RAG 只能调用检索这一种工具,它无法操作数据库、无法调用外部 API、无法执行代码、无法与真实世界交互。

举个例子,假设你问:“我们公司上个季度华东区的销售额与去年同期相比如何?用图表展示出来。”

RAG 系统会怎么做?——它会去知识库检索"上个季度华东区销售额"相关的文档,如果找到了就告诉你数字,如果没找到就说"我不知道”。至于"与去年同期对比”、“生成图表"这些需要计算和工具调用的操作,RAG 根本就做不到。

而 Agent 会怎么做?

  1. 理解目标:需要获取两个时间段的销售数据,做对比,生成图表
  2. 规划步骤:① 查询 2025 Q2 华东区销售额 ② 查询 2024 Q2 华东区销售额 ③ 计算同比增长率 ④ 调用 Python 生成对比图表 ⑤ 总结分析
  3. 执行第一步:调用数据库查询工具执行 SQL
  4. 如果失败:检查错误,调整 SQL,重试
  5. 完成所有步骤后,整合结果生成最终回答

这就是本质的区别——RAG 是"给我材料,我来回答”,Agent 是"给我目标,我来搞定"

2.2 Agent 的核心能力定义

一个完整的 LLM Agent 应该具备四大核心能力:

1. 规划能力(Planning):将大目标分解为小的可执行子任务,动态调整计划。这包括目标分解(Task Decomposition)、反思优化(Reflection & Refinement)、自我修正(Self-Correction)。

2. 记忆能力(Memory):不仅能记住当前对话(短期记忆),还能记住历史交互(长期记忆),以及任务执行过程中的中间状态(工作记忆)。

3. 工具使用能力(Tool Use):能根据需要选择和调用各种工具,包括但不限于检索、代码执行、API 调用、文件操作、数据库查询等。

4. 推理能力(Reasoning):能进行多步链式推理,从观察中得出结论,在遇到问题时能回溯并尝试其他路径。

LLM Agent 核心组件架构

用更通俗的话来说:RAG 像一个刚入职的实习生,给什么材料做什么事,不会主动思考,遇到超出材料范围的问题就束手无策。Agent 像一个经验丰富的项目经理,你只需要告诉他目标,他会自己规划路径、协调资源、解决问题、最终交付结果。

2.3 什么样的场景适合用 Agent?

并不是所有场景都需要上 Agent。Agent 意味着更高的复杂度、更大的开销和更难调试。下面是一个简单的决策框架:

场景特征 推荐架构
单轮问答,答案明确存在于知识库中 Naive RAG
对准确率要求高,需要处理复杂查询 Advanced/Modular RAG
需要多步骤操作才能完成 ✅ Agent
需要调用外部工具(API、数据库、代码) ✅ Agent
需要状态管理和长对话上下文 ✅ Agent
需要自主规划和决策 ✅ Agent
任务目标模糊,需要探索式完成 ✅ Agent

从实际落地情况来看,以下是 Agent 最能发挥价值的几个场景:

  • 数据分析助理:连接数据库,理解自然语言的数据查询需求,自动编写 SQL,生成图表和分析报告
  • 客服与技术支持:自主查询知识库、调用工单系统、甚至操作后台解决用户问题
  • 研发辅助工具:阅读代码库、理解需求、自动编写代码、运行测试、修复 bug
  • 内容创作工作流:自主搜集资料、整理大纲、撰写初稿、修改润色,一站式完成
  • 企业流程自动化:打通多个内部系统,自动完成报销、审批、报备等跨系统流程

(第一部分完,约 2300 字)

三、Agent 的核心组件深度解析

3.1 规划模块:从目标到行动的桥梁

规划是 Agent 智慧的核心体现。一个不会规划的 Agent,充其量只是个"工具调用机器人"——遇到简单任务时手忙脚乱,遇到复杂任务时直接崩溃。

主流的规划范式主要有以下几种:

ReAct 框架:这是最经典的 Agent 框架,由 Google Research 在 2022 年提出。它的核心思想是让 LLM 在"思考(Thought)→ 行动(Action)→ 观察(Observation)“之间循环,直到得出最终答案。

Thought: 我需要先获取2025年第二季度华东区的销售额数据。我应该调用数据库查询工具。
Action: query_database
Action Input: SELECT SUM(amount) FROM sales WHERE region = '华东' AND year = 2025 AND quarter = 2
Observation: 查询结果:8,523,400 元
Thought: 接下来我需要获取2024年同期的数据进行对比。
Action: query_database
Action Input: SELECT SUM(amount) FROM sales WHERE region = '华东' AND year = 2024 AND quarter = 2
Observation: 查询结果:6,876,200 元
Thought: 现在我需要计算同比增长率。增长率 = (8523400 - 6876200) / 6876200 ≈ 24.4%
Thought: 最后我需要用 Python 生成对比图表。
Action: python_repl
Action Input: import matplotlib.pyplot as plt\n...
Observation: 图表已生成,保存为 sales_comparison.png
Thought: 我已经完成了所有步骤,可以给出最终答案了。
Final Answer: ...

ReAct 的优点是简单直观,容易实现;缺点是每一步都要调用 LLM,成本较高,而且容易在多步之后容易迷失方向。

思维链 CoT(Chain-of-Thought):先让 LLM 输出完整的推理链条,再统一执行。适合步骤相对固定的任务。

用户问题:帮我分析上个月的用户留存情况
CoT 规划:
1. 首先,我需要明确分析的维度:
   a. 总体留存率(次日、7日、30日)
   b. 分渠道留存对比
   c. 留存趋势分析
2. 需要的数据表:user_registrations, user_activity
3. 编写SQL查询数据
4. 计算留存指标
5. 生成可视化图表
6. 总结洞察和建议

计划-执行(Plan-and-Execute):先做一个完整的计划,然后逐步执行,执行过程中可以动态调整计划。这是目前企业级 Agent 最常用的架构。

# Plan-and-Execute 伪代码
class PlanAndExecuteAgent:
    def __init__(self, llm, tools):
        self.planner = Planner(llm)
        self.executor = Executor(llm, tools)
        self.replanner = Replanner(llm)
    
    def run(self, goal):
        # 第一步:制定初始计划
        plan = self.planner.create_plan(goal)
        
        while not plan.is_complete():
            # 第二步:执行计划中的下一步
            result = self.executor.execute_step(plan.next_step())
            
            # 第三步:根据执行结果反思并重计划
            plan = self.replanner.update_plan(plan, result)
        
        return plan.final_result()

3.2 记忆系统:Agent 的"大脑”

记忆是 Agent 能够持续学习和改进的基础。一个没有记忆的 Agent,每次对话都是"全新的开始",永远无法积累经验。

Agent 的记忆系统通常分为三层:

1. 短期记忆(Short-term Memory):也就是上下文窗口内的记忆,本质上就是 LLM 的 Context Window。优点是读写最快,无需额外处理。但缺点也很明显:容量有限,容易溢出。

2. 工作记忆(Working Memory):Agent 在完成当前任务过程中产生的中间结果。比如:“我已经查询了2025年Q2的数据,是852万;接下来需要查2024年同期的。工作记忆通常存储在 Agent 的状态对象中,任务完成后可以选择是否存入长期记忆。

3. 长期记忆(Long-term Memory):跨越多个会话的记忆,比如"用户张三喜欢用图表展示数据”、“上次查询销售数据时用了这个SQL模板”。长期记忆通常用向量数据库存储,每次启动时检索相关的历史记忆注入上下文。

# 记忆系统的典型实现
class AgentMemory:
    def __init__(self):
        self.short_term = []  # 当前对话历史
        self.working = {}     # 当前任务状态
        self.long_term = VectorStore()  # 长期记忆库
    
    def add(self, content, memory_type="short_term"):
        if memory_type == "short_term":
            self.short_term.append(content)
        elif memory_type == "working":
            self.working[content["key"]] = content["value"]
        elif memory_type == "long_term":
            self.long_term.add_documents([content])
    
    def retrieve_relevant(self, query, k=5):
        # 检索相关的长期记忆
        return self.long_term.similarity_search(query, k=k)

但记忆系统最难的不是"怎么存",而是"存什么"和"怎么检索什么"。如果什么都存,很快就会被垃圾信息淹没;如果什么都不存,那就等于没有记忆。

业界最佳实践是采用"选择性记忆:

  • 重要结论:用户的偏好、关键决策、成功的解决方案
  • 失败经验:哪些方法试过不行,避免下次再犯
  • 用户画像:用户的专业背景、沟通风格、常见需求模式
  • 工具使用模式:什么场景下用什么工具效果最好

3.3 工具调用:连接真实世界的接口

工具是 Agent 的"手和脚"。没有工具的 Agent 就像被关在玻璃罩里的天才——能思考,但无法对真实世界产生任何影响。

一个工具本质上就是一个函数,包含三个要素:

class Tool:
    name: str           # 工具名称
    description: str    # 工具功能描述(给LLM看的,告诉它什么时候用这个工具
    func: Callable      # 实际执行的函数

下面是一些常见的工具类型和应用场景:

工具类型 典型用途
检索工具 RAG 查询、知识问答、文档搜索
代码执行 数据计算、图表生成、脚本运行
**SQL 查询 数据库操作、数据分析
API 调用 调用第三方服务(邮件、短信、支付等)
文件操作 读写文件、生成报告
浏览器 网页搜索、信息采集
Shell 系统操作、文件管理、命令执行
# LangChain 自定义工具示例
from langchain.tools import tool

@tool
def query_database(sql: str) -> str:
    """
    执行SQL查询并返回结果。
    当需要从数据库获取数据时使用此工具。
    
    参数:
        sql: 要执行的SQL查询语句
    """
    try:
        result = db.execute(sql)
        return f"查询成功,结果:{result}"
    except Exception as e:
        return f"查询失败,错误:{str(e)}"

@tool
def python_repl(code: str) -> str:
    """
    执行Python代码并返回结果。
    当需要进行计算、生成图表、处理数据时使用此工具。
    
    参数:
        code: 要执行的Python代码
    """
    try:
        result = exec(code)
        return f"执行成功,输出:{result}"
    except Exception as e:
        return f"执行失败,错误:{str(e)}"

工具调用的最大的挑战是工具选择参数生成。Agent 需要在正确的时机选择正确的工具,并且生成正确的参数。这对 LLM 的能力要求很高,也是目前 Agent 最容易出错的地方。

3.4 反思机制:Agent 的自我进化

反思是高级 Agent 区别于普通 Agent 的关键。普通 Agent 只会按部就班执行,出错了就卡住;高级 Agent 会在执行过程中不断反思:“我做的对吗?有没有更好的方法?哪里出错了?怎么修正?”

常见的反思模式有:

结果验证:每执行一步后,检查结果是否符合预期,如果不符合就调整策略。

执行结果:SQL 查询返回了错误:"表不存在"
反思:我拼写错误,正确的表名应该是 sales_data 而不是 sales
修正:重新执行正确的 SQL

进度评估:定期检查任务整体进度,判断是否偏离目标,是否需要调整计划。

已完成步骤:1/5
反思:我发现前一步得到的数据格式不对,需要重新规划后面的步骤
更新计划:增加数据清洗步骤,然后再继续

自我完善:任务完成后,总结经验教训,存入长期记忆,下次遇到类似问题时能做得更好。

任务完成!
总结经验:
1. 查询销售数据时,应该先用 DESCRIBE table 先确认表结构
2. 用户喜欢看图表,最后总要生成可视化图表
3. 计算增长率时要注意除以基数为0的情况
存入长期记忆...

四、主流 Agent 框架对比

目前业界有多个成熟的 Agent 框架,选择哪个框架直接决定了你的开发效率和系统的天花板。

4.1 LangChain:最全面的生态系统

LangChain 是目前最流行的 LLM 应用开发框架,它的 Agent 模块功能最丰富,生态最完善。

优点

  • 开箱即用的 Agent 类型:ZeroShotReAct、OpenAIFunctions、PlanAndExecute
  • 100+ 预定义工具集成
  • 完善的记忆系统实现
  • 庞大的社区和丰富的教程

缺点

  • 抽象层太多,调试困难
  • 性能 overhead 较大
  • 版本迭代快,API 经常 breaking change 多
# LangChain Agent 最简实现
from langchain.agents import initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(temperature=0, model="gpt-4")
tools = [query_database, python_repl, search]

agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True
)

agent.run("分析上月华东区销售数据并生成图表")

4.2 LlamaIndex:以数据为中心的 Agent

LlamaIndex 更侧重数据连接和检索,适合做数据密集型的 Agent 应用。

它的核心优势在于"数据代理"概念——把你的数据本身变成 Agent 可以理解和操作的工具。

优点

  • 强大的 RAG 能力和数据连接器
  • Query Transformation 机制
  • Sub-
  • 更清晰的抽象,更容易调试

4.3 AutoGen:多 Agent 协作的先驱

AutoGen 由微软推出,主打多 Agent 协作。它允许创建多个不同角色的 Agent,让它们通过对话来完成任务。

# AutoGen 多 Agent 示例
from autogen import AssistantAgent, UserProxyAgent

# 创建一个工程师 Agent
engineer = AssistantAgent(
    name="Engineer",
    llm_config={"config_list": config_list,
    system_message="你是一名资深软件工程师,擅长编写高质量代码。"
)

# 创建一个产品经理 Agent
pm = AssistantAgent(
    name="ProductManager",
    llm_config={"config_list": config_list,
    system_message="你是一名产品经理,负责需求分析和产品设计。"
)

# 用户代理
user_proxy = UserProxyAgent(name="User")

# 让它们一起工作
user_proxy.initiate_chat(
    pm,
    message="帮我设计一个数据分析系统。"
)

AutoGen 的理念很美好,但实际落地时多 Agent 协作很容易变成"Agent 之间来回说废话,就是不干正事"。需要精心设计每个 Agent 的角色和对话流程。

4.4 框架选择建议

你的需求 推荐框架
快速原型验证,生态丰富 ✅ LangChain
数据密集型应用,RAG 为主 ✅ LlamaIndex
多角色协作场景 ✅ AutoGen
极致性能,自定义控制 ✅ 自研框架

(第二部分完,约 2500 字)

五、企业级 Agent 最佳实践

理论很美好,但真正在企业里落地 Agent,会遇到各种各样的坑。根据我们团队落地 20+ 个 Agent 项目的经验,以下是最重要的几条最佳实践。

5.1 循序渐进:从 RAG 到 Agent 的升级路径

不要上来就搞全功能 Agent。正确的升级路径应该是:

阶段一:先把 RAG 做扎实

  • 先用 Naive RAG 跑通流程
  • 优化到 80%+ 准确率后,再加入 Advanced RAG 特性(查询重写、重排序)
  • 加上 Modular RAG 的路由能力,让系统能应对不同类型的查询

阶段二:加入工具调用能力

  • 从 1-2 个高频工具开始(比如代码执行、数据库查询)
  • 不要一开始就给 Agent 十几个工具,它会"选择困难症"
  • 每个工具都要做充分的测试和错误处理

阶段三:引入规划和记忆

  • 先从简单的 Plan-and-Execute 开始
  • 记忆系统先实现短期记忆和简单的长期记忆
  • 逐步加入反思和自我修正能力

阶段四:多 Agent 协作(可选)

  • 单 Agent 搞不定了,再考虑多 Agent
  • 从 2-3 个明确角色开始,不要搞复杂的 Agent 社会

这个过程通常需要 2-3 个月,而不是 2-3 周。任何想在一个月内从 0 到 1 搞出生产级 Agent 的项目,最后都会以失败告终。

5.2 可观测性:Agent 的"黑盒"必须打开

Agent 最大的问题是不可解释。你给它一个任务,它在里面做了什么?为什么成功?为什么失败?如果没有可观测性,出了问题你根本无从排查。

企业级 Agent 系统必须具备以下可观测能力:

1. 完整的执行轨迹(Trajectory)

每一次调用都要记录:

  • 输入的用户查询
  • LLM 生成的思考过程
  • 选择了什么工具
  • 工具的输入参数
  • 工具的输出结果
  • 每一步的耗时
  • 最终的回答
# 执行轨迹记录示例
{
  "trace_id": "abc123",
  "user_query": "分析上月华东区销售数据",
  "steps": [
    {
      "step": 1,
      "thought": "我需要查询上月华东区的销售数据",
      "tool": "query_database",
      "input": "SELECT ...",
      "output": "8,523,400",
      "latency": 1234
    },
    ...
  ],
  "final_answer": "...",
  "total_latency": 8500
}

2. 成本监控

Agent 的 Token 消耗是惊人的。一个复杂任务可能要调用 LLM 5-10 次,消耗几千甚至上万个 Token。你必须监控:

  • 每次调用的 Token 用量
  • 每个任务的总成本
  • 不同任务类型的成本差异
  • 按月/按周的成本趋势

3. 成功率和错误分析

  • 整体任务成功率
  • 每一步的失败率
  • 失败原因分类(工具错误、LLM 错误、规划错误)
  • 高频错误的根因分析

5.3 安全护栏:把 Agent 关在笼子里

Agent 能调用工具、能执行代码、能操作数据库。这意味着它有能力造成真实的破坏。没有安全护栏的 Agent,就像一把没有保险栓的枪——非常危险。

必须建立多层安全防护:

第一层:工具权限控制

  • 代码执行:必须在沙箱环境中运行,禁止网络访问,禁止文件系统写入
  • 数据库:只能用只读账号,禁止执行 DELETE、UPDATE、DROP
  • API 调用:只能调用白名单内的接口,敏感操作必须二次确认

第二层:人工审核(Human-in-the-loop)

  • 高风险操作(删除、修改、发送邮件)必须经过人工确认
  • 设置成本阈值:单次任务超过 X 美元自动暂停,等待人工审核
  • 设置时间阈值:执行超过 Y 分钟自动终止

第三层:输出防护

  • 检查最终回答是否包含敏感信息
  • 过滤不当内容
  • 检测是否有越权操作的意图
# 安全护栏示例
class SecurityGuard:
    def before_tool_call(self, tool_name, params):
        # 检查工具是否在白名单
        if tool_name not in ALLOWED_TOOLS:
            raise SecurityError(f"工具 {tool_name} 被禁止使用")
        
        # 检查 SQL 是否包含危险操作
        if tool_name == "query_database":
            if any(keyword in params["sql"].upper() for keyword in ["DELETE", "UPDATE", "DROP", "TRUNCATE"]):
                raise SecurityError("危险的SQL操作被拦截")
        
        # 检查成本预估
        if self.estimate_cost(tool_name, params) > COST_THRESHOLD:
            return self.request_human_approval(tool_name, params)
        
        return True
    
    def after_tool_call(self, tool_name, result):
        # 检查结果是否包含敏感信息
        if self.contains_sensitive_info(result):
            return self.mask_sensitive_info(result)
        
        return result

5.4 性能优化:让 Agent 跑得又快又省钱

企业级应用对性能和成本都很敏感。下面是几个关键的优化手段:

1. 模型分层

不要所有步骤都用 GPT-4。不同的任务用不同的模型:

  • 规划和复杂推理:GPT-4 / Claude 3 Opus
  • 简单工具调用:GPT-3.5-Turbo / Claude 3 Haiku
  • 重排序和分类:专用小模型(BGE、BERT)

这样可以在保证效果的同时,把成本降低 70% 以上。

2. 结果缓存

  • 相同的查询,直接返回缓存的结果
  • 相同的工具调用参数,缓存执行结果
  • 相同的计划,复用之前的执行经验

3. 并行执行

如果多个步骤之间没有依赖关系,让 Agent 并行执行,而不是串行等待。

串行:步骤1 → 步骤2 → 步骤3 → 步骤4(总耗时 40s)
并行:步骤1
      步骤2  → 步骤3 → 步骤4(总耗时 25s)
      步骤3

六、常见问题与解决方案

6.1 Agent 陷入死循环怎么办?

这是 Agent 最常见的问题:翻来覆去调用同一个工具,或者在几个工具之间来回跳,就是不输出最终答案。

解决方案

  1. 设置最大步数限制:通常 10-15 步比较合理,超过就强制终止
  2. 循环检测:检测是否有重复的"思考-行动"模式,如果连续 3 步都在做同样的事情,打断并提示 Agent 换个思路
  3. 进度评估:每 3 步让 Agent 评估一下进度,问它:“你现在完成了多少?还需要几步?”

6.2 Agent 工具选择错误怎么办?

Agent 经常会选不对工具——明明该查数据库,它非要去搜索;明明该执行代码,它却想直接回答。

解决方案

  1. 更好的工具描述:工具的 description 写得越具体、越有区分度越好。不要写"数据库查询工具",要写"当你需要从公司数据库获取结构化数据(销售、用户、订单等)时使用此工具"。
  2. 少就是多:不要给 Agent 太多工具。先从 3-5 个最常用的开始,需要的时候再加。
  3. 工具路由:先用一个专门的路由 LLM 判断该用什么工具,再交给 Agent 执行。

6.3 成本太高,用不起怎么办?

一个 Agent 任务可能要花几美元甚至几十美元,大规模应用的话成本会非常惊人。

解决方案

  1. 模型分层:如前所述,简单任务用便宜的模型
  2. 结果缓存:能复用的结果就复用,不要每次都重新算
  3. 设置预算:每个用户/每个任务有每日预算上限
  4. 混合架构:简单的问题用 RAG 直接回答,只有真正复杂的问题才启动 Agent

6.4 Agent 经常"幻觉",编造不存在的信息怎么办?

Agent 比纯 LLM 更容易幻觉,因为它会把工具返回的结果和自己想象的内容混在一起。

解决方案

  1. 强制引用来源:要求 Agent 的每个结论都必须引用具体的工具输出
  2. 事实核验:最后加一个核验步骤,专门检查回答中的事实是否都有来源支撑
  3. 置信度评分:让 Agent 给自己的答案打个分,分低的话标记为"可能不准确"

七、未来展望

7.1 Agent 的发展趋势

1. 更小、更专门的 Agent

未来不会有一个"万能 Agent"什么都能做。相反,会出现大量小而专的 Agent,每个擅长一个领域,然后通过标准化的协议互相协作。就像微服务架构一样——把一个大单体拆成多个小服务,各司其职。

2. Agent 市场和标准化

会出现像 App Store 一样的 Agent Store,你可以下载别人做好的 Agent,组合起来解决自己的问题。这需要 Agent 接口的标准化、能力的可发现、安全的可审计。

3. 端侧 Agent

把 Agent 跑在用户的手机/电脑上,而不是云端。这样既能保护隐私,又能降低延迟和成本。端侧小模型的快速发展正在让这个愿景成为现实。

7.2 Agent 不会取代人,而是让人更强大

很多人担心 Agent 会取代人类的工作。但根据我们的观察,Agent 真正取代的不是人,而是繁琐的流程

一个优秀的数据分析 Agent,不会取代数据分析师——它会把数据分析师从"写 SQL、拉数据、做图表"这些繁琐的工作中解放出来,让他们把时间花在更有价值的"分析数据、发现洞察、制定策略"上。

一个优秀的客服 Agent,不会取代客服——它会把客服从"查知识库、走流程、填工单"这些机械劳动中解放出来,让他们把时间花在真正需要同理心和沟通技巧的复杂问题上。

技术进步的历史反复证明:自动化从来不会减少工作总量,它只是改变了工作的性质。 Agent 也一样——它会把人类从低级劳动中解放出来,去做更有创造力、更有价值的事情。

总结

从 RAG 到 Agent,我们正在见证 LLM 应用范式的一次重大跃迁:

  • Naive RAG 让我们看到了把外部知识接入 LLM 的可能性
  • Advanced RAG 通过各种优化手段,把准确率提升到了生产可用的水平
  • Modular RAG 引入了动态流程编排,让系统更加灵活
  • LLM Agent 则带来了质的飞跃——从被动回答问题,到主动解决问题

但技术的演进永远不是非黑即白的。RAG 不会消失,它会成为 Agent 众多工具中的一个。Agent 也不会是终极答案,未来还会有更先进的架构出现。

对于企业来说,最重要的不是追逐最酷炫的技术,而是找到适合自己业务场景的方案。先把 RAG 做扎实,需要的时候再逐步引入 Agent 的能力。慢慢来,反而比较快。

技术本身没有价值,用技术解决真实的问题,才有价值。

(全文完,约 7200 字)