跳转至

4.1 Agent 定义:感知-规划-行动循环


一、核心概念

在做 RAG 系统的时候,你可能已经注意到一个问题:用户的需求越来越复杂,一次检索-生成根本不够用。「帮我分析竞争对手的最新财报,然后生成一份 PPT 提纲」——这件事需要搜索、读取文件、理解数字、生成结构化内容,多个步骤环环相扣,每一步的输出是下一步的输入。

传统的做法是写一堆 if-else,把这些步骤硬编码成流水线。但问题在于,现实需求的路径千变万化——财报可能在 PDF 里,也可能在网页上;用户可能要横向对比三家公司;中途可能发现数据不够,需要追加搜索。规则引擎穷举不完这些分支。

Agent 解决的正是这个问题:让 LLM 在运行时动态决定"下一步做什么",而不是在代码里提前把路径写死。 它的核心循环很简单——感知(Perception)、规划(Planning)、行动(Action)——但这个循环赋予了系统真正的自适应能力。理解这个循环,是构建一切复杂 Agent 系统的基础。


二、原理深讲

2.1 与传统 RPA / 规则引擎的核心区别

RPA(Robotic Process Automation)和规则引擎是自动化领域的老兵,但它们有一个根本性的局限:路径在部署前就已确定

来看一个对比:

维度 RPA / 规则引擎 LLM Agent
决策方式 预定义规则树,if-else 分支 LLM 在运行时动态推理
对异常的处理 规则未覆盖则报错或走 fallback 可尝试推理出应对策略
适应新需求 需要人工修改代码/规则 通过 Prompt 调整即可适配
理解语义 只能处理结构化输入 可理解自然语言、模糊指令
典型失败场景 网页 DOM 结构变了,脚本崩溃 上下文丢失导致推理出错
适用边界 高重复、低变化、强合规的流程 高变化、语义理解要求高的任务

一句话总结:RPA 是精准的流水线执行器,Agent 是有判断力的通用任务执行者。前者更可靠、更快、更便宜,适合"我知道怎么做"的场景;后者更灵活,适合"我知道要什么结果,但不确定怎么做"的场景。

工程判断:如果一个任务的路径可以完整枚举,用 RPA 或规则引擎;只有路径不确定、需要语义理解时,才引入 Agent。用 Agent 不等于更好,它引入了不确定性,代价是真实的。


2.2 感知-规划-行动:核心循环机制

Agent 的运作本质是一个迭代循环,每一轮包含三个阶段:

graph TD
    A[用户输入 / 环境状态] --> B[感知 Perception\n格式化观察,纳入上下文]
    B --> C[规划 Planning\nLLM 推理:下一步做什么?]
    C --> D{是否需要行动?}
    D -- 是 --> E[行动 Action\n调用工具 / 写入记忆]
    E --> F[观察结果 Observation\n工具返回值]
    F --> B
    D -- 否,任务完成 --> G[生成最终回答]

    style C fill:#4A90D9,color:#fff
    style E fill:#E86C4A,color:#fff

感知(Perception):将所有输入——用户的问题、历史对话、工具返回值——整理成 LLM 能处理的 Prompt。这一步看似简单,但信息的组织方式直接影响规划质量。差的感知层会把无关信息全部塞进上下文,导致 LLM "分心"。

规划(Planning):这是 LLM 真正发挥作用的地方。给定当前状态,LLM 决定:任务是否完成?如果没有,下一步应该调用哪个工具,传入什么参数?这个决策过程可以是隐式的(一步推断),也可以是显式的(生成 Thought 后再决定 Action,即 ReAct 范式,我们在 4.2 节深入讲)。

行动(Action):执行决策——调用搜索 API、执行 SQL、写文件、调用另一个 Agent。行动结果作为新的"观察"(Observation)被送回感知层,开始下一轮循环。

终止条件:Agent 在两种情况下退出循环:LLM 判断任务已完成,或者达到最大迭代次数限制(必须设,否则死循环)。


2.3 Agent 的四大核心能力

一个 Agent 是否"好用",取决于它在以下四个维度上的实现质量:

graph LR
    subgraph "Agent 核心能力"
        M[记忆 Memory]
        T[工具 Tools]
        P[规划 Planning]
        A[行动 Action]
    end

    M --> |提供历史上下文| P
    T --> |扩展感知与执行边界| A
    P --> |决策序列| A
    A --> |反馈结果| M

    style M fill:#6B8E23,color:#fff
    style T fill:#8B6914,color:#fff
    style P fill:#4A90D9,color:#fff
    style A fill:#E86C4A,color:#fff

记忆(Memory):Agent 的记忆分三层。短期记忆是当前对话的上下文窗口,用完即弃;长期记忆是写入向量数据库的历史信息,下次对话还能检索;外部记忆是结构化存储(数据库、文件系统),存放精确的结构化状态。记忆系统的设计决定了 Agent 的"持久性",没有长期记忆的 Agent 每次对话都是"失忆"状态。

