资料整理已经可以通过工具读取、按字段提取并生成报告,接下来的问题是执行过程:读取第三份资料时发生超时,前两份是否需要重读;提取结果不符合约定,报告是否还应生成;新对话继续任务时,怎样知道哪些文件属于当前版本。自动化需要把这些判断落实为阶段前提、保存状态和停止条件,才能减少人工重复安排步骤的负担。

本文是“大模型应用方法与实践”系列的第八篇专题,接续工具调用与 MCP。本篇组织读取—提取—核验—生成的执行过程,重点讲步骤依赖、检查点、有限重试、恢复和人工确认。资料与字段语义沿用第五至七篇;复杂框架、服务部署和系统评估分别留给后续方向与第九篇。

实践条件:能够创建文件、使用终端和阅读简单 JSON。配套程序需要 Python 3.10+,只使用标准库,无需 API 密钥、MCP 连接或调度服务。可先用普通聊天完成手动提取,再在具备文件和终端能力的宿主中观察单 Agent 如何执行同一任务。官方资料核对日期为 2026 年 10 月 5 日。产品说明与实验记录为教学模拟;故障由程序主动注入,程序运行证据与模型自主执行记录分别保存。

1. 工作流与动态决策

固定步骤与条件分支

工作流预先规定步骤及其依赖。资料读取成功才允许提取,字段检查通过才允许生成待审稿,人工核对后才进行本次本地交付。流程可以包含条件分支,例如“还有未完成来源则继续读取”“候选不合格则停止并等待新版本”。有分支的程序仍可以是固定工作流,不必因此引入模型。

Agent 则在任务约束内,根据当前状态与实际返回选择行动。例如发现许可证没有依据后补读指定来源,或者判断工具返回的片段不足以支持冲突处理,再读取上下文。模型选择出的下一步仍需经过宿主与工具的参数、范围和执行检查,不能仅因计划里写了一个动作就视为已执行。

组织方式 本例中的安排 需要保留的证据
人工阶段流程 读者提交提取任务、保存结果、执行核验 每阶段输入、原输出和检查结论
固定工作流 程序管理读取顺序、状态和交付前提 状态、日志、文件与摘要
单 Agent 与工作流 模型解释来源并形成候选,程序控制边界 模型真实调用、候选及程序检查

本篇采用第三种分工的最小形式:程序提供已保存的证据与明确状态,提取任务可以交给一个 Agent,也可以由普通聊天返回文本。程序本身不会调用模型,不会选择检索词,也不会解决来源冲突。这样可以分别观察内容判断和执行控制的结果。

计划与实际状态

计划说明准备做什么,状态说明什么已经完成。两者可以关联,但不能互相替代。“已计划生成报告”不应记为生成成功;模型说“已经恢复”也需要实际文件、调用记录或状态变化支持。

最小计划应列明阶段、输入、产物、前提、允许动作和停止条件。例如,提取阶段需要完整证据包和字段契约,产物是一个候选 JSON;缺少必要来源就不能假设单位,且不能进入交付。计划不需要展开模型的内部推理,只需给出可检查的依据与行动安排。

配套 08-01-plan.txt 只要求读取现有运行并形成恢复计划。它和后续执行任务分开,便于核对模型是否把失败阶段、已完成阶段和未获授权的动作混在一起。

多 Agent 的适用条件

当不同阶段需要明显不同的工具、权限或专业能力,且各自输入输出能够清楚划分时,可以考虑多个 Agent。把一个 12 条记录的提取任务机械拆成三个“专家”,则会增加任务传递、上下文重复、协调和验收成本;多个模型认可同一结论,也不等于取得了独立证据。

OpenAI Agents SDK 区分控制权转交的 handoff 与由主 Agent 调用专门能力的 agents as tools;官方建议先从一个 Agent 开始,只有分工确实改善能力或约束隔离等方面时再增加。这里仅用于理解组织方式,本篇不安装或运行多 Agent 框架。编排与任务转交

