https://arxiv.org/html/2505.09970v2
让我用一个具体的对话客服场景来演示 Pre-Act 和 ReAct 的区别。
用户查询:我想查询我的储蓄账户(尾号1234)余额,然后把5000元从储蓄账户转到我的信用卡(尾号5678)还款,最后告诉我转账后的储蓄账户余额。
可用的工具:
check_balance(account_number) - 查询账户余额transfer_funds(from_account, to_account, amount) - 转账check_credit_card_balance(card_number) - 查询信用卡欠款展开代码用户:我想查询储蓄账户余额,转账5000元到信用卡,然后告诉我新余额。 AI思考: 1. 用户要先查询储蓄账户余额。我需要账户号,用户提到了尾号1234。 行动:check_balance("1234") 系统返回:储蓄账户余额为15,000元。 AI思考: 2. 用户要转账5000元到信用卡。需要源账户、目标账户和金额。源账户是1234,目标账户是信用卡5678,金额是5000。 行动:transfer_funds("1234", "5678", 5000) 系统返回:转账成功。手续费10元。 AI思考: 3. 用户想知道转账后的新余额。需要再次查询。 行动:check_balance("1234") 系统返回:储蓄账户余额为9,990元。 AI思考: 4. 现在可以给出最终答案。 最终回答:已为您完成操作。转账前余额15,000元,成功转账5000元到信用卡5678(手续费10元),当前储蓄账户余额为9,990元。
问题:ReAct 是走一步看一步,没有提前规划。如果转账时发现余额不足,或者信用卡账户不存在,它只能在出错后才重新思考。
展开代码用户:我想查询储蓄账户余额,转账5000元到信用卡,然后告诉我新余额。 AI 先生成完整计划: 【多步规划与推理】 计划步骤: 1. 步骤1(验证与查询): - 目标:确认账户有效性并获取当前余额 - 思考:需要先确认储蓄账户1234存在且有足够余额。调用余额查询。 - 行动:check_balance("1234") 2. 步骤2(执行转账): - 目标:执行转账操作 - 思考:在确认余额足够后,从1234向信用卡5678转账5000元。需要验证信用卡账户有效性。 - 行动:transfer_funds("1234", "5678", 5000) 3. 步骤3(确认结果): - 目标:验证转账结果 - 思考:转账成功后,重新查询储蓄账户余额,计算是否准确扣除。 - 行动:check_balance("1234") 4. 步骤4(最终回答): - 目标:汇总信息给用户 - 思考:整合所有步骤结果,提供清晰总结。 - 行动:生成最终答案 【开始执行】
执行过程:
展开代码执行步骤1: 行动:check_balance("1234") 结果:余额为2,000元(注意:这里余额不足!) AI重新规划: 【计划调整】检测到余额不足,原计划步骤2不可行。 更新计划: 1. 步骤1(已完成):余额2,000元 2. 步骤2(新):通知用户余额不足 - 思考:余额仅2,000元,不足5,000元转账。需要建议用户修改金额或存款。 - 行动:告知用户“您的储蓄账户余额仅2,000元,无法转账5,000元。您希望:a) 修改转账金额 b) 先存款再转账 c) 取消操作?” 执行步骤2(新): 用户响应:那转账2,000元吧。 AI重新规划: 【计划调整】用户修改金额为2,000元,继续执行。 更新计划: 3. 步骤3:执行调整后的转账 4. 步骤4:查询新余额 5. 步骤5:最终回答 ...继续执行
| 场景 | ReAct 的反应 | Pre-Act 的反应 |
|---|---|---|
| 余额不足 | 执行转账时才会失败,然后重新思考 | 在规划阶段就考虑到余额验证,或在执行第一步后就发现问题,立即调整计划 |
| 账户不存在 | 调用工具失败后重新规划 | 可以在规划中加入“验证账户存在性”的预备步骤 |
| 复杂依赖 | 可能遗漏步骤间的依赖关系 | 提前规划能看到完整流程,识别依赖(如:必须先登录才能查询) |
| 异常处理 | 被动反应异常 | 主动规划中可包含异常处理分支 |


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!