工具(Tools):工具是 Agent 与外部世界的接口——搜索引擎、代码解释器、数据库、其他 API。工具的质量上限直接决定了 Agent 能做什么。一个原则:工具的描述(description)比实现更重要,LLM 是根据描述来决定要不要调用这个工具的,描述模糊就会导致工具被错误调用或完全忽视。

规划(Planning):规划能力决定 Agent 是否能把复杂目标拆解为可执行序列。简单任务直接 ReAct 循环就够;复杂任务需要先生成全局计划再逐步执行(Plan-and-Execute);更高级的场景需要动态重规划——执行途中发现计划不可行时能自我纠正。

行动(Action):行动不只是调用工具,还包括"不调用工具直接回答"、"向用户请求澄清"、"终止任务并报告失败"。能优雅地终止是一种被严重低估的能力——很多初级 Agent 实现会在工具调用失败后无限重试,而不是向上汇报问题。


2.4 Agent 可靠性现状:任务完成率 Benchmark 解读

这是一个让人清醒的话题。Agent 的实际表现远没有 Demo 视频里那么亮眼。

几个权威 Benchmark 的数据(截至 2025 年):

Benchmark 测试内容 顶级模型成绩 说明
SWE-Bench Verified 真实 GitHub Issue 修复 ~50%(Claude 3.7 Sonnet) 软件工程任务,需多步代码修改
GAIA 需多步推理的通用助手任务 ~60%(GPT-4 系列) Level 3 难题仍 <30%
τ-Bench 模拟真实客服/零售场景的工具调用 ~60–70% 有真实用户中断、模糊指令
WebArena 真实网站操作自动化 ~35–45% 模拟真实浏览器环境

数字背后的工程含义:50% 的任务完成率,意味着如果你在生产环境让 Agent 自主执行 100 个任务,有 50 个会出错或无法完成。这在很多场景是不可接受的。

为什么 Agent 容易失败?主要原因集中在以下几类: - 上下文累积错误:多轮循环后,错误的中间结果污染后续推理 - 工具调用幻觉:LLM 生成了格式正确但语义错误的工具参数 - 任务漂移:长任务中 Agent 忘记原始目标,偏向最近的子任务 - 缺乏自我怀疑:到了应该停止并求助的时候,仍然继续执行

工程推论:当前阶段,Agent 适合作为"人类的加速器"而非"人类的替代者"。最可靠的落地模式是 Human-in-the-Loop——在高风险操作前插入人工审批节点,而不是让 Agent 全程自主运行。随着模型能力提升,这个比例会逐步向自动化倾斜,但盲目追求"全自动"在现阶段是一种工程冒险。


三、工程视角:常见误区与最佳实践

误区一:把 Agent 当作万能方案正确做法:先评估任务路径的确定性。如果一个任务的步骤可以穷举(如"每天早上爬取数据,写入数据库,发邮件"),用定时任务 + 脚本,比 Agent 更快、更稳、更便宜。只有路径不确定、需要语义判断时,Agent 的成本才值得。

误区二:不设最大迭代次数限制正确做法:任何 Agent 循环都必须设置 max_iterations(通常 10–20 步)。LLM 有时会陷入"我以为我在进步但其实在原地打转"的状态——比如反复调用同一个工具,得到相同的错误,却不知道该终止。没有上限保护,你的 API 账单会告诉你什么叫"无限循环"。

误区三:工具描述写得太简略正确做法:工具的 description 字段要写清楚"什么情况下用这个工具"、"什么情况下不该用"、"参数的格式要求"。反例:description: "搜索信息";正例:description: "当需要获取实时网络信息、新闻或不在知识库中的内容时使用。不要用于查询本地数据库中已有的结构化数据。query 参数应为简洁的关键词,不超过 20 字。"

误区四:用 Agent 处理所有的错误重试正确做法:工具调用的瞬时失败(网络超时、速率限制)应该在工具封装层用指数退避重试,而不是让 LLM 感知错误后"思考如何重试"——这会浪费 Token 且效果不稳定。LLM 应该处理的是"这个工具在语义上无法完成任务",而不是"这个 API 超时了"。

误区五:在生产环境跳过 Human-in-the-Loop正确做法:识别任务中的"破坏性操作"——删除数据、发送消息、执行支付、修改代码部署——并在这些节点设置人工审批。LangGraph 的 interrupt_before 机制可以优雅实现这一点(见 4.5 节)。规则是:副作用可逆的操作可以自动执行,副作用不可逆的操作需要人工确认


四、延伸思考

🤔 思考题一:当前 Agent 的任务完成率在复杂任务上仍然停留在 50% 上下,但 LLM 本身的能力在持续提升。你认为"模型更强"能否线性地提升 Agent 的可靠性?还是 Agent 的可靠性瓶颈有一部分在架构设计上,与模型能力无关?

🤔 思考题二:感知-规划-行动循环本质上是一个序列决策问题,这与强化学习(RL)中的 Markov Decision Process 高度相似。为什么当前主流 Agent 框架选择了"用 LLM 做策略推断"而不是"训练一个 RL 策略网络"?这两条路线在工程落地上各有哪些权衡?(提示:结合 DeepSeek-R1 的 GRPO 训练方式思考。)