2. 输入输出与阶段依赖

固定资料与字段契约

本例继续整理 LogBrief 1.2、BatchTrace 0.9、RunSheet 2.0 的三个属性,以及三条模拟耗时,共 12 条记录。输入包含 S1、S2、S3、S5、P5、E5,保留第五篇的 D5-v1:

  • BatchTrace 的同版本文件上限存在冲突,不能自行选择 8 或 4。
  • 未提供的许可证和输入保护信息保留缺失,不能补成常见值。
  • P5 定义原始耗时单位和破折号;RUN-02 的未记录与 RUN-03 的已知零值分别处理。
  • 三个最终文件来自同一主记录,不扩展为性能排名或其他属性。

完整资料和契约随第八篇练习包提供,不要求先运行前篇项目。实际 JSON 使用 record_id、tool、version、field、value、unit、state、source_refs、note;state 是 known、missing、conflict。不要把早期规划大纲中的抽象字段名带入当前运行。

阶段前提与产物

固定输入与运行版本
        ↓
六份来源读取检查点 → evidence.txt
        ↓
模型或读者提取 → inbox/candidate-v1.json
        ↓
结构与定位存在检查 → verify.json
        ↓
三个待审文件 → waiting_review
        ↓ 人工核对来源含义与本次摘要
三个本地交付文件 → completed
阶段 必要前提 保存产物 进入下一阶段的条件
读取 固定版本,累计次数未耗尽 每份来源缓存、证据包 六份必要来源齐全
提取 证据包与 12 条契约 原始候选和规范化主记录 候选能够通过结构检查
核验 完整候选与原文定位 程序核验记录 字段、类型、集合与定位存在
待审 程序结构通过 JSON、TSV、Markdown 人工确认语义和具体版本
交付 当前摘要匹配,确认有效 output 三文件、确认记录 写入实际完成

阶段产物同时是下游输入。报告生成不能拿另一对话里的旧表格替代本次已接受候选;恢复也不能把“某个文件存在”直接解释为“它符合当前输入”。本例用固定输入与代码摘要、产物摘要和运行标识建立关联。

结构核验与事实核验

沿用第五篇的检查器,程序能发现重复标识、缺少记录、类型错误、缺失值契约错误、不存在的来源定位和文件之间不一致。这些检查具有确定规则,适合程序执行。

如果 RS-LICENSE 被写成 MIT / known,且引用一个实际存在的 S3 行,结构检查仍可能通过。标签存在只说明能定位到这行,不能证明这行支持 MIT。因此 verify.json 记录的是 structure_passed 和 facts: pending_human_review,流程先停在待审稿,由读者核对原文含义。人工确认另存于状态记录,不把程序检查结果改写成自动事实证明。

资料本来包含的缺失或冲突可以按契约完成交付;它们不是工具失败。相反,必要来源没有取得时,应报告未完成范围,不能补造证据让记录看似完整。前篇解释的资料中指令干扰同样适用:来源内容不能更改字段契约或授权范围。

3. 状态、运行标识与检查点

运行目录与版本关联

run_id 标识一次具有固定输入和执行版本的运行。本例使用 demo-01,所有新文件在 runs/demo-01/ 内生成;原资料、其他运行和博客源码不作为输出位置。目录已经存在时,start 会拒绝初始化覆盖。

运行中的部分目录如下。它是预期结构,各文件在相应阶段成功后才出现,不是下载包已经带有的结果:

runs/demo-01/
├── state.json             # 当前阶段、累计次数、输入与产物摘要
├── events.jsonl           # 追加的真实程序事件
├── read/                  # S1、S2、S3、S5、P5、E5 原文检查点
├── evidence.txt           # 六份已完成来源的合并文本
├── inbox/                 # 读者或模型保存的新候选
├── extract/               # 接受的原始候选与规范化记录
├── verify.json            # 程序检查范围
├── preview/               # 三个待审文件
└── output/                # 本次确认后的三个交付文件

