执行既定的计划是一回事;当现实不可避免地偏离时,调整计划则是另一回事。在复杂、多变的环境中运行或与不可靠的外部系统交互的智能体,必须具备识别问题并相应调整行动的能力。这种自我校正和计划优化的能力,不仅仅是增强系统稳定性的一个功能;它是实现复杂、可靠自主行为的必要条件,尤其是在涉及工具协作的多步流程中。在规划和工具集成思路的基础上,我们现在检查智能体如何智能地对执行反馈、错误和意外情况做出反应。若无此能力,智能体将显得脆弱,容易被人类可以轻易解决的小问题所干扰。需要校正的偏离来源智能体的计划可能由于以下几个原因需要调整:工具执行失败: 这是一种常见情况。API 可能返回错误代码(例如,超出速率限制、输入无效、服务器不可用),超时,或者以意外格式或带有无意义值返回数据。环境变化: 计划所假定的状态在执行过程中可能发生变化。例如,某个资源变得不可用,新信息与先前的假设相悖,或者外部事件改变了当前的情境。计划假设不准确: 由大型语言模型(LLM)生成的初始计划可能基于有缺陷的推理或不完整的信息。某一步的执行可能显示出先决条件实际上未满足,或者所选方法从根本上不适用。工具行为异常: 工具在技术上可能成功(无错误代码),但产生的输出表明未达到预期结果(例如,搜索API返回零结果,数据库查询返回空集)。目标不清晰: 有时,执行某一步骤会显示出原始目标不够明确,需要先澄清或优化才能继续进行。识别适应的必要性在智能体能够修正其路线之前,它必须首先识别出偏离已经发生。有效的检测机制包含:显式结果检查: 编程智能体封装器或控制逻辑来验证工具输出。这可以涉及检查HTTP状态码,解析响应以查找特定错误消息,验证数据格式(例如,使用Pydantic模型或JSON schema),或将结果与预期值范围进行比较。基于LLM的评估: 在智能体循环中引入一个特定步骤,让LLM评估上次行动的结果。提示可能类似这样:“考虑到上一步是X,观测结果(工具输出)是Y,这是否达到了预期的子目标Z?如果不是,请解释差异并建议如何继续。”这运用LLM的推理能力来解释更复杂或细微的失败。状态监测与断言: 维护预期状态的内部表示,并在行动后将其与观测到的状态进行比较。定义明确的断言(例如,“在步骤Y之后文件X必须存在”),如果违反则触发校正逻辑。反馈整合: 确保所有来自工具执行的相关信息(成功消息、错误详情、输出数据)都被反馈回智能体的上下文窗口或记忆中,用于后续的推理步骤。截断或不完整的反馈会限制智能体诊断问题的能力。自我校正和计划优化的策略一旦检测到偏离,智能体需要适应的策略:重试: 对于网络超时或临时速率限制等瞬时问题,简单的重试逻辑(通常带有指数退避)可以有效。import time MAX_RETRIES = 3 INITIAL_BACKOFF = 1 # 秒 def execute_tool_with_retry(tool_func, *args, **kwargs): retries = 0 backoff = INITIAL_BACKOFF while retries < MAX_RETRIES: try: result = tool_func(*args, **kwargs) # 如果需要,在此添加应用层错误检查 return result # 成功 except ToolTimeoutError as e: # 示例特定异常 retries += 1 if retries >= MAX_RETRIES: raise e # 达到最大重试次数 time.sleep(backoff) backoff *= 2 # 指数退避 except ToolApiError as e: # 示例非瞬时错误 # 记录错误,可能需要不同处理方式 raise e # 对于某些错误不立即重试 # ... 其他潜在错误参数调整: 如果错误表明输入无效(例如,格式错误的查询,不支持的参数值),智能体可以根据错误消息或其对工具要求的理解尝试重新组织输入。这通常涉及另一次LLM调用来生成校正后的参数。选择替代工具: 如果某个特定工具持续失败或不适用(例如,搜索引擎提供不相关结果),智能体可以查阅其可用工具集,并选择一个执行类似功能的替代工具(例如,尝试不同的搜索API,查询特定数据库)。子目标修改: 失败可能表明计划中的某个特定子目标无法实现或不必要。智能体随后可以修改计划以跳过此子目标,用替代方案替换它,或确定总体目标无法实现。全面重新规划: 对于重大偏离或当简单校正失败时,智能体可能会放弃当前计划的剩余部分并触发一个完整的重新规划周期。这涉及将当前状态、已执行步骤的历史(包括失败)以及原始目标反馈回规划模块(通常是LLM本身),以便从当前情况生成一个新计划。从失败中学习: 将失败的行动序列、工具错误或无效计划的信息存储在智能体的长期记忆中(例如,向量存储或结构化数据库),可以避免在未来的任务中重复同样的错误。这涉及总结失败情境和尝试的(失败的)解决方案。实施注意事项集成自我校正需要仔细设计:校正提示: 用于规划和执行的提示应该明确让LLM为潜在失败做好准备,并指导其校正的推理过程。在提示中包含少量失败场景和成功校正的示例,可以大幅提高性能。状态追踪: 准确且最新的状态信息对于检测偏离和就校正做出明智决策极为重要。这包括外部环境状态和计划的内部执行状态。结构化错误处理: 智能体的控制循环需要强大的错误处理机制,能够区分可恢复错误(适合重试或调整)和致命错误(需要重新规划或任务终止)。避免校正循环: 设计不佳的校正机制可能导致无限循环,智能体反复尝试失败的策略。对重试次数设定限制、追踪校正尝试,并在持续失败后升级到重新规划,这些都是重要的保障措施。成本与延迟: 每次校正尝试,尤其是涉及LLM调用进行评估或重新规划的尝试,都会增加计算成本和延迟。系统设计必须在鲁棒性益处与这些额外开销之间取得平衡。示例:纠正失败的网页搜索设想一个智能体,其任务是使用网页搜索工具查找某只特定股票的当前价格。计划: 步骤1:使用web_search工具,查询内容为“ACME公司股票的当前价格”。执行: 智能体调用web_search工具。结果: 工具返回错误:“搜索API配额超出”。识别: 控制逻辑解析错误消息。校正(策略:带退避的重试): 智能体等待5秒并重试web_search调用。结果2: 工具成功返回,但结果列表只包含新闻文章,没有直接的价格报价。识别(策略:LLM评估): 智能体将结果反馈回LLM:“搜索‘ACME公司股票的当前价格’返回了这些片段:[...新闻标题...]。这是否提供了当前股票价格?如果不是,请建议一个修订的搜索查询或替代方法。”校正(策略:参数调整): LLM回应:“搜索没有提供价格。建议优化查询为‘ACME公司股票价格 $ticker_symbol’,或者如果可用,使用专用的financial_data_api工具。”优化/重新规划: 智能体更新其计划:步骤1a:对“ACME”使用financial_data_api工具。如果不可用或失败,步骤1b:使用web_search,查询内容为“ACME公司股票价格 $ACME”。执行: 智能体继续执行优化后的计划。校正循环的可视化该过程可以被视为基本智能体执行循环的延伸,引入了基于执行结果的决策点。digraph G { rankdir=TB; node [shape=box, style=rounded, fontname="Arial", fontsize=10, color="#495057", fontcolor="#495057"]; edge [fontname="Arial", fontsize=9, color="#868e96", fontcolor="#495057"]; Start [label="开始执行", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; Plan [label="获取下一个计划步骤"]; Execute [label="执行步骤(例如,使用工具)"]; Check [label="检查执行结果", shape=diamond, style=filled, fillcolor="#ffec99"]; Success [label="步骤成功?", shape=diamond, style=filled, fillcolor="#b2f2bb"]; Failure [label="步骤失败", shape=diamond, style=filled, fillcolor="#ffc9c9"]; Detect [label="分析失败原因"]; Correct [label="应用校正策略\n(重试、调整参数、替代工具)"]; Replan [label="重新评估 / 重新规划"]; Next [label="进入下一步 / 更新计划"]; End [label="任务完成 / 失败", shape=ellipse, style=filled, fillcolor="#dee2e6"]; Start -> Plan; Plan -> Execute; Execute -> Check; Check -> Success [label=" 有效输出"]; Check -> Failure [label=" 错误 / 无效输出"]; Success -> Next [label=" 是"]; Success -> End [label=" 否(计划完成)"]; Failure -> Detect; Detect -> Correct; Correct -> Replan [label=" 已应用校正"]; Replan -> Plan [label=" 生成/选择新步骤"]; Next -> Plan; }包含失败检测、校正和基于步骤结果的潜在重新规划的执行循环。总之,自我校正和计划优化不是可选的附加项,而是构建能够在严格受控的沙盒环境之外可靠运行的智能体的必要组成部分。通过实施检测偏离的机制和适应计划或执行方法的策略,我们正迈向能够处理复杂任务和交互中固有不确定性和动态变化的智能体。所采用的具体技术将取决于应用、可用工具以及在抗故障能力、成本和复杂性之间可接受的权衡。