长任务 Agent 检查点:恢复的是状态,不是聊天记录

长任务 Agent 检查点:恢复的是状态,不是聊天记录原创封面

聊天摘要不能证明外部状态

迁移代理执行到第七步时重启,聊天记录也许写着“前三批已经完成”,但这只是模型曾经说过的话。数据库事务可能尚未提交,文件可能写了一半,外部队列也可能已经接受请求却没返回。恢复若依据对话重放计划,会把未知状态当成未完成,重复创建或覆盖资源。检查点必须记录可查询事实,而不是把自然语言历史包装成状态。

长任务应建模为显式状态机,每个节点都有输入版本、前置条件、允许动作、完成证据和失败去向。计划说明下一步想做什么,执行记录说明实际请求了什么,外部凭证说明远端接受或提交了什么;三者分别持久化。模型可提出状态转换,但调度器只有在证据满足时才推进节点。

恢复入口先加载任务版本和当前租约,再查询涉及的真实资源。若外部事实与检查点一致,继续下一节点;若操作凭证显示仍在运行,进入观察;若出现冲突,则暂停等待重规划或人工判断。任何“根据摘要推断已完成”的捷径都会在断电和网络分区下失效。

步骤要小到能够独立确认

把“迁移整个项目”拆成准备目标、复制一批对象、校验摘要、切换引用等可独立确认步骤。每一步只承担一个受限副作用,并定义重复执行时的行为。批次过大会让失败后无法判断哪些对象完成,过细又会制造过多协调开销;可按远端事务边界和可查询凭证选择粒度,而不是按模型输出段落划分。

步骤输入采用不可变快照或明确版本引用。恢复时发现源数据版本变化,不能继续沿用旧计划把两套事实混合,应暂停并选择重新生成后续计划、仅处理未变部分或由人工批准。步骤输出包括资源标识、数量、摘要和服务端版本,后续节点引用这些结构化结果,不从聊天文本重新抽取。

每个写动作携带稳定操作键,外部服务若支持则利用其幂等接口;不支持时在本地建立唯一登记和对账查询。提交前写入“执行中”不能当完成证据,提交后取得远端凭证再标记成功。若进程恰在两次写入之间终止,恢复流程通过操作键查询,而不是盲目重发。

检查点的原子性顺序

最危险的窗口是先把节点记为完成,后执行真实提交。进程在两者之间崩溃会跳过未发生动作。更合理的顺序是登记意图和操作键、调用外部系统、取得可验证结果、持久化凭证,再以条件更新推进状态。若外部系统无法与本地数据库共享事务,就接受短暂未知态,并通过对账接口收敛,不能伪造跨系统原子性。

检查点写入使用任务版本条件,确保只有持有当前租约的工作进程能推进。两个工作者即使同时读取同一节点,也只能有一个更新成功;失败者立即停止,不能继续执行后续动作。外部调用可能已发生,因此条件失败后仍要把操作键交给对账器,避免孤立作业失去跟踪。

状态记录采用追加事件与当前投影结合:事件保留意图、调用和结果,投影提供快速恢复节点。重建投影时校验序号连续和摘要一致,发现缺口便进入隔离。不要在检查点中保存访问令牌或大段模型上下文,引用加密输入对象及其版本即可,减少长期任务成为秘密仓库。

取消必须沿调用链阻止新副作用

用户点击取消后,只把顶层任务标记为取消并不够,正在排队的工具调用和子任务可能仍继续。取消令牌应贯穿调度器、工作队列和工具客户端;每次领取节点、每次重试以及产生副作用前都重新检查。已提交且不可撤销的动作不能假装回滚,应等待结果并记录为取消前已发生,再执行明确补偿或交给人工。

取消与完成可能并发。服务端需要定义优先规则:若提交凭证早于取消生效,则节点记录真实完成;若取消先被确认,则禁止开始新提交。界面展示“正在停止”“已停止但有待对账动作”和“已完成”不同状态,不能把取消请求立即显示成所有底层工作已经终止。

补偿不是把历史删除,而是新的受控动作,例如恢复旧引用或撤回尚未发送的草稿。每个补偿也有操作键、权限和失败路径,不能在恢复流程里无限自动尝试。对没有可靠补偿的操作,应在计划阶段设置更强确认点和更小批次,降低取消时的不可逆影响。

