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 状态才能触发重新分配。状态机设计要保证幂等性,避免重复提交导致状态错乱。

标注任务编排核心概念关系 任务拆分 批次 / 数据项 / 阶段 依赖管理 DAG / 前置条件 优先级调度 队列 / 抢占 / 公平 资源分配 技能 / 负载 / 成本 工作流引擎 解析 DAG · 检查依赖 · 触发调度 · 驱动状态迁移 重试 · 超时 · 回滚 · 告警 状态机 状态 / 事件 / 守卫 任务队列 待调度 / 执行中 / 审核 执行者 标注员 / 审核员 / 仲裁 异常处理 重试 / 告警 拆分定义粒度 → 依赖约束顺序 → 调度决定先后 → 资源匹配执行者 → 引擎驱动流转 → 状态机保证一致性

六、案例场景:一条医学实体标注流水线

假设某医院需要标注 10 万条病历文本中的疾病、症状、药物实体。编排方案如下:

  1. 按 500 条一个批次拆分为 200 个批次任务。
  2. 每个批次内,先执行“实体初标”,再执行“实体审核”,审核通过后进入“关系标注”。
  3. 初标任务优先级为 P1,审核任务为 P0,关系标注依赖审核通过状态。
  4. 资源分配时,初标分配给普通标注员,审核分配给高年资审核员,仲裁分配给医学专家。
  5. 工作流引擎监听状态变化:初标提交后自动创建审核任务;审核驳回后自动创建重做任务并提升优先级。
  6. 状态机保证同一批次不会重复进入审核,也不会在未初标时进入关系标注。
拆分粒度、依赖深度、优先级策略和资源容量需要联合调优。拆分越细,依赖图越复杂,调度开销越大;拆分越粗,返工成本越高。建议先用小批量数据压测,再逐步放大。

七、常见误区与复盘

  • 误区一:把依赖写成环。 例如 A 依赖 B,B 又依赖 A,导致任务永远无法进入 READY。发布前必须做 DAG 环检测。
  • 误区二:优先级只设静态值。 低优先级任务长期饥饿,影响项目整体交付。应引入等待时长和截止时间动态提升。
  • 误区三:状态机缺少守卫条件。 已通过审核的任务被重复提交,导致数据覆盖。每个迁移都应校验当前状态和操作者权限。
  • 误区四:资源分配只看空闲。 忽略技能标签和质量分,导致高难度任务分配给不合适的标注员,返工率上升。
  • 误区五:工作流引擎没有幂等设计。 网络重试或消息重复导致任务被多次创建。应使用唯一业务键和去重表。

复盘时,建议重点观察四个指标:任务平均等待时长、依赖阻塞率、优先级饥饿率、状态迁移失败率。这四个指标能直接反映编排系统是否健康。只有当拆分合理、依赖清晰、调度公平、资源匹配、引擎稳定、状态机严谨时,标注任务编排才能真正支撑起人工审核闭环的工程化运行。