AI Agent(二):执行循环

AI Agent / Python / 状态机2026.10.099 分钟阅读

Python 执行循环中的动作校验、工具反馈、停止条件和状态恢复。

消息、动作与观察

执行循环需要把用户请求、模型提议和工具观察区分开。请求说明希望解决的问题;动作包含工具名和参数;观察记录执行结果。自然语言回答单独作为输出类型,由控制器明确区分。

一个便于测试的内部协议可以只支持 tool 和 final 两类动作。tool 包含 name、arguments 和 call_id;final 包含回答及引用的证据标识。模型适配器将供应商协议转换为内部结构,控制器只处理标准化事件,因此切换模型不必重写订单工具。

{
  "type": "tool",
  "call_id": "call-1",
  "name": "get_order",
  "arguments": {"order_id": "O-1042"}
}

call_id 将结果匹配到对应提议,即使并行调用乱序返回也能正确关联。业务订单号标识查询对象;写操作另设业务操作 ID,用于响应丢失后的核查和重试。

执行循环与终止条件

控制器每轮先检查预算,组织可用状态,再请求一次动作。工具提议经过结构校验和权限检查后执行,观察追加到状态;完成提议则经过结果验证。动作无法解析、工具不存在或引用不成立时,控制器返回受控错误或停止。

停止至少区分成功、需要用户输入、需要人工处理、预算耗尽和执行失败。预算耗尽表示当前运行未取得足够结果。订单仍在运输和物流接口不可用也属于不同状态,最终回答应明确是哪一种。

预算可以包含模型轮数、工具调用数、总输入输出 token、墙钟时间和费用。步骤上限用于终止反复查询,单次超时用于中止迟迟没有返回的调用;再设置任务截止时间,控制总耗时。

完成检查应包含程序能验证的条件。例如调查任务至少需要订单和物流两类成功观察,引用必须来自当前会话。回答是否正确理解证据,另做事实核对。

控制器持有循环状态,向策略函数传递观察的深拷贝,只接收返回动作。跨进程实现使用序列化消息和数据库记录保存状态。

Python 最小实现

离线示例使用 Python 标准库,内置 O-1042 与 L-88,依次生成查询订单、查询物流和完成三类动作。策略函数是确定性测试替身,不调用语言模型。它使控制器、权限和错误路径能够重复测试,接入真实模型时只替换策略适配器。

python3 order_agent_demo.py
def scripted_policy(observations):
    if not observations:
        return {"type": "tool", "call_id": "call-1",
                "name": "get_order",
                "arguments": {"order_id": "O-1042"}}
    if len(observations) == 1:
        return {"type": "tool", "call_id": "call-2",
                "name": "get_shipment",
                "arguments": {"order_id": "O-1042"}}
    return {"type": "final",
            "answer": "订单已发货,物流记录尚未显示派送。",
            "evidence_ids": ["order:O-1042:v3", "shipment:L-88:v2"]}

脚本策略按观察数量推进预设路径。正常运行会输出 completed、两条观察和带证据的回答;把可信客户改为 C-8,第一次工具访问返回 NOT_FOUND。接入模型后,由模型读取观察内容并选择后续动作。

工具参数中只接受 order_id,客户身份由控制器从会话注入。完成校验要求两种查询均成功且引用匹配已取得的证据。示例只查询内置数据。

把脚本策略替换为模型适配器时,适配器接收用户目标与已确认观察,构造供应商消息,解析模型输出并返回相同的动作对象。真实网络调用要单独设置超时;JSON 解析错误、内容截断和拒绝响应应转换成明确状态。完成状态由 final 动作与结果校验共同确定。

控制器对完成动作执行的是引用集合和工具覆盖检查。若回答声称“已经签收”却引用 collected 记录,示例仍可能通过结构校验,因为它没有自然语言蕴含检查。接入模型后需增加事实核对,或直接由结构字段生成回答。

错误分类与恢复

参数错误、业务拒绝、临时故障和结果未知需要不同策略。参数缺少订单号时请求补全,无权访问时停止查询,临时限流时在预算内退避,写操作超时则优先核查业务状态。

状态含义处理方式
INVALID_ARGUMENT字段或取值不符合契约修正一次并重新校验
NOT_FOUND对象不存在或当前身份不可见说明无法取得记录
TEMPORARY_FAILURE服务暂时不能响应有界退避,保留错误来源
OUTCOME_UNKNOWN可能已提交但未取得响应按业务操作 ID 查询结果
BUDGET_EXCEEDED运行预算已用尽结束运行并报告已完成部分

错误消息返回可操作的原因,过滤凭证、内部堆栈和其他客户信息。控制器分别保存空结果与查询失败;同一工具和参数反复失败时,识别为停滞并停止重试。

保存与恢复状态

状态持久化保存任务目标、消息引用、已完成步骤和待处理动作。检查点记录哪些动作已发出、哪些结果已确认、哪些等待人工输入,供进程重启后继续执行。

LangGraph 将线程内状态检查点与跨线程存储区分为两类持久化机制;中断支持在任务执行中等待外部输入。从节点起点恢复时,中断前的代码可能再次运行,因此要为副作用设置幂等键或独立保存操作记录。

例如创建调查单成功后进程崩溃,检查点尚未保存响应。恢复时若只看“没有结果”,再次创建就会重复。可靠设计在发出请求前分配业务操作 ID,并利用下游幂等或结果查询判断实际状态。离线示例的观察保存在内存中,进程退出后即丢失。

并发恢复使用数据库版本条件更新,确保同一检查点只有一个工作进程能提交下一状态。更新影响行数为零时,重新读取最新状态。

— 本页完 —
← 返回文章列表

搜索内容

输入关键词搜索文章、笔记与随笔。