人工接管由租约隔离并发执行

当任务需要人工处理,系统授予操作者显式接管租约,并使代理工作者无法领取新节点。租约包含持有者、任务版本、到期时间和续租序号,采用服务端时钟判断。仅在界面显示“人工处理中”却不阻断队列,会让人和代理同时修改资源,检查点随即失去可信度。

操作者完成后提交结构化结果与证据,选择恢复代理、结束任务或要求重新规划。代理恢复前重新读取外部事实和输入版本,不能把人工文字说明当唯一依据。租约到期也不应立即由另一工作者接手正在进行的不可撤销动作,应先查询操作状态并执行安全交接。

管理员强制释放租约属于审计事件,需要理由和影响说明。客户端断线不代表操作者已经放弃,可通过短周期续租加宽限期处理。测试使用可控时钟覆盖续租恰逢到期、两个操作者竞争和服务时钟偏移,确认任一时刻最多只有一个主体拥有推进权限。

失败分类决定恢复分支

参数非法表示计划需修正,权限撤销表示任务必须暂停,依赖暂时不可用适合有限退避,连接中断则先标记未知并对账。把所有异常都统一重试,会让确定性错误消耗资源,也会重复不确定副作用。检查点保存稳定错误类、最后尝试时间和下次允许动作,恢复器依据规则选择分支而非让模型自由判断。

重试预算按节点和任务双层限制,进程重启不能清零。退避时间使用服务端可测试时钟,并加入受控抖动避免大量任务同时恢复。达到预算时留下完整接管包:输入版本、已完成节点、未知操作键、外部凭证和建议检查项,而不是一大段难以核验的聊天记录。

依赖系统长期故障期间,任务状态保持不变,不把执行中改成失败后重新规划。只有取得明确终态才推进或补偿。恢复服务自身也要幂等,重复扫描同一检查点不会重复派发;通过条件更新和队列去重确保多个调度周期只产生一个有效领取。

逐节点强制终止构建验证矩阵

测试在每个节点的登记前、外部提交后、凭证保存前和状态推进后强制杀死进程,再启动恢复器检查最终资源。相同任务重复投递、队列消息重复送达和两个工作进程并发都不能产生额外副作用。外部模拟器返回接受后超时,用操作键查询应恢复原结果,而不是创建第二个作业。

输入版本测试在暂停期间修改源对象,确认任务不会悄悄继续;取消测试让底层调用延迟返回,确保取消后没有新步骤启动且已提交事实被正确记录。租约测试覆盖到期、续租、人工完成和强制释放。日志扫描还要确认检查点未复制凭据与整段上下文。

验收指标包括重复副作用为零、未知状态最终可对账、恢复后状态机不跳步、版本冲突能暂停以及单一租约约束成立。把故障注入纳入持续测试,而不是只在正常路径上跑一次长任务。能够从真实资源与凭证重建状态,才说明系统恢复的是任务,而不是一段关于任务的聊天。

清理与保留同样属于任务状态

长任务产生的临时文件、上传分片和中间索引不能靠进程退出自动消失。每个临时资源记录所有者、关联节点、保留期限和清理凭证;任务完成或取消后调度独立清理步骤。清理失败保留可观察状态并重试,不把主任务显示成功当作临时资源已经删除。

为了排障而保留的模型输出和工具响应采用最小字段、加密存储与自动到期,检查点仅保存引用。人工接管延长保留期需要明确原因,不能无限续期。恢复器若发现临时对象已按期清理,应依据外部事实重新创建必要输入,而不是引用不存在的路径继续。

测试让清理作业重复执行、在删除一半时崩溃并与任务恢复并发,确认不会删除其他任务资源,也不会使已完成副作用丢失证据。生命周期有明确终点,检查点系统才不会随着可靠性提升而积累新的数据风险。

实现片段

await checkpoint.compareAndSet(taskId, version, nextState)

一手参考资料

评论 · 0

还没有评论留下第一句经过思考的话。

游客评论需审核。注册后可直接公开,无需审核。

SHARE / 分享

分享这篇文章

WECHAT / 微信

用微信扫一扫

在手机微信中打开文章后,再从微信右上角分享给朋友或朋友圈。