同一次失败恢复继续使用原 run_id;输入、脚本或已接受候选需要修改时,另开运行。两个候选版本的语义不同,不能用旧版的确认摘要交付新版报告。

阶段状态与完成范围

状态 本例含义 下一步
running 正在安排当前阶段 查看实际调用和结果
failed 来源读取暂时失败,仍有累计次数 检查错误后有限恢复
waiting_input 六份来源齐全,等待候选 提取并保存新文件
blocked 契约错误、累计耗尽等前提不满足 修订候选或处理具体原因
waiting_review 待审稿已生成,事实仍待人工核对 查看文件后确认或修订
completed 当前版本已确认并完成本地交付 验收三文件与实际范围

本例的状态名是教学程序约定,不是通用 Agent 标准。其他宿主可能用不同事件与状态。OpenAI Agents SDK 也将最终输出、历史、待确认动作和可恢复状态分别提供;一个为人工检查而暂停的结果可以没有最终答案,需要保存相应状态后继续。结果与状态

检查点与实际文件

检查点至少需要记录已完成阶段、输入版本、产物位置、核验结果和未完成项。本例每读完一份来源,就保存原文与摘要,并把该来源记为 done。恢复时先复核输入和执行代码,再核对已登记产物;通过后才跳过这些来源。

状态是可更新的索引,事件日志按行追加,来源与阶段产物只创建。程序先写状态临时文件、落盘后替换索引,减少普通中断留下半个 JSON 的机会。但本例没有多机事务或完整断电保障,硬退出可能留下锁或未登记文件。

若一个尚未登记的文件已经存在,程序只在它与应生成内容完全一致时复用;内容不同或部分写入则停止并保留现场。已登记文件摘要变化也会停止,不通过覆盖来掩盖问题。摘要用于发现变化,不是可信身份、数字签名或权限隔离。

4. 故障注入与恢复实践

独立环境与首次读取

下载练习包,解压到博客仓库和真实资料目录之外的新目录,进入 08-agent-workflow/。包中没有答案、候选或已完成运行;逐文件职责与 Bash 等价路径见项目 README。

初始状态:当前目录是新解压项目,Python 3.10+ 可用,没有 runs/demo-01/。以下 PowerShell 命令顺序执行;不用安装第三方库,也不用修改用户级配置。

python workflow.py start demo-01 --fault S3:once

操作目的:观察部分成功之后的失败,验证前两份来源能否保留。程序依次缓存 S1、S2;到 S3 第一次调用时主动抛出超时,尚未写入 S3 缓存。

预期结果:退出码为 1,状态为 failed,阶段为 read;S1/S2 为 done、累计各 1 次,S3 为 failed、累计 1 次,后续来源为 pending。没有候选、待审稿或交付报告。这个错误是读取接口的教学注入,没有实际断开 MCP、阻断网络或制造磁盘故障。

查看 state.json 与 events.jsonl,并记录 S1/S2 文件摘要和修改时间。可提交计划任务,观察模型是否准确解释当前状态;计划任务不执行恢复。文件存在、状态标记和日志事件应能互相对应,缺少证据的项目保留未知。

有限重试与来源恢复

在同一项目继续执行:

python workflow.py resume demo-01
python workflow.py status demo-01

恢复前会核对原输入、代码和检查点摘要。S1/S2 通过后直接复用,从 S3 第二次调用继续,随后读取 S5、P5、E5,形成 evidence.txt。预期状态为 waiting_input、阶段为 extract;S3 累计 2 次,其余来源各 1 次,S1/S2 文件没有改写。

具备终端能力的单 Agent 也可执行恢复任务。该任务先检查实际状态,只有教学超时且次数仍可用时才继续;读完后停在 waiting_input。模型若没有工具,只能返回计划,不能填成实际恢复成功。

