02任务如何被安排 · 第 4 章
总进度 4 / 15

03|把任务计划变成程序能检查的数据

“先找资料,再写文章”人能看懂,程序却还不知道资料有几组、谁等谁、每步怎样算完成。这一节把这句话变成一组有编号的任务,并亲手制造一次循环依赖。你会学会读一个任务对象,也能解释为什么坏计划必须在执行前被拦住。

2026-09-28约 7 分钟40 行代码难度 ★★★

如果想获取全套课程资料,请关注微信公众号 「AI面包君」,回复 「课程资料」 即可领取。

“先找资料,再写文章”人能看懂,程序却还不知道资料有几组、谁等谁、每步怎样算完成。这一节把这句话变成一组有编号的任务,并亲手制造一次循环依赖。你会学会读一个任务对象,也能解释为什么坏计划必须在执行前被拦住。

1. 先读一个任务,不急着读整张图

项目用下面的 Step 表示一项子任务:

class Step(BaseModel):
    id: str = Field(pattern=r'^[a-z][a-z0-9_-]{0,31}$')
    title: str = Field(min_length=1, max_length=120)
    role: Literal['researcher', 'writer', 'reviewer']
    depends_on: list[str] = Field(default_factory=list)
    brief: str = Field(min_length=1, max_length=3000)
    acceptance: str = Field(min_length=1, max_length=1000)
    transport: Literal['local', 'a2a'] = 'local'

比如写作任务的 id 是 write,role 是 writer,depends_on 则是 ['research-product', 'research-audience']。这句话翻译过来就是:写作助手必须等两项资料任务都结束。

Literal 约束可选值,例如 role 不能随便填成 boss。Field(min_length=1) 不允许空要求。default_factory=list 每次产生一份新的空列表,避免多个任务共用同一个可变列表。

brief 描述怎么做,acceptance 描述交付时检查什么。当前项目会展示验收要求,但没有逐条自动判定它们是否满足;最终还需要查看产物。

用一场小型活动理解“依赖”

准备一场社团讲座时,海报需要讲座主题和时间,所以要等主题、时间确认;但搬椅子不一定要等海报设计完成。这时如果把所有事情写成一张顺序清单,就容易误以为排在后面的都必须等前面的。

依赖描述的是“缺少哪份结果就没法继续”。它比列表顺序更有用,因为两件互不需要对方结果的事可以同时做。对应我们的文章任务,产品资料和受众资料可独立整理,写作却需要把两份资料结合起来。

depends_on 保存的是所等待步骤的编号,不是角色名。写作可能依赖两个 researcher 步骤,只写 researcher 无法区分到底等哪一个。

把一个 Step 当成填好的任务卡

字段写作步骤的例子如果写错,谁受影响
idwrite依赖引用、产物索引会找不到它
title撰写文章初稿页面展示给人看的标题
rolewriter程序选择哪种执行方式
depends_on两项资料的 id决定什么时候具备执行条件
brief依据资料撰写带来源的文章告诉执行者本步要做什么
acceptance包含步骤、限制和来源给人检查交付物的依据
transportlocal决定在本地执行还是远程委派

id 像内部编号,title 像显示名称。你把标题从“文章初稿”改成“入门指南初稿”,依赖仍可以继续引用 write;如果把 id 改了,引用它的地方也要一起改。设计时把编号和标题分开,就是为了避免改一句展示文案就破坏任务关系。

试读到这里 · 后续内容已封存

关注公众号,继续把这章学完

在「AI面包君」发送关键词「学习AI」拿到口令。验证一次,这个浏览器就能继续阅读全部课程。