第 1.5.6 节:用 ReAct、Plan-and-Solve 和 Reflection 选择 Agent 范式
本节围绕“用 ReAct、Plan-and-Solve 和 Reflection 选择 Agent 范式”展开,先建立直观判断,再进入工程细节。完成本节后,你应该能够说清 ReAct、Plan-and-Solve 和 Reflection 的处理顺序、关键检查点和失败处理。
上一节已经把第一个 Agent(智能体)整理成演示脚本和面试讲法。本节继续补一个新手很容易跳过、但面试常被追问的问题:这个 Agent 到底采用哪种经典范式,为什么不是另一种?
这里不追求背论文名词,而是把 ReAct、Plan-and-Solve 和 Reflection 变成工程选择表。读完本节后,你应该能用同一个客服退款投诉任务,说明三种范式的状态字段、失败模式、适用边界和验收证据。
经典范式的价值不是给项目贴标签,而是帮助你控制任务如何推进、何时调用工具、何时停止、何时复核。工程边界是:范式只能决定流程组织方式,不能替代权限系统、字段契约、工具审批和人工复核。
三种范式先放到工程语言里
| 范式 | 工程理解 | 适合的问题 | 不适合的问题 |
|---|---|---|---|
| ReAct(推理与行动交替) | 每一步都在“判断下一步、调用工具、读取结果、更新状态”之间循环。 | 信息需要边查边判断,例如先查订单,再决定是否需要售后政策和人工审批。 | 步骤固定、无需中途观察的简单分类任务。 |
| Plan-and-Solve(先计划再执行) | 先生成任务计划,再按计划逐步执行,并在关键节点校验计划是否仍成立。 | 多步骤任务、跨工具任务、需要向用户说明执行路线的任务。 | 用户问题很短、一步就能完成的任务。 |
| Reflection(反思修正) | 先产出候选结果,再用规则、样例或评审器检查并修正。 | 需要提高回答质量、格式稳定性或风险控制的生成任务。 | 高风险业务动作本身。反思不能替代权限、审批和工具校验。 |
实现步骤或决策流程
实现时先不要问“用哪个框架更高级”,而要按任务复杂度、工具依赖、风险等级和验收证据选择范式。
同一个任务怎么选择
任务:用户说“我买的耳机坏了,客服之前说可以退,我现在要你马上给我退款。”
读图重点:读图时先比较三条回环:观察回环、计划回环、修正回环;它们都不能绕过权限和人工门禁。
| 判断维度 | ReAct | Plan-and-Solve | Reflection |
|---|---|---|---|
| 最小目标 | 逐步确认订单、售后政策和风险。 | 先拆出确认订单、核对政策、判断审批、生成回复四步。 | 检查回复有没有承诺退款、有没有遗漏订单号、有没有风险提示。 |
| 必备状态字段 | current_step、tool_results、missing_fields、next_action、stop_reason。 | plan_steps、active_step、step_status、blocked_reason。 | draft_answer、review_findings、revision_count、final_decision。 |
| 最容易失败 | 工具循环失控;每一步都查一点,但没有收束。 | 计划写得漂亮,执行时没有根据工具结果调整。 | 自我修正变成改写文案,没有发现业务风险。 |
| 停止条件 | 信息不足、工具失败、需要人工审批、任务完成。 | 计划完成、计划失效、关键步骤阻塞、需要重规划。 | 达到修正次数、通过规则检查、仍不确定则转人工。 |
| 验收证据 | 工具调用轨迹和状态迁移表。 | 计划表、执行日志和计划变更记录。 | 候选输出、检查项、修正记录和最终输出。 |
Mock-first 示例:ReAct 最小轨迹
这里的“判断摘要”不是模型隐藏推理,而是系统允许记录的可审计决策摘要。
| 步骤 | 输入或观察 | 动作 | 状态更新 |
|---|---|---|---|
| 1 | 用户要求立即退款,但没有订单号。 | 不调用退款工具,先识别缺失字段。 | missing_fields=["order_id"],risk_level="medium"。 |
| 2 | 用户补充订单号。 | 调用 get_order_status 查询订单。 | used_tools=["get_order_status"],保存工具结果摘要。 |
| 3 | 工具返回订单已签收 45 天。 | 调用 get_refund_policy 查询售后规则。 | current_step="policy_check"。 |
| 4 | 规则显示超过普通退货期,但可走质保检测。 | 生成安全回复并准备工单草稿。 | next_action="create_ticket_draft",stop_reason="needs_user_confirm"。 |
ReAct 适合这个任务,是因为任务中间必须读取工具结果再决定下一步。如果只是“用户输入分类”,用 ReAct 反而会让流程变重。
Mock-first 示例:Plan-and-Solve 最小计划
| 计划步骤 | 执行条件 | 失败处理 |
|---|---|---|
| 1. 收集订单号和商品问题 | 用户没有提供订单号时阻塞。 | 追问订单号,不进入工具调用。 |
| 2. 查询订单状态 | 订单号格式合法。 | 查询失败时记录错误并转人工。 |
| 3. 查询售后政策 | 订单存在且商品类目明确。 | 政策缺失时不能承诺退款。 |
| 4. 生成回复和工单草稿 | 政策、风险和缺失字段明确。 | 高风险或不确定时要求人工确认。 |
Plan-and-Solve 适合向读者或面试官展示“这个 Agent 怎么拆任务”。但计划不是一次写完就永远正确,工具结果可能让计划重排或提前停止。
Mock-first 示例:Reflection 最小检查
| 检查项 | 不合格样例 | 修正方向 |
|---|---|---|
| 是否越权承诺退款 | “我马上给你退款。” | 改成“需要先核对订单和售后政策”。 |
| 是否遗漏必要字段 | 没有订单号仍继续创建退款。 | 先追问订单号或创建缺信息工单。 |
| 是否说明下一步 | 只安抚用户,没有动作。 | 明确下一步是核对订单、质保检测或人工处理。 |
| 是否保留审计信息 | 没有记录为何拒绝自动退款。 | 记录 review_findings 和 stop_reason。 |
Reflection 适合做输出质量和风险复核,不适合直接决定高风险业务动作。退款、审批、权限和资金动作仍然要交给工具契约、权限系统和人工门禁。
范式选择表
| 场景 | 首选范式 | 为什么 | 需要补的工程保护 |
|---|---|---|---|
| 客服问题分流 | 简单状态机或轻量 ReAct | 只需识别意图、风险和缺失字段。 | 输出 schema 校验、停止条件。 |
| 退款投诉预处理 | ReAct + Reflection | 需要查询订单和政策,也要检查回复是否越权。 | 工具权限、审批、修正次数上限。 |
| 多部门工单流转 | Plan-and-Solve + ReAct | 需要先拆计划,再逐步执行。 | 计划版本、步骤状态、异常转人工。 |
| RAG 知识库问答 | ReAct 或 Reflection | 需要检索证据,也需要复核引用是否支撑答案。 | 引用校验、拒答规则、检索日志。 |
| 高风险自动审批 | 不建议只靠 Agent 范式 | 范式不能替代业务控制。 | 人工审批、权限系统、审计日志。 |
作品集里怎么写
不要写“我使用了 ReAct 框架”。更好的写法是:
我把客服退款投诉任务拆成 ReAct 风格的受控循环:每一步只允许读取状态、调用白名单工具、保存工具结果摘要并判断停止条件。对最终回复再做 Reflection 风格的风险检查,防止越权承诺退款。整个流程有状态字段、工具轨迹、失败兜底和回归样例。
常见错误
| 错误 | 后果 | 改法 |
|---|---|---|
| 把范式当成框架名词 | 面试时只能背概念,讲不出工程边界。 | 用同一个业务任务解释状态、工具、停止条件和验收证据。 |
| 用 Reflection 代替审批 | 高风险动作可能被模型自我修正后直接放行。 | Reflection 只做输出复核,退款、删除、发布等动作仍走权限和人工门禁。 |
| ReAct 没有停止条件 | 工具循环失控,成本和延迟不可控。 | 为每个循环设置最大步数、失败分支和转人工条件。 |
| Plan-and-Solve 不允许重规划 | 工具结果变化后仍按旧计划执行。 | 给计划加版本、步骤状态和阻塞原因。 |
练习题
基础练习
用自己的话解释 ReAct、Plan-and-Solve 和 Reflection 的区别。要求用“查订单并生成售后回复”这个任务举例。
项目练习
为你的第一个 Agent 写一张范式选择表,至少包含:任务类型、首选范式、必备状态字段、失败模式、停止条件和验收证据。
挑战任务
把“售后投诉预处理 Agent”改成组合范式:先用 Plan-and-Solve 生成计划,再用 ReAct 执行工具步骤,最后用 Reflection 检查回复。要求说明每一层的边界,不能让 Reflection 直接批准退款。
本节交付物与面试讲法
| 交付物 | 要求 |
|---|---|
| 范式选择表 | 能解释为什么选某种范式,以及为什么不用其他范式。 |
| 状态字段表 | 至少列出计划、当前步骤、工具结果、修正次数和停止原因。 |
| 失败模式表 | 覆盖循环失控、计划失效、自我修正失真、越权工具调用。 |
| 面试讲法 | 能把范式讲成工程控制方式,而不是只背概念。 |
小结
经典 Agent 范式不是标签,而是任务控制方式。ReAct 解决边观察边行动,Plan-and-Solve 解决先拆任务再执行,Reflection 解决候选结果复核。真正的工程能力,是知道什么时候组合它们,什么时候不用它们,以及用哪些状态、日志、权限和验收样例兜住风险。