3. 任务编排核心概念
在标注任务编排系统中,核心目标是把一个大规模标注需求,转化为可执行、可追踪、可恢复、可审核的工程流水线。它并不是简单地把数据分发给标注员,而是围绕任务拆分、依赖管理、优先级调度、资源分配、工作流引擎与状态机设计六个关键概念,构建一套稳定的闭环机制。理解这六个概念之间的关系,是设计标注平台编排能力的起点。
一、任务拆分:从批次到最小可执行单元
任务拆分决定了后续依赖、调度和资源分配的粒度。拆分过粗,单任务执行时间长、失败重试成本高、审核反馈慢;拆分过细,元数据管理开销大、上下文丢失、标注员频繁切换。常见拆分维度包括:
- 按数据项拆分:一条文本、一张图片、一段音频作为一个任务单元,适合独立标注场景。
- 按批次拆分:将 1000 条数据打包为一个批次,适合批量导入、批量分配和批量审核。
- 按标注类型拆分:分类、实体抽取、关系标注、质量评估分别建任务,避免一个任务混合多种操作。
- 按审核阶段拆分:初标、一审、二审、仲裁各自独立成任务,便于状态追踪和绩效统计。
拆分后的任务应具备唯一 ID、所属批次、数据范围、标注规范版本、优先级、依赖前置任务等元数据。这些元数据是后续依赖管理和状态机流转的基础。
二、依赖管理:定义任务之间的先后约束
标注任务并非彼此孤立。例如,实体抽取完成后才能进行关系标注;初标完成后才能进入审核;审核驳回后需要回到初标重做。依赖管理就是把这些约束显式建模,避免任务在条件未满足时被错误调度。
常见依赖类型包括:
| 依赖类型 | 说明 | 示例 |
|---|---|---|
| 完成依赖 | 前置任务全部完成后,当前任务才可执行 | 实体标注完成后才能做关系标注 |
| 数据依赖 | 当前任务需要前置任务产出的数据作为输入 | 审核任务需要初标结果 |
| 资源依赖 | 需要特定技能、角色或工具才能执行 | 医学标注任务只能分配给医学背景人员 |
| 时间依赖 | 在指定时间窗口内才可执行 | 每日 9:00 后开放当日审核任务 |
| 状态依赖 | 前置任务处于特定状态时才触发 | 初标被驳回后生成重做任务 |
依赖关系通常用有向无环图(DAG)表达。工作流引擎在调度前会检查当前任务的入边依赖是否全部满足,只有满足才将其放入可执行队列。若依赖形成环,则系统应拒绝发布并提示配置错误。
三、优先级调度:决定谁先执行
当可执行任务数量超过资源容量时,必须通过优先级调度决定执行顺序。优先级可以来自业务紧急度、数据时效、审核时限、客户等级或返工次数。常见策略包括:
- 静态优先级:任务创建时指定优先级,如 P0、P1、P2,调度时按优先级排序。
- 动态优先级:根据等待时长、截止时间、返工次数动态提升优先级,避免饥饿。
- 加权公平调度:在多个项目或客户之间按权重分配资源,防止单一项目占满全部产能。
- 抢占式调度:高优先级任务可中断低优先级任务,适合紧急插单场景,但需支持状态保存与恢复。
调度器通常维护多个队列:待调度、可执行、执行中、待审核、已完成。每个队列内部按优先级和创建时间排序,形成稳定的执行顺序。
四、资源分配:把任务匹配到合适的人与工具
资源分配关注“谁来做”和“用什么做”。资源包括标注员、审核员、仲裁员、标注工具、模型辅助服务、GPU 推理资源等。分配策略需要同时考虑技能匹配、负载均衡、成本控制和合规要求。
resource_policy:
role: annotator
skill_tags: ["medical", "ner"]
max_concurrent_tasks: 5
daily_capacity: 200
assignment_mode: "least_loaded"
fallback_role: "annotator_general"
在实际系统中,资源分配常与调度器联动:调度器选出可执行任务后,资源分配器根据技能标签、当前负载、历史质量分和可用时间,选择最合适的执行者。若无人满足,任务进入等待池并触发告警。
五、工作流引擎与状态机设计
工作流引擎负责驱动任务在多个状态之间流转,状态机则定义每个状态、事件、守卫条件和动作。一个典型的标注任务状态机包括:
- CREATED:任务已创建,等待依赖满足。
- READY:依赖已满足,进入可调度队列。
- ASSIGNED:已分配给执行者。
- IN_PROGRESS:执行者正在标注。
- SUBMITTED:已提交,等待审核。
- APPROVED:审核通过,任务完成。
- REJECTED:审核驳回,回到重做或重新分配。
- FAILED:执行失败或超时,进入异常处理。
状态迁移必须由事件触发,并附带守卫条件。例如,只有 SUBMITTED 状态才能触发 APPROVED 或 REJECTED;只有 REJECTED 状态才能触发重新分配。状态机设计要保证幂等性,避免重复提交导致状态错乱。
六、案例场景:一条医学实体标注流水线
假设某医院需要标注 10 万条病历文本中的疾病、症状、药物实体。编排方案如下:
- 按 500 条一个批次拆分为 200 个批次任务。
- 每个批次内,先执行“实体初标”,再执行“实体审核”,审核通过后进入“关系标注”。
- 初标任务优先级为 P1,审核任务为 P0,关系标注依赖审核通过状态。
- 资源分配时,初标分配给普通标注员,审核分配给高年资审核员,仲裁分配给医学专家。
- 工作流引擎监听状态变化:初标提交后自动创建审核任务;审核驳回后自动创建重做任务并提升优先级。
- 状态机保证同一批次不会重复进入审核,也不会在未初标时进入关系标注。
七、常见误区与复盘
- 误区一:把依赖写成环。 例如 A 依赖 B,B 又依赖 A,导致任务永远无法进入 READY。发布前必须做 DAG 环检测。
- 误区二:优先级只设静态值。 低优先级任务长期饥饿,影响项目整体交付。应引入等待时长和截止时间动态提升。
- 误区三:状态机缺少守卫条件。 已通过审核的任务被重复提交,导致数据覆盖。每个迁移都应校验当前状态和操作者权限。
- 误区四:资源分配只看空闲。 忽略技能标签和质量分,导致高难度任务分配给不合适的标注员,返工率上升。
- 误区五:工作流引擎没有幂等设计。 网络重试或消息重复导致任务被多次创建。应使用唯一业务键和去重表。
复盘时,建议重点观察四个指标:任务平均等待时长、依赖阻塞率、优先级饥饿率、状态迁移失败率。这四个指标能直接反映编排系统是否健康。只有当拆分合理、依赖清晰、调度公平、资源匹配、引擎稳定、状态机严谨时,标注任务编排才能真正支撑起人工审核闭环的工程化运行。