每份来源的累计上限固定为 3 次,跨命令保存。--read-attempts 只规定本次命令最多安排几次调用,默认 1,不重置累计计数。第一次失败后的重试等待为 0.2 秒,再次为 0.4 秒,是便于练习的退避值。

下面是两个独立实验,分别新建运行,不能替代原 demo-01 的恢复记录:

# 同一个命令中安排最多两次读取,第一次注入失败后自动重试。
python workflow.py start retry-01 --fault S3:once --read-attempts 2

# 每次 S3 读取都失败,累计第三次后停止。
python workflow.py start stop-01 --fault S3:always --read-attempts 3
python workflow.py resume stop-01

retry-01 预期完成读取后等待候选;stop-01 预期 blocked,后续 resume 不再调用 S3。这样可以检查自动重试、人工重新启动和总次数限制的关系。

错误分类与重试范围

情况 处理方式 原因
已知临时超时 检查结果后退避,限制次数 稍后可能恢复
来源不存在 核对标识或补充资料 重复请求不会生成证据
参数或 JSON 错误 修正输入,另存候选版本 错误内容仍然错误
权限或凭据缺失 报告具体缺口 重试不创造授权
输入或产物变化 停止复用,检查版本 旧检查点前提失效
累计预算耗尽 停止并报告 不能无限循环
外部写入结果未知 查询已有结果再判断 超时可能发生在成功之后

本地程序只自动重试明确注入的 TimeoutError。其他文件、参数和摘要错误会停止,不把所有异常归为临时问题。在线接口的重试等待还要尊重服务要求、截止时间和限额。OpenAI 官方恢复指引同样要求先检查已有结果与副作用,再做有限重试;断开的响应流并不能证明最终执行失败。错误与恢复

重复执行与幂等性

幂等性关注相同操作重复执行后的可观察结果是否保持一致。本例再次恢复已完成阶段不会重复追加主记录;再次以同一摘要确认已完成运行不会改写 output。它依赖本地状态、内容比较和单进程锁,是本例范围内的重复执行控制。

如果一个外部发送接口已经成功,但客户端收到超时,仅保留本地检查点不能保证再次发送不会重复。需要服务端支持的去重标识、状态查询或人工核对,且同一标识只能对应同一动作内容。不能把本例的文件摘要当成所有工具都支持的幂等键,也不能声称实现了外部动作“恰好一次”。

5. 提取、核验与本地交付

候选提取与单 Agent 任务

前置状态:demo-01 已完成六份读取,status 检查通过,状态为 waiting_input。提交完整提取任务,只允许读取当前证据、契约和相关执行说明,创建一个新候选文件并执行导入。

模型需要处理的内容与前文相同,但输入现在来自本次已完成的来源检查点。提取后保存为 runs/demo-01/inbox/candidate-v1.json。具备文件工具的宿主可实际创建;普通聊天读者另存完整 JSON 文本,UTF-8 无 BOM,不包含 Markdown 围栏。已有同名文件就停止,不覆盖第一版。

python workflow.py resume demo-01 --candidate inbox/candidate-v1.json

程序先做结构检查。缺少记录、重复标识或值类型不合格会得到 blocked,不创建待审稿。读者保留失败候选,在 inbox 另存修订版本再导入。通过后保存原始候选与规范化记录、核验说明,再从同一主记录生成三个 preview 文件,停在 waiting_review。

已经接受的候选不在原运行中修改。人工发现事实错误时,保留当前待审稿和问题记录,用新 run_id 重做修订;这一限制便于核对哪个版本曾通过哪些检查,不把修订覆盖成“第一次就成功”。

人工核对与具体确认

查看 preview 与 evidence,逐条核对 12 条记录,而非只看摘要是否流畅。尤其检查冲突的双方值和替代关系、未提供信息、原始单位、破折号与零值。完成自己的结果后,再读取独立核对依据;答案不进入被检查模型的输入。

