计划表示与依赖执行
计划不是模型输出的一段待办文字,而是带 ID、前置条件、输入、验收标准和风险的可执行数据。执行器根据已验证事实选择就绪任务;任务完成前不能把它写进 done。计划可以增删步骤,但每次修改都应记录原因,防止模型悄悄改变目标。
第一个可运行实验:只调度已就绪任务
保存为 plan.py,用 Python 3.12 运行。
python
def ready(plan, done):
return [task for task in plan
if task['id'] not in done and set(task['needs']) <= done]
def accept(task, observation):
return observation.get('task_id') == task['id'] and observation.get('verified') is True
plan = [
{'id': 'search', 'needs': []},
{'id': 'check', 'needs': ['search']},
{'id': 'write', 'needs': ['check']},
]
done = set()
assert [x['id'] for x in ready(plan, done)] == ['search']
assert accept(plan[0], {'task_id': 'search', 'verified': True})
done.add('search')
assert [x['id'] for x in ready(plan, done)] == ['check']
print('plan dependencies passed')verified=True 应来自工具、测试或人工确认,而不是模型自报。任务验收失败时,保留失败观察并选择重试、替代步骤或人工接管;不要直接把任务标成完成。动态计划要限制最大步骤、总成本和允许工具集合。
变体实验
给 check 添加不存在的前置任务,要求计划在加载阶段报 missing_dependency。再让 search 验收失败,确认 check 不会进入就绪队列。
练习
- 为任务增加验收 schema 和风险等级。
- 设计计划版本号,拒绝旧 worker 提交新计划的结果。
- 比较固定 pipeline、动态计划和人工审批三种适用场景。