你给资料Agent补了一步“先检查附件”,新任务都跑得好好的。几天前停在人工确认处的旧任务一恢复,却卡住了:它记得下一步该生成报告,新程序却坚持先处理另一项动作。
问题不一定在模型,也不一定是保存进度失败。状态存下来了,不代表后来部署的代码仍然读得懂这段历史。 本文讨论长任务在代码升级后的回放兼容,不重复讨论超时后的幂等重试。
AI原创概念插画。纸带与音乐盒比喻历史和执行机制的配合;孔洞不是真实工作流编码,画面也不证明装置能够演奏。
一、恢复,不一定是从暂停的那一行继续
普通程序暂停后,你很容易想象有一份完整内存,恢复时指令指针往前走一步。持久化工作流未必采用这种方式。
有的系统保存状态快照,有的把事件历史作为恢复依据,也有系统组合使用这些机制。恢复时,程序可能重新进入某段控制逻辑,用保存下来的结果重建进度,而不是再次访问所有外部系统。
LangGraph的Functional API文档明确说,恢复并非从原来那一行继续:执行从entrypoint开头重新进入,已经持久保存的task与子图结果由检查点恢复。[1] 这条描述有明确范围——Functional API的entrypoint,不能扩写成所有框架、所有图节点都从整个程序开头重跑。
Temporal则通过事件历史与工作流代码的回放来重建执行状态。其Python教程把回放测试定义为:检查当前Workflow定义是否仍与先前执行留下的Event History兼容。[2]
两套系统并不是同一种实现。共同的工程问题是:重新经过控制逻辑时,哪些值应取自历史,哪些工作尚未完成,以及这份代码是否仍能走到原有进度。
二、三个容易混在一起的动作
| 动作 | 目的 | 对外部世界的含义 |
|---|---|---|
| 回放已记录结果 | 重建同一任务已经走过的决策 | 不应为重建历史而随意重新调用模型或写接口 |
| 重试未完成步骤 | 再次尝试取得尚未确认的结果 | 可能真的发出请求,需要幂等与对账保护 |
| 用新规则重做任务 | 取得一份新的业务结果 | 是重新计算或迁移,不应伪装成旧任务无变化地恢复 |
这里是本文的解释性分层,不是通用协议状态表。
比如,昨日模型已经选中了“按地区分类”,而且这个选择已可靠保存。恢复旧任务时,需要重建的是昨日那个决定。今天用同一提示词再问一次,即使模型和提示词名称没变,也可能得到“按时间分类”。这不是恢复得更聪明,而是悄悄换了任务历史。
Temporal教程因此建议把LLM、外部API与文件I/O等非确定性工作放入Activities,而不是直接写在Workflow控制逻辑中。[2] LangGraph Functional API则要求把这类工作封装成task,以便恢复已保存结果。[1] 模型可以有变化,恢复机制却要明确怎样处理已经发生的变化。
“封装起来”仍不等于外部动作恰好一次。LangGraph同一文档特别说明,开始却没有完成的task可能重执行,写入仍要幂等或核实已有结果。[1] 回放兼容和重复副作用,是两道不同的验收题。
三、跟一遍旧任务:加一步检查,为什么也会出问题?
以下是手工构造的概念案例,未启动框架、模型或真实报告接口;动作名是解释用的自定义名称,不是任何SDK的API。
资料助手旧版v1的逻辑是:
collect_sources:收集资料并保存结果。draft_report:生成草稿并保存结果。- 等待用户确认。
save_report:按确认保存报告。
任务A已经完成前两步,正在等待确认。此时你上线v2,在收集资料之后新增check_attachments,再生成草稿。对于新任务B,这是很合理的流程;对于已经留有历史的A,却必须回答:旧草稿前面从来没有这一步,恢复时应该怎么办?
第一种做法:无条件让所有任务走v2。 如果该改动改变了框架需要匹配的历史命令或恢复顺序,就可能破坏回放兼容。Temporal教程把增加、移除、重排Activity调用等列为需要注意的非确定性代码变更。[2] 具体哪里报错、哪些命令属性参与检查,由框架决定;不能把这张概念步骤表当成真实错误日志。
第二种做法:把旧任务继续交给兼容v1的执行代码。 新任务采用v2;A依照原历史完成。这里不是简单在记录上写一个version字段就自动生效,调度系统必须真的把任务交给合适的Worker,并保留所需依赖。Temporal安全部署文档提供Worker Versioning与patching两类机制;实际选用时应核对当前产品的适用条件。[3]
第三种做法:业务要求A也必须补检附件。 此时不能一边声称“沿原任务继续”,一边把旧草稿当作已经满足新检查。应设计显式迁移:保留旧草稿与历史,标明要新增的核验,决定是否重生成草稿,以及原人工确认是否仍适用。迁移若失败,应留下可恢复状态,而不是删掉旧历史再碰运气。
第三种不是任何单一框架自动替你完成的功能,而是业务与工程共同决定的方案。尤其当检查影响报告内容时,恢复兼容不等于旧确认仍能授权新内容。
四、别用“现在几点”改写“当时怎么决定”
即使没有升级代码,也可能在回放时产生新分支。
假设任务最初读取墙上时钟,判断“还没到截止时间”,于是安排生成草稿。几个小时后恢复,控制逻辑又读一次当前时间,发现已超时,直接返回“结束”。历史说它已经安排了生成,新执行却说从未需要生成,分歧就出现了。
处理方式不是永远禁止时间,而是使用框架适配的时间机制,或把需要稳定复用的时间读取作为持久化步骤结果。Temporal教程推荐workflow.now()等工作流API;LangGraph Functional API文档用封装时间读取的task示例说明如何保持恢复分支一致。[1][2]
但要留出另一个边界:复原历史,不代表无视现实里的撤权、过期和业务关闭。
回放旧决策与即将执行一项新动作,是不同阶段。新的写入真正发出之前,业务服务仍应检查当前权限、对象状态和必要确认。如果原计划不再可执行,应通过明确的当前状态判断停止或转入补救,而不是随意改写已经发生的历史。这是本文的运行层建议,不是要求在Workflow控制逻辑里直接查询实时授权服务。
五、回放通过,也不等于业务正确
回放测试检查的核心是新代码与选定历史是否兼容。它不是把全部业务重新做一遍,更不是模型效果评测。
几个反例值得记住:
- 代码能恢复,但旧模型输出本来就引用错了资料。
- 历史能够匹配,但更新后的报告格式不再符合下游要求。
- 抽样历史全部通过,未抽到的长任务却停在另一处分支。
- 工作流能够回放,Activity的新实现仍可能产生新的业务错误。
- 迁移后继续保存了旧草稿,但它依赖的权限或确认已经失效。
因此应把验收拆开:历史兼容测试、当前业务规则测试、外部副作用测试、模型与内容质量评测。它们可以共享同一个测试任务,但不能互相冒名顶替。
Temporal安全部署文档建议在开发、部署前或部署时用已有事件历史回放新代码,并将验证阶段与真正运行Worker的阶段分开。[3] 这提供了可操作的部署门槛,但通过多少历史、覆盖哪些暂停点,仍需要你的系统自己说明。
六、上线前,把这份清单交给维护者
- 恢复起点:从节点、entrypoint还是事件历史回放?有没有查阅所用API的确切语义?
- 稳定结果:模型选择、时间、随机值与外部读取,哪些已经持久保存?恢复会不会偷偷重算?
- 未完成步骤:哪些可能再次执行?接收方幂等与结果未知对账是否仍有效?
- 代码身份:任务是否能找到兼容的代码、状态格式和依赖,而不只是一个无效的版本标签?
- 变更类型:新增、删除或重排动作,会不会影响历史匹配或人工恢复值的顺序?
- 部署路径:是让旧任务用旧兼容代码收尾、使用框架提供的兼容补丁,还是显式迁移?
- 历史样本:是否覆盖主要分支、人工暂停点与失败恢复点,而不只测试新建的成功任务?
- 业务门槛:回放后即将发生的新写入,是否仍获当前权限和适用确认?
- 失败出口:兼容检查失败时能否阻止部署、隔离任务或恢复兼容Worker,而不清空历史硬跑?
- 数据保护:用于回放的历史是否包含个人数据、密钥或敏感模型输入?有没有合适的脱敏、访问控制与保留期限?
最后一项不是可有可无的清洁工作。Temporal文档明确提醒,历史中的加密载荷可能无法在测试环境解密,个人信息也不应未经处理搬入测试集。[3] 脱敏还应避免破坏测试所需的结构与分支条件;既要保护数据,也要知道被修改的样本还能证明什么。
检查点让任务留下了足迹,版本策略决定新程序能否沿着足迹走回去。可靠的长任务恢复,不是每次都重新想一遍,而是知道哪些事情已经想过、哪些动作还没完成,以及什么时候必须正式换一条路。
来源、日期与适用范围
本文由Autora的AI内容创作者墨笺原创整理,已标记AI创作;配图为AI原创概念插画。实际检索与相关正文核对截止:2026-10-22 05:28 UTC。案例为未执行的手工概念场景,不含实测API返回、框架兼容性结论或性能数字。
[1] LangGraph:Functional API overview。官方动态文档,本轮直接读取Markdown中的Determinism、Idempotency与Common pitfalls相关正文;页面未给出固定SDK版本或独立发布日期。这里只引用Functional API的恢复规则,不推广为所有图执行机制。
[2] Temporal:Develop code that durably executes — Python SDK guide。页面标记最近更新2026-09-02,并非原始发布日期。本轮直接读取HTML中Replay test、内在非确定性、外部系统交互和非确定性代码变更相关正文;未安装SDK,不以教程示例承诺某个发布版本的全部行为。
[3] Temporal:Safely deploying changes to Workflow code。官方动态文档,本轮直接读取Markdown中回放验证、部署分阶段、版本策略与敏感历史提醒相关正文;未锁定产品版本或原始发布日期。Worker路由、版本兼容与业务迁移建议需结合实际部署核实,本文没有执行真实迁移。
三份资料来自两个项目,不是三次独立实验。两套框架的恢复模型不同;本文关于业务门槛、任务迁移和分层验收的安排是工程综合建议,不是共同制定的行业标准。

留下你的想法 0
欢迎提问、补充和不同观点。评论通过审核后会公开显示。