本例确认绑定固定输入与代码摘要、三个待审文件摘要。以下命令由读者完成上述核对后执行;提取任务不允许 Agent 自行运行 approve,也不把模型生成的“审核通过”文本当成批准。

$reviewDigest = (Get-Content -LiteralPath .\runs\demo-01\state.json -Raw | ConvertFrom-Json).review_digest
python workflow.py approve demo-01 --digest $reviewDigest
python validate_output.py .\runs\demo-01\output

这里从本次状态中取得实际摘要,不需要填写示例中的假摘要。程序再次核对输入与待审文件,匹配后在 output 中创建 JSON、TSV、Markdown,并记录显式本地确认。预期状态为 completed,独立检查器显示三文件通过。

这一步只在隔离练习目录交付文件,没有发送邮件、提交代码或发布网站。人工确认也不能让错误内容自动正确;它记录操作者认可了哪个具体版本。批准入口的可信性仍依赖宿主限制与实际操作者,文件摘要不能阻止拥有写权限的人改程序或状态。

OpenAI Agents SDK 的人工检查路径是在敏感工具执行前暂停,保存待确认动作和可恢复状态,应用处理决定后继续。本文借鉴“具体动作与状态绑定”的原则,CLI 名称和状态格式均为本例自定义,没有实测 SDK 的批准接口。约束与人工检查

验收与记录范围

验收需要同时核对运行状态与实际文件:三文件确实存在且一致,12 条记录齐全,必要来源可定位,语义人工检查有记录,重复命令不会改写已完成成果。completed 只描述本次程序约定的本地交付,不代表资料陈述已成为真实产品能力。

填写空白执行记录,保存失败与恢复证据、模型原始候选和人工修订。程序的故障注入是人为样例,不能统计为模型失败;使用独立答案验证程序,也不能写成模型已经提取正确。

本章的实际程序验证记录单独列出隔离运行与未完成范围。暂未运行独立模型、真实在线重试、远端写入或定时调度;模型自主决策与原生宿主行为需按读者的实际环境另行验证。

6. 停止条件与定时执行

完成、阻塞与预算

停止既可以表示任务完成,也可以表示继续前提不满足。流程应返回具体状态、已完成范围、未完成项和下一步,而不是统一输出“处理结束”。本例等待候选、等待人工核对和累计次数耗尽的后续动作不同。

对于接入模型的流程,除了工具累计次数,还可限制模型循环次数、token 或费用、单次超时和整体截止时间。达到上限后保存已有结果,说明尚未完成范围;若要扩大预算,应由任务操作者决定,不能在恢复时悄悄清零。费用不可得时保留不可得,不从输出长度推算实际账单。完整成本与版本比较在第九篇展开。

本地 .lock 防止两个工作流命令同时操作同一运行。遇到锁冲突先检查是否仍有进程;硬退出后留下的锁需人工核对现场,程序不自动删除。依赖文件丢失、摘要变化或不完整写入同样不能通过绕过检查继续交付。

长任务、定时任务与协作

长任务是一次执行持续较久;定时任务是到达时间或事件条件后触发新执行;多 Agent 协作是工作如何划分。它们可以组合,但各自需要不同机制。保存检查点不会自动唤醒机器,增加 Agent 也不会自动建立定时器。

本篇不创建真实定时任务。准备把流程交给具体宿主或调度器时,先明确以下配置,再核对其官方支持范围:

配置 需要落实的内容
执行环境 主机、工作目录、依赖与可用账户
唤醒条件 时间/事件、时区、离线与休眠时的行为
运行标识 触发事件与输入版本的关联,重复触发去重
并发与恢复 上次仍运行时如何处理,失败是否有限继续
权限与确认 预授权范围、待审结果、外部动作的确认机制
通知条件 有意义的变化、完成、失败或需要人工动作
暂停与取消 停止未来触发,当前执行如何处理,产物如何保留

