Agent超时中断与人工确认恢复机制 - 第1节

1.1 确认点(Checkpoint)定义

确认点(Checkpoint)是 Agent 工作流中一个可中断且可恢复的持久化状态标记。当 Agent 执行到确认点时,系统会记录当前上下文(包括对话历史、中间变量、待办任务列表)并等待外部确认或超时计时。若超时未确认,该确认点允许回滚到上一个稳定状态,而非丢失全部进度。

特性 说明
持久化 确认点信息写入数据库或文件系统,进程重启后可恢复
幂等性 同一确认点多次回滚结果一致,不会产生副作用
可配置 超时时间、重试次数、中断策略均通过参数定义
上下文绑定 每个确认点关联唯一的 session_id 和 step_id
关键区别:确认点不同于传统分布式事务中的“补偿操作”。确认点更轻量,只记录状态快照,不要求反向业务逻辑;超时后直接触发预设的 fallback 策略。

1.2 确认点与事务边界的关系

Agent 工作流中的事务边界定义了最小回滚单元。确认点通常落在事务边界上,二者关系如下:

  • 一对一映射:一个事务边界内最多设置一个确认点,确保回滚粒度清晰。
  • 嵌套事务支持:外部事务的确认点可以包含内部子事务的确认点,子确认点失败不影响父确认点的状态。
  • 边界判定条件:事务边界一般由 I/O 操作、外部 API 调用、用户输入请求或资金变动触发,确认点在这些操作前插入。
事务边界类型 确认点插入时机 回滚效果
无状态查询 不需要确认点 无需回滚
幂等写操作 写之前 撤销未提交的写
非幂等外部调用 调用发起前及响应解析后 触发补偿调用
人工审批环节 提交审批前 退回待审批列表

1.3 确认点的生命周期

一个确认点从创建到销毁经历 5 个阶段,如下流程图所示。

确认点生命周期 ① 创建 ② 已就绪 ③ 等待确认 ④ 已确认 ⑤ 已超时 ⑥ 回滚/完成 说明:① 创建时仅分配 ID,② 就绪时持久化上下文快照,③ 等待用户/外部确认, ④ 确认后继续执行,⑤ 超时触发预设 fallback 并进入回滚/完成阶段。

生命周期各阶段详述

  1. 创建:Agent 引擎根据业务规则生成确认点 ID,分配元数据(时间戳、session_id、step_id),但尚未持久化上下文。
  2. 已就绪:引擎收集当前 Agent 的全部上下文(包括会话堆栈、局部变量、未提交的操作日志)并持久化到后端存储。此阶段完成后,确认点才具备回滚能力。
  3. 等待确认:确认点保持打开状态,启动超时计时器。外部系统(用户审批、下游服务回调)需在超时前发送确认信号。
  4. 已确认:收到确认信号后,引擎标记该确认点为“已确认”,释放关联的临时资源,并继续后续步骤。
  5. 已超时:计时器到期未收到确认,引擎自动回滚到最近的“已就绪”状态的确认点,恢复上下文快照,并触发预设的 fallback 策略(通常是重试或降级)。
  6. 回滚/完成:回滚完成后,该确认点生命周期结束,清理持久化数据;确认通过的确认点也在此阶段清理。
工程注意:生命周期的每个阶段都应记录日志(如 checkpoint_created、checkpoint_ack、checkpoint_timeout),以便在调试和排错时快速定位问题确认点。

1.4 确认点的状态转换图(代码化定义)

以下是一个简化版确认点状态机的伪代码定义,用于指导后续实现:

state machine CheckpointFSM {
  initial: CREATED

  state CREATED {
    on entry: assign_id(); set_metadata();
    on event: save_context → READY
  }

  state READY {
    on entry: persist_context();
    on event: start_waiting → WAITING
  }

  state WAITING {
    on entry: start_timer(timeout_ms);
    on event: receive_ack → ACKNOWLEDGED
    on event: timer_expired → TIMEOUT
  }

  state ACKNOWLEDGED {
    on entry: release_resources();
    on event: cleanup → FINAL
  }

  state TIMEOUT {
    on entry: rollback_to_last_checkpoint();
    on event: execute_fallback();
    on event: cleanup → FINAL
  }

  state FINAL {
    // 无出边,生命周期结束
  }
}
常见误区:不要把确认点的“等待确认”阶段设计成同步阻塞模式。Agent 系统应采用异步事件驱动,避免单一确认点阻塞整个工作流。超时回调应独立于主执行线程。