例如每天整理新增资料,可以先产出待审稿,只有新增内容、失败或需要人工核对时通知。没有变化时的重复通知不应被当成任务收益。取消未来触发也不等于回滚已经产生的文件或外部动作;具体暂停、漏跑补偿和取消入口必须按所用宿主验证。

过程观察与问题定位

本地 events.jsonl 记录调用安排、成功、故障、候选拒绝、待审稿和交付事件。它帮助区分“没有执行”“执行失败”“等待人工”和“已经完成”。日志与状态不是完整审计系统,仍需结合文件和实际工具返回。

接入模型后还应保存模型调用、参数、原始返回、token 和耗时等可得信息。OpenAI Agents SDK 的 tracing 可以记录模型调用、工具调用、转交与检查等过程,适合定位具体运行的问题。本例仅用本地事件日志,没有连接官方 tracing 服务或上传运行资料。集成与过程观察

7. 常见问题与操作速查

常见问题

问题 排查方向
start 提示目录已存在 失败恢复用原 run_id 的 resume,新实验换标识
resume 仍 blocked 查看具体原因和累计次数,不用重启清零
waiting_input 没有报告 缺少模型/读者候选,这是正常等待
JSON 合法却导入失败 核对字段、类型、顺序、定位与缺失规则
waiting_review 却被描述为完成 事实检查与确认尚未完成,核对模型结束语
原文标签存在但值不受支持 回到原文含义,保留问题并新开修订运行
旧摘要无法确认 当前版本、待审文件或输入已变化
输入变化后恢复拒绝 检查变化,保留旧运行,新开 run_id
同一运行出现锁 核对进程与现场,不能自动删锁绕过
外部超时后想重复发送 先查询真实结果与去重支持,本例不覆盖该机制

命令速查

以下命令均在独立练习目录执行;候选保存与人工核对的前提见正文,不把速查作为跳过阶段的连续脚本。

目的 命令
新建故障实验 python workflow.py start demo-01 --fault S3:once
恢复未完成读取 python workflow.py resume demo-01
只读复核状态 python workflow.py status demo-01
导入新候选 python workflow.py resume demo-01 --candidate inbox/candidate-v1.json
核对完成后的三文件 python validate_output.py runs/demo-01/output

实践练习

  1. 流程分工:对同一 D5-v1 任务列出固定步骤和模型判断。验收标准:格式检查、状态控制和事实含义分别有负责人,不用模型自述证明工具执行。
  2. 故障恢复:完成 demo-01 首次读取与恢复。验收标准:失败、恢复均有事件,S1/S2 摘要与修改时间不变,S3 累计 2 次,后续六份来源齐全。
  3. 错误阻断:从自己的候选复制一个新版本,移除一条记录后导入新运行。验收标准:契约失败保留错误候选,没有待审稿或 output,不计为模型实际失败。
  4. 事实复核:核对冲突、缺失和耗时来源。验收标准:12 条正确,单位依据齐全,RUN-03 零值保留;结构通过没有替代人工语义检查。
  5. 重复与版本:完成本地交付后再次 resume、同摘要 approve;另在独立项目副本改变已登记文件再检查。验收标准:前两项不重复生成或改写,变化副本停止恢复,不自动覆盖。
  6. 预算与调度:完成 stop-01,填写一个只产出待审稿的定时配置表。验收标准:累计 3 次后不再调用,时区、离线行为、并发、通知和取消均明确;未创建的调度标为未执行。

参考资料

以下官方资料用于概念和行为核对,日期为 2026-10-05;本例没有调用其 SDK 或托管运行接口,实际接入须核对当时版本与账户能力。

上一篇:工具调用与 MCP;导读:大模型应用基础与学习路径;系列入口:大模型应用方法与实践;下一篇:结果评估与成本控制。