gent Plan x DeepSeek Harness:多 Agent 协作场景下的中央编排实践

gent Plan x DeepSeek Harness:多 Agent 协作场景下的中央编排实践

在大模型应用从「单点能力」走向「系统能力」的今天,多 Agent 协作已经成为复杂任务落地的关键范式。然而当 Agent 数量从个位数扩展到数十、上百时,如何避免「群龙无首」式的混乱,如何在灵活性可控性之间取得平衡,成为一个工程上必须正面回答的问题。本文以 gent Plan 与 DeepSeek Harness 的结合为蓝本,系统梳理多 Agent 协作场景下中央编排(Central Orchestration)的实践方法、架构取舍与落地细节。


一、引言:为什么我们需要「中央编排」

1.1 单 Agent 的天花板

过去两年,大语言模型(LLM)在代码生成、文档撰写、问答检索等任务上展现出了惊人的单点能力。但当我们尝试把 LLM 嵌入真实业务流程时,很快就会发现单 Agent 模式存在三类明显瓶颈:

  • 上下文窗口约束:即便 DeepSeek V3、R1 等模型已经支持 64K~128K 的上下文,面对一个跨多个仓库、数十个微服务的工程任务时,仍然会力不从心。
  • 角色混淆:让一个 Agent 同时扮演「需求分析师」「编码者」「测试者」「审查者」,prompt 之间互相干扰,模型在角色切换时容易产生「人格漂移」。
  • 缺乏并发:单 Agent 本质上是串行的,无法充分利用分布式算力,长任务延迟难以接受。

1.2 多 Agent 协作的两种范式

为突破上述瓶颈,业界形成了两种主流的多 Agent 协作范式:

  • 去中心化协作(Decentralized):如 AutoGen、CAMEL,Agent 之间通过自由对话协商完成任务,没有显式的「领导者」。
  • 中央编排(Centralized Orchestration):如 LangGraph、MetaGPT 的部分实现,由一个中心 Orchestrator 负责任务分解、Agent 调度、结果汇聚。

两种范式各有优劣,但当任务具备以下特征时,中央编排几乎是必然选择:

  1. 任务边界清晰、可拆解为子任务;
  2. 子任务之间存在显式依赖关系;
  3. 对结果可解释性、可审计性要求高;
  4. 需要严格管控成本与时长。

1.3 gent Plan 与 DeepSeek Harness 的结合点

gent Plan 是一种以「计划优先」为核心的 Agent 工作流范式,强调先规划后执行;DeepSeek Harness 则是为 DeepSeek 系列模型设计的运行时框架,提供模型路由、上下文管理、工具调用、流式输出等基础设施。两者结合形成的「gent Plan x DeepSeek Harness」方案,天然契合中央编排的需求:Harness 提供「执行能力」,gent Plan 提供「编排大脑」。

本文将从架构、协议、调度、冲突、可观测性等维度,完整呈现这一方案的落地路径。


二、核心概念与术语对齐

在进入实现细节前,先统一术语,避免后文出现歧义。

术语 含义
Orchestrator 中央编排器,负责任务分解、调度、汇聚
Agent 具备特定角色与工具集的执行单元
Plan 任务的有向无环图(DAG),由若干 Step 组成
Step Plan 中的最小调度单元,对应一次 Agent 调用
Tool Agent 可调用的外部能力,如检索、代码执行、文件读写
Context 一次任务生命周期内共享的状态容器
Harness DeepSeek 模型的运行时框架,封装推理、流式、工具调用

2.1 中央编排的核心职责

中央编排的本质是「让一组 Agent 像一支训练有素的乐队那样协同演奏」,其核心职责可以归纳为五点:

  1. 任务理解与分解:把高层目标拆解为可执行的 Step 序列;
  2. Agent 选择与绑定:为每个 Step 匹配最合适的 Agent;
  3. 调度与并发控制:决定 Step 之间的执行顺序与并发度;
  4. 结果汇聚与冲突仲裁:合并多 Agent 输出,解决矛盾;
  5. 状态与可观测性:维护全局上下文,输出可审计日志。

三、整体架构设计

3.1 分层架构总览

下面用 Mermaid 描述整体分层架构:
#mermaid-svg-44ws4faLGzHd8kqd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-44ws4faLGzHd8kqd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-44ws4faLGzHd8kqd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-44ws4faLGzHd8kqd .error-icon{fill:#552222;}#mermaid-svg-44ws4faLGzHd8kqd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-44ws4faLGzHd8kqd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-44ws4faLGzHd8kqd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-44ws4faLGzHd8kqd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-44ws4faLGzHd8kqd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-44ws4faLGzHd8kqd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-44ws4faLGzHd8kqd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-44ws4faLGzHd8kqd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-44ws4faLGzHd8kqd .marker.cross{stroke:#333333;}#mermaid-svg-44ws4faLGzHd8kqd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-44ws4faLGzHd8kqd p{margin:0;}#mermaid-svg-44ws4faLGzHd8kqd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-44ws4faLGzHd8kqd .cluster-label text{fill:#333;}#mermaid-svg-44ws4faLGzHd8kqd .cluster-label span{color:#333;}#mermaid-svg-44ws4faLGzHd8kqd .cluster-label span p{background-color:transparent;}#mermaid-svg-44ws4faLGzHd8kqd .label text,#mermaid-svg-44ws4faLGzHd8kqd span{fill:#333;color:#333;}#mermaid-svg-44ws4faLGzHd8kqd .node rect,#mermaid-svg-44ws4faLGzHd8kqd .node circle,#mermaid-svg-44ws4faLGzHd8kqd .node ellipse,#mermaid-svg-44ws4faLGzHd8kqd .node polygon,#mermaid-svg-44ws4faLGzHd8kqd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-44ws4faLGzHd8kqd .rough-node .label text,#mermaid-svg-44ws4faLGzHd8kqd .node .label text,#mermaid-svg-44ws4faLGzHd8kqd .image-shape .label,#mermaid-svg-44ws4faLGzHd8kqd .icon-shape .label{text-anchor:middle;}#mermaid-svg-44ws4faLGzHd8kqd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-44ws4faLGzHd8kqd .rough-node .label,#mermaid-svg-44ws4faLGzHd8kqd .node .label,#mermaid-svg-44ws4faLGzHd8kqd .image-shape .label,#mermaid-svg-44ws4faLGzHd8kqd .icon-shape .label{text-align:center;}#mermaid-svg-44ws4faLGzHd8kqd .node.clickable{cursor:pointer;}#mermaid-svg-44ws4faLGzHd8kqd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-44ws4faLGzHd8kqd .arrowheadPath{fill:#333333;}#mermaid-svg-44ws4faLGzHd8kqd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-44ws4faLGzHd8kqd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-44ws4faLGzHd8kqd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-44ws4faLGzHd8kqd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-44ws4faLGzHd8kqd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-44ws4faLGzHd8kqd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-44ws4faLGzHd8kqd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-44ws4faLGzHd8kqd .cluster text{fill:#333;}#mermaid-svg-44ws4faLGzHd8kqd .cluster span{color:#333;}#mermaid-svg-44ws4faLGzHd8kqd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-44ws4faLGzHd8kqd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-44ws4faLGzHd8kqd rect.text{fill:none;stroke-width:0;}#mermaid-svg-44ws4faLGzHd8kqd .icon-shape,#mermaid-svg-44ws4faLGzHd8kqd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-44ws4faLGzHd8kqd .icon-shape p,#mermaid-svg-44ws4faLGzHd8kqd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-44ws4faLGzHd8kqd .icon-shape .label rect,#mermaid-svg-44ws4faLGzHd8kqd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-44ws4faLGzHd8kqd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-44ws4faLGzHd8kqd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-44ws4faLGzHd8kqd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基础设施层
模型运行时 (DeepSeek Harness)
Agent 层
编排层 (gent Plan)
用户层
任务发起者
结果消费者
Orchestrator 中央编排器
Planner 规划器
Scheduler 调度器
Aggregator 汇聚器
需求分析 Agent
编码 Agent
测试 Agent
审查 Agent
检索 Agent
Model Router 模型路由
Context Manager 上下文管理
Tool Caller 工具调用
Stream Server 流式服务
向量库
关系库
文件系统
消息队列

从图中可以看出,整个系统是典型的「四层结构」:用户层、编排层、Agent 层、模型运行时层,外加一个基础设施层。编排层是中央编排的核心,Agent 层提供执行能力,Harness 层屏蔽模型调用细节。

3.2 各层职责详解

用户层负责任务的下发与结果的接收,通常是 IDE 插件、CLI、Web 前端或 API 调用方。

编排层是本文的主角,由 Orchestrator 及其三个子组件构成:

  • Planner:将自然语言目标转换为 Plan DAG;
  • Scheduler:依据 DAG 依赖关系执行 Step,并控制并发度;
  • Aggregator:汇聚各 Agent 输出,处理冲突。

Agent 层是「执行末端」,每个 Agent 拥有独立的 system prompt、工具集和记忆。Agent 之间不直接通信,所有通信都经由 Orchestrator 中转,这是「中央编排」与「去中心化协作」最本质的区别。

**模型运行时层(DeepSeek Harness)**是底层执行引擎,它向上提供统一的推理接口,向下屏蔽 DeepSeek 不同模型(V3、R1、Coder 等)的差异。

基础设施层提供向量检索、持久化、消息通信等通用能力,被 Harness 与 Agent 共享。

3.3 为什么选择「中央」而非「分布式」

在工程实践中,分布式协作的诱惑在于「弹性」和「可扩展性」,但其代价是调试困难、行为不可预测。中央编排的优势在于:

  • 可解释性:每一步调度都有明确日志,便于复盘;
  • 可控成本:Orchestrator 可以基于预算动态裁剪 Plan;
  • 一致性保证:通过中央汇聚避免多 Agent 输出冲突;
  • 降级路径清晰:失败时由 Orchestrator 决定重试、降级还是终止。

当然,中央编排也存在单点瓶颈风险,后文会通过「主备编排器」「Plan 检查点」等手段缓解。


四、中央编排器的核心实现

4.1 任务分解:从目标到 Plan DAG

任务分解是整个流程的起点,也是决定后续执行质量的关键。gent Plan 的核心思想是「先规划后执行」,这意味着 Planner 在动手前必须产出一个完整的 Plan DAG。

Plan 的结构可以用如下 schema 描述:

json 复制代码
{
  "plan_id": "plan_20260824_001",
  "goal": "为电商系统实现一个优惠券模块并完成测试",
  "steps": [
    {
      "step_id": "s1",
      "intent": "需求分析",
      "agent": "requirement_analyst",
      "depends_on": [],
      "inputs": ["原始需求文档"],
      "outputs": ["结构化需求"],
      "budget_tokens": 8000
    },
    {
      "step_id": "s2",
      "intent": "检索相关代码",
      "agent": "retriever",
      "depends_on": ["s1"],
      "inputs": ["结构化需求"],
      "outputs": ["相关代码片段"],
      "budget_tokens": 4000
    },
    {
      "step_id": "s3",
      "intent": "编码实现",
      "agent": "coder",
      "depends_on": ["s1", "s2"],
      "inputs": ["结构化需求", "相关代码片段"],
      "outputs": ["源代码"],
      "budget_tokens": 16000
    },
    {
      "step_id": "s4",
      "intent": "编写测试",
      "agent": "tester",
      "depends_on": ["s3"],
      "inputs": ["源代码"],
      "outputs": ["测试用例"],
      "budget_tokens": 8000
    },
    {
      "step_id": "s5",
      "intent": "代码审查",
      "agent": "reviewer",
      "depends_on": ["s3", "s4"],
      "inputs": ["源代码", "测试用例"],
      "outputs": ["审查意见"],
      "budget_tokens": 6000
    }
  ]
}

下面用 Mermaid 展示这个 Plan 的 DAG 结构:
#mermaid-svg-qPlV8mYN4C8GFqC3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qPlV8mYN4C8GFqC3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qPlV8mYN4C8GFqC3 .error-icon{fill:#552222;}#mermaid-svg-qPlV8mYN4C8GFqC3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qPlV8mYN4C8GFqC3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qPlV8mYN4C8GFqC3 .marker.cross{stroke:#333333;}#mermaid-svg-qPlV8mYN4C8GFqC3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qPlV8mYN4C8GFqC3 p{margin:0;}#mermaid-svg-qPlV8mYN4C8GFqC3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qPlV8mYN4C8GFqC3 .cluster-label text{fill:#333;}#mermaid-svg-qPlV8mYN4C8GFqC3 .cluster-label span{color:#333;}#mermaid-svg-qPlV8mYN4C8GFqC3 .cluster-label span p{background-color:transparent;}#mermaid-svg-qPlV8mYN4C8GFqC3 .label text,#mermaid-svg-qPlV8mYN4C8GFqC3 span{fill:#333;color:#333;}#mermaid-svg-qPlV8mYN4C8GFqC3 .node rect,#mermaid-svg-qPlV8mYN4C8GFqC3 .node circle,#mermaid-svg-qPlV8mYN4C8GFqC3 .node ellipse,#mermaid-svg-qPlV8mYN4C8GFqC3 .node polygon,#mermaid-svg-qPlV8mYN4C8GFqC3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qPlV8mYN4C8GFqC3 .rough-node .label text,#mermaid-svg-qPlV8mYN4C8GFqC3 .node .label text,#mermaid-svg-qPlV8mYN4C8GFqC3 .image-shape .label,#mermaid-svg-qPlV8mYN4C8GFqC3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-qPlV8mYN4C8GFqC3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qPlV8mYN4C8GFqC3 .rough-node .label,#mermaid-svg-qPlV8mYN4C8GFqC3 .node .label,#mermaid-svg-qPlV8mYN4C8GFqC3 .image-shape .label,#mermaid-svg-qPlV8mYN4C8GFqC3 .icon-shape .label{text-align:center;}#mermaid-svg-qPlV8mYN4C8GFqC3 .node.clickable{cursor:pointer;}#mermaid-svg-qPlV8mYN4C8GFqC3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qPlV8mYN4C8GFqC3 .arrowheadPath{fill:#333333;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qPlV8mYN4C8GFqC3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qPlV8mYN4C8GFqC3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qPlV8mYN4C8GFqC3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qPlV8mYN4C8GFqC3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qPlV8mYN4C8GFqC3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qPlV8mYN4C8GFqC3 .cluster text{fill:#333;}#mermaid-svg-qPlV8mYN4C8GFqC3 .cluster span{color:#333;}#mermaid-svg-qPlV8mYN4C8GFqC3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qPlV8mYN4C8GFqC3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qPlV8mYN4C8GFqC3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-qPlV8mYN4C8GFqC3 .icon-shape,#mermaid-svg-qPlV8mYN4C8GFqC3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qPlV8mYN4C8GFqC3 .icon-shape p,#mermaid-svg-qPlV8mYN4C8GFqC3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qPlV8mYN4C8GFqC3 .icon-shape .label rect,#mermaid-svg-qPlV8mYN4C8GFqC3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qPlV8mYN4C8GFqC3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qPlV8mYN4C8GFqC3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qPlV8mYN4C8GFqC3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} s1 需求分析
s2 代码检索
s3 编码实现
s4 测试编写
s5 代码审查
完成

Planner 的工作流程可以分为三个子阶段:

  1. 意图识别:调用 DeepSeek 模型,将自然语言目标解析为结构化意图;
  2. 能力盘点:根据已注册的 Agent 列表,确定可用能力边界;
  3. DAG 生成:基于意图与能力,生成满足依赖关系的 Plan。

4.2 Agent 选择:能力匹配与负载均衡

为每个 Step 选择合适的 Agent,本质是一个约束求解问题。匹配维度包括:

  • 能力标签 :Agent 声明的 capabilities 是否覆盖 Step 的 intent
  • 工具可用性:Agent 是否具备 Step 所需的工具集;
  • 负载水位:当前 Agent 队列长度、平均响应时长;
  • 历史表现:该 Agent 在类似 Step 上的成功率与平均消耗;
  • 成本约束:Agent 调用不同模型的单价差异。

匹配过程如下:
#mermaid-svg-iVM67Y7JYINfaNwt{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iVM67Y7JYINfaNwt .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iVM67Y7JYINfaNwt .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iVM67Y7JYINfaNwt .error-icon{fill:#552222;}#mermaid-svg-iVM67Y7JYINfaNwt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iVM67Y7JYINfaNwt .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iVM67Y7JYINfaNwt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iVM67Y7JYINfaNwt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iVM67Y7JYINfaNwt .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iVM67Y7JYINfaNwt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iVM67Y7JYINfaNwt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iVM67Y7JYINfaNwt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iVM67Y7JYINfaNwt .marker.cross{stroke:#333333;}#mermaid-svg-iVM67Y7JYINfaNwt svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iVM67Y7JYINfaNwt p{margin:0;}#mermaid-svg-iVM67Y7JYINfaNwt .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iVM67Y7JYINfaNwt .cluster-label text{fill:#333;}#mermaid-svg-iVM67Y7JYINfaNwt .cluster-label span{color:#333;}#mermaid-svg-iVM67Y7JYINfaNwt .cluster-label span p{background-color:transparent;}#mermaid-svg-iVM67Y7JYINfaNwt .label text,#mermaid-svg-iVM67Y7JYINfaNwt span{fill:#333;color:#333;}#mermaid-svg-iVM67Y7JYINfaNwt .node rect,#mermaid-svg-iVM67Y7JYINfaNwt .node circle,#mermaid-svg-iVM67Y7JYINfaNwt .node ellipse,#mermaid-svg-iVM67Y7JYINfaNwt .node polygon,#mermaid-svg-iVM67Y7JYINfaNwt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iVM67Y7JYINfaNwt .rough-node .label text,#mermaid-svg-iVM67Y7JYINfaNwt .node .label text,#mermaid-svg-iVM67Y7JYINfaNwt .image-shape .label,#mermaid-svg-iVM67Y7JYINfaNwt .icon-shape .label{text-anchor:middle;}#mermaid-svg-iVM67Y7JYINfaNwt .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iVM67Y7JYINfaNwt .rough-node .label,#mermaid-svg-iVM67Y7JYINfaNwt .node .label,#mermaid-svg-iVM67Y7JYINfaNwt .image-shape .label,#mermaid-svg-iVM67Y7JYINfaNwt .icon-shape .label{text-align:center;}#mermaid-svg-iVM67Y7JYINfaNwt .node.clickable{cursor:pointer;}#mermaid-svg-iVM67Y7JYINfaNwt .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iVM67Y7JYINfaNwt .arrowheadPath{fill:#333333;}#mermaid-svg-iVM67Y7JYINfaNwt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iVM67Y7JYINfaNwt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iVM67Y7JYINfaNwt .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iVM67Y7JYINfaNwt .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iVM67Y7JYINfaNwt .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iVM67Y7JYINfaNwt .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iVM67Y7JYINfaNwt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iVM67Y7JYINfaNwt .cluster text{fill:#333;}#mermaid-svg-iVM67Y7JYINfaNwt .cluster span{color:#333;}#mermaid-svg-iVM67Y7JYINfaNwt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iVM67Y7JYINfaNwt .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iVM67Y7JYINfaNwt rect.text{fill:none;stroke-width:0;}#mermaid-svg-iVM67Y7JYINfaNwt .icon-shape,#mermaid-svg-iVM67Y7JYINfaNwt .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iVM67Y7JYINfaNwt .icon-shape p,#mermaid-svg-iVM67Y7JYINfaNwt .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iVM67Y7JYINfaNwt .icon-shape .label rect,#mermaid-svg-iVM67Y7JYINfaNwt .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iVM67Y7JYINfaNwt .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iVM67Y7JYINfaNwt .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iVM67Y7JYINfaNwt :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 超预算
待调度 Step
能力过滤
工具过滤
负载过滤
历史评分排序
预算校验
选定 Agent
降级到更便宜 Agent

当一个 Step 有多个候选 Agent 时,Orchestrator 会综合「能力契合度 × 历史成功率 ÷ 当前负载」计算得分,得分最高者中标。若所有候选均超出预算,则触发降级:选择更便宜的模型或更轻量的 Agent。

4.3 调度器:依赖解析与并发控制

Scheduler 的核心是把 DAG 转换为可执行的并发任务流。它的关键算法是拓扑排序 + 并发上限控制:
#mermaid-svg-yThMYy0tStTdt4Sc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yThMYy0tStTdt4Sc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yThMYy0tStTdt4Sc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yThMYy0tStTdt4Sc .error-icon{fill:#552222;}#mermaid-svg-yThMYy0tStTdt4Sc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yThMYy0tStTdt4Sc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yThMYy0tStTdt4Sc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yThMYy0tStTdt4Sc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yThMYy0tStTdt4Sc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yThMYy0tStTdt4Sc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yThMYy0tStTdt4Sc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yThMYy0tStTdt4Sc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yThMYy0tStTdt4Sc .marker.cross{stroke:#333333;}#mermaid-svg-yThMYy0tStTdt4Sc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yThMYy0tStTdt4Sc p{margin:0;}#mermaid-svg-yThMYy0tStTdt4Sc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-yThMYy0tStTdt4Sc .cluster-label text{fill:#333;}#mermaid-svg-yThMYy0tStTdt4Sc .cluster-label span{color:#333;}#mermaid-svg-yThMYy0tStTdt4Sc .cluster-label span p{background-color:transparent;}#mermaid-svg-yThMYy0tStTdt4Sc .label text,#mermaid-svg-yThMYy0tStTdt4Sc span{fill:#333;color:#333;}#mermaid-svg-yThMYy0tStTdt4Sc .node rect,#mermaid-svg-yThMYy0tStTdt4Sc .node circle,#mermaid-svg-yThMYy0tStTdt4Sc .node ellipse,#mermaid-svg-yThMYy0tStTdt4Sc .node polygon,#mermaid-svg-yThMYy0tStTdt4Sc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-yThMYy0tStTdt4Sc .rough-node .label text,#mermaid-svg-yThMYy0tStTdt4Sc .node .label text,#mermaid-svg-yThMYy0tStTdt4Sc .image-shape .label,#mermaid-svg-yThMYy0tStTdt4Sc .icon-shape .label{text-anchor:middle;}#mermaid-svg-yThMYy0tStTdt4Sc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-yThMYy0tStTdt4Sc .rough-node .label,#mermaid-svg-yThMYy0tStTdt4Sc .node .label,#mermaid-svg-yThMYy0tStTdt4Sc .image-shape .label,#mermaid-svg-yThMYy0tStTdt4Sc .icon-shape .label{text-align:center;}#mermaid-svg-yThMYy0tStTdt4Sc .node.clickable{cursor:pointer;}#mermaid-svg-yThMYy0tStTdt4Sc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-yThMYy0tStTdt4Sc .arrowheadPath{fill:#333333;}#mermaid-svg-yThMYy0tStTdt4Sc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-yThMYy0tStTdt4Sc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-yThMYy0tStTdt4Sc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yThMYy0tStTdt4Sc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-yThMYy0tStTdt4Sc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yThMYy0tStTdt4Sc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-yThMYy0tStTdt4Sc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-yThMYy0tStTdt4Sc .cluster text{fill:#333;}#mermaid-svg-yThMYy0tStTdt4Sc .cluster span{color:#333;}#mermaid-svg-yThMYy0tStTdt4Sc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-yThMYy0tStTdt4Sc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-yThMYy0tStTdt4Sc rect.text{fill:none;stroke-width:0;}#mermaid-svg-yThMYy0tStTdt4Sc .icon-shape,#mermaid-svg-yThMYy0tStTdt4Sc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yThMYy0tStTdt4Sc .icon-shape p,#mermaid-svg-yThMYy0tStTdt4Sc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-yThMYy0tStTdt4Sc .icon-shape .label rect,#mermaid-svg-yThMYy0tStTdt4Sc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yThMYy0tStTdt4Sc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-yThMYy0tStTdt4Sc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-yThMYy0tStTdt4Sc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是

成功
失败




调度开始
拓扑排序
计算就绪队列

入度为0的Step
并发数 < 上限?
分发到Agent
等待槽位释放
Agent 执行
Step 完成?
更新依赖计数
可重试?
降级或终止
还有就绪Step?
调度结束

并发上限的设置需要权衡三类资源:

  • 模型 QPS 配额:DeepSeek API 的并发请求数有上限;
  • 下游工具容量:如向量库检索并发数;
  • 预算消耗速度:避免 Plan 未完成预算已耗尽。

工程上推荐采用「动态令牌桶」:起始并发为 min(8, 配额上限),根据 429 错误率与平均延迟自适应调整。

4.4 结果汇聚与冲突仲裁

当多个 Step 产生同类输出时,Aggregator 需要进行汇聚。汇聚策略分为三类:

  1. 覆盖型:后执行的结果直接覆盖前者,适用于幂等操作;
  2. 合并型:如多 Agent 检索结果去重合并;
  3. 仲裁型:当结果矛盾时,由 Orchestrator 调用「裁判 Agent」做最终决策。

仲裁流程示意:
Judge Agent Agent3 Agent2 Orchestrator Judge Agent Agent3 Agent2 Orchestrator #mermaid-svg-kAr0lyouyFe1FQua{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kAr0lyouyFe1FQua .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kAr0lyouyFe1FQua .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kAr0lyouyFe1FQua .error-icon{fill:#552222;}#mermaid-svg-kAr0lyouyFe1FQua .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kAr0lyouyFe1FQua .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kAr0lyouyFe1FQua .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kAr0lyouyFe1FQua .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kAr0lyouyFe1FQua .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kAr0lyouyFe1FQua .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kAr0lyouyFe1FQua .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kAr0lyouyFe1FQua .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kAr0lyouyFe1FQua .marker.cross{stroke:#333333;}#mermaid-svg-kAr0lyouyFe1FQua svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kAr0lyouyFe1FQua p{margin:0;}#mermaid-svg-kAr0lyouyFe1FQua .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kAr0lyouyFe1FQua text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-kAr0lyouyFe1FQua .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-kAr0lyouyFe1FQua .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-kAr0lyouyFe1FQua .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-kAr0lyouyFe1FQua .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-kAr0lyouyFe1FQua #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-kAr0lyouyFe1FQua .sequenceNumber{fill:white;}#mermaid-svg-kAr0lyouyFe1FQua #sequencenumber{fill:#333;}#mermaid-svg-kAr0lyouyFe1FQua #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-kAr0lyouyFe1FQua .messageText{fill:#333;stroke:none;}#mermaid-svg-kAr0lyouyFe1FQua .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kAr0lyouyFe1FQua .labelText,#mermaid-svg-kAr0lyouyFe1FQua .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-kAr0lyouyFe1FQua .loopText,#mermaid-svg-kAr0lyouyFe1FQua .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-kAr0lyouyFe1FQua .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-kAr0lyouyFe1FQua .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-kAr0lyouyFe1FQua .noteText,#mermaid-svg-kAr0lyouyFe1FQua .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-kAr0lyouyFe1FQua .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kAr0lyouyFe1FQua .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kAr0lyouyFe1FQua .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kAr0lyouyFe1FQua .actorPopupMenu{position:absolute;}#mermaid-svg-kAr0lyouyFe1FQua .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-kAr0lyouyFe1FQua .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kAr0lyouyFe1FQua .actor-man circle,#mermaid-svg-kAr0lyouyFe1FQua line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-kAr0lyouyFe1FQua :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 执行 Step s_x执行 Step s_x结果R1结果R2检测到冲突提交R1,R2 + 上下文最终决策R*写入汇聚结果

冲突检测可以基于:结果哈希不一致、关键字段取值差异、置信度低于阈值等。

4.5 状态管理与检查点

中央编排必须维护全局可恢复状态,否则一旦崩溃整个 Plan 就要重跑。状态包括:

  • Plan 定义(不可变)
  • 各 Step 的执行状态(pending/running/success/failed/skipped)
  • 上下文快照(每个 Step 完成后的 Context 副本)
  • 预算消耗记录

检查点策略:

  • 每 Step 完成后写一次检查点;
  • 长任务(>30s)每 10s 追加一次增量检查点;
  • 检查点存储到关系库 + 对象存储,主备编排器共享。

恢复流程:
#mermaid-svg-WznkwUAb0ZivATYB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WznkwUAb0ZivATYB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WznkwUAb0ZivATYB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WznkwUAb0ZivATYB .error-icon{fill:#552222;}#mermaid-svg-WznkwUAb0ZivATYB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WznkwUAb0ZivATYB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WznkwUAb0ZivATYB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WznkwUAb0ZivATYB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WznkwUAb0ZivATYB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WznkwUAb0ZivATYB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WznkwUAb0ZivATYB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WznkwUAb0ZivATYB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WznkwUAb0ZivATYB .marker.cross{stroke:#333333;}#mermaid-svg-WznkwUAb0ZivATYB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WznkwUAb0ZivATYB p{margin:0;}#mermaid-svg-WznkwUAb0ZivATYB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WznkwUAb0ZivATYB .cluster-label text{fill:#333;}#mermaid-svg-WznkwUAb0ZivATYB .cluster-label span{color:#333;}#mermaid-svg-WznkwUAb0ZivATYB .cluster-label span p{background-color:transparent;}#mermaid-svg-WznkwUAb0ZivATYB .label text,#mermaid-svg-WznkwUAb0ZivATYB span{fill:#333;color:#333;}#mermaid-svg-WznkwUAb0ZivATYB .node rect,#mermaid-svg-WznkwUAb0ZivATYB .node circle,#mermaid-svg-WznkwUAb0ZivATYB .node ellipse,#mermaid-svg-WznkwUAb0ZivATYB .node polygon,#mermaid-svg-WznkwUAb0ZivATYB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WznkwUAb0ZivATYB .rough-node .label text,#mermaid-svg-WznkwUAb0ZivATYB .node .label text,#mermaid-svg-WznkwUAb0ZivATYB .image-shape .label,#mermaid-svg-WznkwUAb0ZivATYB .icon-shape .label{text-anchor:middle;}#mermaid-svg-WznkwUAb0ZivATYB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WznkwUAb0ZivATYB .rough-node .label,#mermaid-svg-WznkwUAb0ZivATYB .node .label,#mermaid-svg-WznkwUAb0ZivATYB .image-shape .label,#mermaid-svg-WznkwUAb0ZivATYB .icon-shape .label{text-align:center;}#mermaid-svg-WznkwUAb0ZivATYB .node.clickable{cursor:pointer;}#mermaid-svg-WznkwUAb0ZivATYB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WznkwUAb0ZivATYB .arrowheadPath{fill:#333333;}#mermaid-svg-WznkwUAb0ZivATYB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WznkwUAb0ZivATYB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WznkwUAb0ZivATYB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WznkwUAb0ZivATYB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WznkwUAb0ZivATYB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WznkwUAb0ZivATYB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WznkwUAb0ZivATYB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WznkwUAb0ZivATYB .cluster text{fill:#333;}#mermaid-svg-WznkwUAb0ZivATYB .cluster span{color:#333;}#mermaid-svg-WznkwUAb0ZivATYB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WznkwUAb0ZivATYB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WznkwUAb0ZivATYB rect.text{fill:none;stroke-width:0;}#mermaid-svg-WznkwUAb0ZivATYB .icon-shape,#mermaid-svg-WznkwUAb0ZivATYB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WznkwUAb0ZivATYB .icon-shape p,#mermaid-svg-WznkwUAb0ZivATYB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WznkwUAb0ZivATYB .icon-shape .label rect,#mermaid-svg-WznkwUAb0ZivATYB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WznkwUAb0ZivATYB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WznkwUAb0ZivATYB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WznkwUAb0ZivATYB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 编排器崩溃
新编排器启动
加载最新检查点
对比预期与实际状态
重跑未完成Step
跳过已完成Step
恢复调度


五、DeepSeek Harness 模型集成

5.1 模型路由:让合适的模型干合适的事

DeepSeek 系列模型覆盖了通用对话、推理、代码等不同场景。Harness 的 Model Router 根据以下维度选择模型:

维度 候选模型 适用场景
复杂推理 DeepSeek-R1 规划、审查、仲裁
代码生成 DeepSeek-Coder 编码、重构、修复
通用对话 DeepSeek-V3 需求澄清、文档撰写
轻量任务 DeepSeek-V3-Lite 摘要、分类、路由判断

路由规则示例:

python 复制代码
def route_model(step):
    if step.intent in ["planning", "review", "arbitration"]:
        return "deepseek-r1"
    if step.intent in ["coding", "refactor"]:
        return "deepseek-coder"
    if step.budget_tokens < 2000:
        return "deepseek-v3-lite"
    return "deepseek-v3"

5.2 上下文管理

多 Agent 协作最大的资源黑洞就是上下文重复传递。Harness 的 Context Manager 通过三层机制控制上下文:

  1. 共享黑板:所有 Agent 通过「黑板」读写共享状态,避免在 prompt 中重复传递;
  2. 视图投影:每个 Agent 只看到与其任务相关的子视图;
  3. 摘要压缩:长历史对话由 R1 模型周期性摘要,保留关键事实。

5.3 工具调用规范

Harness 实现了统一的工具调用协议,所有工具遵循如下接口:

json 复制代码
{
  "tool_name": "vector_search",
  "description": "在代码库中检索相关片段",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {"type": "string"},
      "top_k": {"type": "integer", "default": 5}
    },
    "required": ["query"]
  }
}

工具调用走的是结构化 JSON,便于 Orchestrator 审计与重放。所有工具调用都会被记录到 Trace 系统,作为可观测性数据源。

5.4 流式输出与取消

对于长输出(如代码生成、长文档撰写),Harness 提供流式输出能力,用户可以实时看到 Agent 的产出。更重要的是,Orchestrator 可以基于流式内容做「早期取消」:

  • 检测到 Agent 偏离主题时立即中断;
  • 检测到敏感词或越权操作时立即中断;
  • 预算即将耗尽时主动中断并切换到轻量模型。

这种「流式中断」是中央编排相对于分布式协作的重要优势之一。


六、协作流程详解:一次完整任务的旅程

让我们通过一个完整案例,观察「为电商系统实现优惠券模块」这一任务在 gent Plan x DeepSeek Harness 中的全流程。

6.1 任务接收与意图识别

用户在 IDE 中输入:「为我们的电商系统新增一个优惠券模块,需要支持满减、折扣、限时三种类型,并完成单元测试。」

Orchestrator 收到请求后,先调用 Planner 进行意图识别:
Harness Planner Orchestrator 用户 Harness Planner Orchestrator 用户 #mermaid-svg-H8rKLAgVDxmtQZYL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-H8rKLAgVDxmtQZYL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-H8rKLAgVDxmtQZYL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-H8rKLAgVDxmtQZYL .error-icon{fill:#552222;}#mermaid-svg-H8rKLAgVDxmtQZYL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-H8rKLAgVDxmtQZYL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-H8rKLAgVDxmtQZYL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-H8rKLAgVDxmtQZYL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-H8rKLAgVDxmtQZYL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-H8rKLAgVDxmtQZYL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-H8rKLAgVDxmtQZYL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-H8rKLAgVDxmtQZYL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-H8rKLAgVDxmtQZYL .marker.cross{stroke:#333333;}#mermaid-svg-H8rKLAgVDxmtQZYL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-H8rKLAgVDxmtQZYL p{margin:0;}#mermaid-svg-H8rKLAgVDxmtQZYL .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-H8rKLAgVDxmtQZYL text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-H8rKLAgVDxmtQZYL .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-H8rKLAgVDxmtQZYL .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-H8rKLAgVDxmtQZYL .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-H8rKLAgVDxmtQZYL .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-H8rKLAgVDxmtQZYL #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-H8rKLAgVDxmtQZYL .sequenceNumber{fill:white;}#mermaid-svg-H8rKLAgVDxmtQZYL #sequencenumber{fill:#333;}#mermaid-svg-H8rKLAgVDxmtQZYL #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-H8rKLAgVDxmtQZYL .messageText{fill:#333;stroke:none;}#mermaid-svg-H8rKLAgVDxmtQZYL .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-H8rKLAgVDxmtQZYL .labelText,#mermaid-svg-H8rKLAgVDxmtQZYL .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-H8rKLAgVDxmtQZYL .loopText,#mermaid-svg-H8rKLAgVDxmtQZYL .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-H8rKLAgVDxmtQZYL .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-H8rKLAgVDxmtQZYL .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-H8rKLAgVDxmtQZYL .noteText,#mermaid-svg-H8rKLAgVDxmtQZYL .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-H8rKLAgVDxmtQZYL .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-H8rKLAgVDxmtQZYL .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-H8rKLAgVDxmtQZYL .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-H8rKLAgVDxmtQZYL .actorPopupMenu{position:absolute;}#mermaid-svg-H8rKLAgVDxmtQZYL .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-H8rKLAgVDxmtQZYL .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-H8rKLAgVDxmtQZYL .actor-man circle,#mermaid-svg-H8rKLAgVDxmtQZYL line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-H8rKLAgVDxmtQZYL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 提交任务触发规划调用 R1 识别意图结构化意图调用 R1 拆解StepPlan DAG返回 Plan持久化 Plan

Planner 产出的 Plan 与第 4.1 节示例类似,包含 5 个 Step。

6.2 规划阶段:Planner 的内部逻辑

Planner 内部采用「反思式规划」:先生成初版 Plan,再让 R1 自我反思找出潜在问题,最后产出修订版。这一过程对应 mermaid:
#mermaid-svg-2MktuR3wzcsGq7h6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2MktuR3wzcsGq7h6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2MktuR3wzcsGq7h6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2MktuR3wzcsGq7h6 .error-icon{fill:#552222;}#mermaid-svg-2MktuR3wzcsGq7h6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2MktuR3wzcsGq7h6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2MktuR3wzcsGq7h6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2MktuR3wzcsGq7h6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2MktuR3wzcsGq7h6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2MktuR3wzcsGq7h6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2MktuR3wzcsGq7h6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2MktuR3wzcsGq7h6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2MktuR3wzcsGq7h6 .marker.cross{stroke:#333333;}#mermaid-svg-2MktuR3wzcsGq7h6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2MktuR3wzcsGq7h6 p{margin:0;}#mermaid-svg-2MktuR3wzcsGq7h6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2MktuR3wzcsGq7h6 .cluster-label text{fill:#333;}#mermaid-svg-2MktuR3wzcsGq7h6 .cluster-label span{color:#333;}#mermaid-svg-2MktuR3wzcsGq7h6 .cluster-label span p{background-color:transparent;}#mermaid-svg-2MktuR3wzcsGq7h6 .label text,#mermaid-svg-2MktuR3wzcsGq7h6 span{fill:#333;color:#333;}#mermaid-svg-2MktuR3wzcsGq7h6 .node rect,#mermaid-svg-2MktuR3wzcsGq7h6 .node circle,#mermaid-svg-2MktuR3wzcsGq7h6 .node ellipse,#mermaid-svg-2MktuR3wzcsGq7h6 .node polygon,#mermaid-svg-2MktuR3wzcsGq7h6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2MktuR3wzcsGq7h6 .rough-node .label text,#mermaid-svg-2MktuR3wzcsGq7h6 .node .label text,#mermaid-svg-2MktuR3wzcsGq7h6 .image-shape .label,#mermaid-svg-2MktuR3wzcsGq7h6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-2MktuR3wzcsGq7h6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2MktuR3wzcsGq7h6 .rough-node .label,#mermaid-svg-2MktuR3wzcsGq7h6 .node .label,#mermaid-svg-2MktuR3wzcsGq7h6 .image-shape .label,#mermaid-svg-2MktuR3wzcsGq7h6 .icon-shape .label{text-align:center;}#mermaid-svg-2MktuR3wzcsGq7h6 .node.clickable{cursor:pointer;}#mermaid-svg-2MktuR3wzcsGq7h6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2MktuR3wzcsGq7h6 .arrowheadPath{fill:#333333;}#mermaid-svg-2MktuR3wzcsGq7h6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2MktuR3wzcsGq7h6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2MktuR3wzcsGq7h6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2MktuR3wzcsGq7h6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2MktuR3wzcsGq7h6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2MktuR3wzcsGq7h6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2MktuR3wzcsGq7h6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2MktuR3wzcsGq7h6 .cluster text{fill:#333;}#mermaid-svg-2MktuR3wzcsGq7h6 .cluster span{color:#333;}#mermaid-svg-2MktuR3wzcsGq7h6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2MktuR3wzcsGq7h6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2MktuR3wzcsGq7h6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-2MktuR3wzcsGq7h6 .icon-shape,#mermaid-svg-2MktuR3wzcsGq7h6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2MktuR3wzcsGq7h6 .icon-shape p,#mermaid-svg-2MktuR3wzcsGq7h6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2MktuR3wzcsGq7h6 .icon-shape .label rect,#mermaid-svg-2MktuR3wzcsGq7h6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2MktuR3wzcsGq7h6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2MktuR3wzcsGq7h6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2MktuR3wzcsGq7h6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是

任务目标
生成初版Plan
自我反思
发现问题?
修订Plan
最终Plan

反思维度包括:

  • 是否存在循环依赖?
  • 是否有 Step 缺少必要输入?
  • 预算分配是否合理?
  • 关键路径是否过长?

6.3 执行阶段:Agent 协同工作

Scheduler 启动调度后,Agent 们开始并发工作。下图展示了一次典型执行的时间线:
#mermaid-svg-ThkZXHyOD0RY51mG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ThkZXHyOD0RY51mG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ThkZXHyOD0RY51mG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ThkZXHyOD0RY51mG .error-icon{fill:#552222;}#mermaid-svg-ThkZXHyOD0RY51mG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ThkZXHyOD0RY51mG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ThkZXHyOD0RY51mG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ThkZXHyOD0RY51mG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ThkZXHyOD0RY51mG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ThkZXHyOD0RY51mG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ThkZXHyOD0RY51mG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ThkZXHyOD0RY51mG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ThkZXHyOD0RY51mG .marker.cross{stroke:#333333;}#mermaid-svg-ThkZXHyOD0RY51mG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ThkZXHyOD0RY51mG p{margin:0;}#mermaid-svg-ThkZXHyOD0RY51mG .mermaid-main-font{font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ThkZXHyOD0RY51mG .exclude-range{fill:#eeeeee;}#mermaid-svg-ThkZXHyOD0RY51mG .section{stroke:none;opacity:0.2;}#mermaid-svg-ThkZXHyOD0RY51mG .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-ThkZXHyOD0RY51mG .section2{fill:#fff400;}#mermaid-svg-ThkZXHyOD0RY51mG .section1,#mermaid-svg-ThkZXHyOD0RY51mG .section3{fill:white;opacity:0.2;}#mermaid-svg-ThkZXHyOD0RY51mG .sectionTitle0{fill:#333;}#mermaid-svg-ThkZXHyOD0RY51mG .sectionTitle1{fill:#333;}#mermaid-svg-ThkZXHyOD0RY51mG .sectionTitle2{fill:#333;}#mermaid-svg-ThkZXHyOD0RY51mG .sectionTitle3{fill:#333;}#mermaid-svg-ThkZXHyOD0RY51mG .sectionTitle{text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ThkZXHyOD0RY51mG .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-ThkZXHyOD0RY51mG .grid .tick text{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-ThkZXHyOD0RY51mG .grid path{stroke-width:0;}#mermaid-svg-ThkZXHyOD0RY51mG .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-ThkZXHyOD0RY51mG .task{stroke-width:2;}#mermaid-svg-ThkZXHyOD0RY51mG .taskText{text-anchor:middle;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ThkZXHyOD0RY51mG .taskTextOutsideRight{fill:black;text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ThkZXHyOD0RY51mG .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-ThkZXHyOD0RY51mG .task.clickable{cursor:pointer;}#mermaid-svg-ThkZXHyOD0RY51mG .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-ThkZXHyOD0RY51mG .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-ThkZXHyOD0RY51mG .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-ThkZXHyOD0RY51mG .taskText0,#mermaid-svg-ThkZXHyOD0RY51mG .taskText1,#mermaid-svg-ThkZXHyOD0RY51mG .taskText2,#mermaid-svg-ThkZXHyOD0RY51mG .taskText3{fill:white;}#mermaid-svg-ThkZXHyOD0RY51mG .task0,#mermaid-svg-ThkZXHyOD0RY51mG .task1,#mermaid-svg-ThkZXHyOD0RY51mG .task2,#mermaid-svg-ThkZXHyOD0RY51mG .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-ThkZXHyOD0RY51mG .taskTextOutside0,#mermaid-svg-ThkZXHyOD0RY51mG .taskTextOutside2{fill:black;}#mermaid-svg-ThkZXHyOD0RY51mG .taskTextOutside1,#mermaid-svg-ThkZXHyOD0RY51mG .taskTextOutside3{fill:black;}#mermaid-svg-ThkZXHyOD0RY51mG .active0,#mermaid-svg-ThkZXHyOD0RY51mG .active1,#mermaid-svg-ThkZXHyOD0RY51mG .active2,#mermaid-svg-ThkZXHyOD0RY51mG .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-ThkZXHyOD0RY51mG .activeText0,#mermaid-svg-ThkZXHyOD0RY51mG .activeText1,#mermaid-svg-ThkZXHyOD0RY51mG .activeText2,#mermaid-svg-ThkZXHyOD0RY51mG .activeText3{fill:black!important;}#mermaid-svg-ThkZXHyOD0RY51mG .done0,#mermaid-svg-ThkZXHyOD0RY51mG .done1,#mermaid-svg-ThkZXHyOD0RY51mG .done2,#mermaid-svg-ThkZXHyOD0RY51mG .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-ThkZXHyOD0RY51mG .doneText0,#mermaid-svg-ThkZXHyOD0RY51mG .doneText1,#mermaid-svg-ThkZXHyOD0RY51mG .doneText2,#mermaid-svg-ThkZXHyOD0RY51mG .doneText3{fill:black!important;}#mermaid-svg-ThkZXHyOD0RY51mG .doneText0.taskTextOutsideLeft,#mermaid-svg-ThkZXHyOD0RY51mG .doneText0.taskTextOutsideRight,#mermaid-svg-ThkZXHyOD0RY51mG .doneText1.taskTextOutsideLeft,#mermaid-svg-ThkZXHyOD0RY51mG .doneText1.taskTextOutsideRight,#mermaid-svg-ThkZXHyOD0RY51mG .doneText2.taskTextOutsideLeft,#mermaid-svg-ThkZXHyOD0RY51mG .doneText2.taskTextOutsideRight,#mermaid-svg-ThkZXHyOD0RY51mG .doneText3.taskTextOutsideLeft,#mermaid-svg-ThkZXHyOD0RY51mG .doneText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-ThkZXHyOD0RY51mG .crit0,#mermaid-svg-ThkZXHyOD0RY51mG .crit1,#mermaid-svg-ThkZXHyOD0RY51mG .crit2,#mermaid-svg-ThkZXHyOD0RY51mG .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-ThkZXHyOD0RY51mG .activeCrit0,#mermaid-svg-ThkZXHyOD0RY51mG .activeCrit1,#mermaid-svg-ThkZXHyOD0RY51mG .activeCrit2,#mermaid-svg-ThkZXHyOD0RY51mG .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-ThkZXHyOD0RY51mG .doneCrit0,#mermaid-svg-ThkZXHyOD0RY51mG .doneCrit1,#mermaid-svg-ThkZXHyOD0RY51mG .doneCrit2,#mermaid-svg-ThkZXHyOD0RY51mG .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-ThkZXHyOD0RY51mG .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-ThkZXHyOD0RY51mG .milestoneText{font-style:italic;}#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText0,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText1,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText2,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText3{fill:black!important;}#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText0.taskTextOutsideLeft,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText0.taskTextOutsideRight,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText1.taskTextOutsideLeft,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText1.taskTextOutsideRight,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText2.taskTextOutsideLeft,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText2.taskTextOutsideRight,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText3.taskTextOutsideLeft,#mermaid-svg-ThkZXHyOD0RY51mG .doneCritText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-ThkZXHyOD0RY51mG .vert{stroke:navy;}#mermaid-svg-ThkZXHyOD0RY51mG .vertText{font-size:15px;text-anchor:middle;fill:navy!important;}#mermaid-svg-ThkZXHyOD0RY51mG .activeCritText0,#mermaid-svg-ThkZXHyOD0RY51mG .activeCritText1,#mermaid-svg-ThkZXHyOD0RY51mG .activeCritText2,#mermaid-svg-ThkZXHyOD0RY51mG .activeCritText3{fill:black!important;}#mermaid-svg-ThkZXHyOD0RY51mG .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ThkZXHyOD0RY51mG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 10:00:00 10:01:00 10:02:00 10:03:00 10:04:00 10:05:00 10:06:00 10:07:00 10:08:00 s1 需求分析 s2 代码检索 s3 编码实现 s4 测试编写 s5 代码审查 需求分析检索编码测试审查 优惠券模块任务执行时间线

执行过程中,Orchestrator 持续监控:

  • 每个 Agent 的 token 消耗是否在预算内?
  • 是否有 Agent 长时间无输出?
  • 是否出现 429 或超时?

6.4 反思与优化

任务完成后,Orchestrator 会触发「Plan 复盘」,由 R1 评估整体执行质量:

  • Plan 是否过度复杂?能否合并 Step?
  • Agent 选择是否合理?是否有更合适的 Agent?
  • 预算分配是否过紧或过松?
  • 失败的 Step 根因是什么?

复盘结果写入「经验库」,作为下次相似任务的参考。这是系统能力持续演化的关键。


七、实战案例:从需求到上线

7.1 场景描述

某电商团队希望为现有系统新增优惠券模块,需求来自产品经理的一份 PRD。任务目标包括:

  • 实现满减、折扣、限时三种优惠券类型;
  • 与现有订单系统、用户系统集成;
  • 提供管理后台与 API;
  • 完成单元测试与集成测试。

7.2 Plan 生成

Planner 分析后生成包含 12 个 Step 的 Plan:
#mermaid-svg-lMDw9uLwHeWTYw4j{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lMDw9uLwHeWTYw4j .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lMDw9uLwHeWTYw4j .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lMDw9uLwHeWTYw4j .error-icon{fill:#552222;}#mermaid-svg-lMDw9uLwHeWTYw4j .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lMDw9uLwHeWTYw4j .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lMDw9uLwHeWTYw4j .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lMDw9uLwHeWTYw4j .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lMDw9uLwHeWTYw4j .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lMDw9uLwHeWTYw4j .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lMDw9uLwHeWTYw4j .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lMDw9uLwHeWTYw4j .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lMDw9uLwHeWTYw4j .marker.cross{stroke:#333333;}#mermaid-svg-lMDw9uLwHeWTYw4j svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lMDw9uLwHeWTYw4j p{margin:0;}#mermaid-svg-lMDw9uLwHeWTYw4j .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lMDw9uLwHeWTYw4j .cluster-label text{fill:#333;}#mermaid-svg-lMDw9uLwHeWTYw4j .cluster-label span{color:#333;}#mermaid-svg-lMDw9uLwHeWTYw4j .cluster-label span p{background-color:transparent;}#mermaid-svg-lMDw9uLwHeWTYw4j .label text,#mermaid-svg-lMDw9uLwHeWTYw4j span{fill:#333;color:#333;}#mermaid-svg-lMDw9uLwHeWTYw4j .node rect,#mermaid-svg-lMDw9uLwHeWTYw4j .node circle,#mermaid-svg-lMDw9uLwHeWTYw4j .node ellipse,#mermaid-svg-lMDw9uLwHeWTYw4j .node polygon,#mermaid-svg-lMDw9uLwHeWTYw4j .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lMDw9uLwHeWTYw4j .rough-node .label text,#mermaid-svg-lMDw9uLwHeWTYw4j .node .label text,#mermaid-svg-lMDw9uLwHeWTYw4j .image-shape .label,#mermaid-svg-lMDw9uLwHeWTYw4j .icon-shape .label{text-anchor:middle;}#mermaid-svg-lMDw9uLwHeWTYw4j .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lMDw9uLwHeWTYw4j .rough-node .label,#mermaid-svg-lMDw9uLwHeWTYw4j .node .label,#mermaid-svg-lMDw9uLwHeWTYw4j .image-shape .label,#mermaid-svg-lMDw9uLwHeWTYw4j .icon-shape .label{text-align:center;}#mermaid-svg-lMDw9uLwHeWTYw4j .node.clickable{cursor:pointer;}#mermaid-svg-lMDw9uLwHeWTYw4j .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lMDw9uLwHeWTYw4j .arrowheadPath{fill:#333333;}#mermaid-svg-lMDw9uLwHeWTYw4j .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lMDw9uLwHeWTYw4j .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lMDw9uLwHeWTYw4j .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lMDw9uLwHeWTYw4j .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lMDw9uLwHeWTYw4j .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lMDw9uLwHeWTYw4j .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lMDw9uLwHeWTYw4j .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lMDw9uLwHeWTYw4j .cluster text{fill:#333;}#mermaid-svg-lMDw9uLwHeWTYw4j .cluster span{color:#333;}#mermaid-svg-lMDw9uLwHeWTYw4j div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lMDw9uLwHeWTYw4j .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lMDw9uLwHeWTYw4j rect.text{fill:none;stroke-width:0;}#mermaid-svg-lMDw9uLwHeWTYw4j .icon-shape,#mermaid-svg-lMDw9uLwHeWTYw4j .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lMDw9uLwHeWTYw4j .icon-shape p,#mermaid-svg-lMDw9uLwHeWTYw4j .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lMDw9uLwHeWTYw4j .icon-shape .label rect,#mermaid-svg-lMDw9uLwHeWTYw4j .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lMDw9uLwHeWTYw4j .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lMDw9uLwHeWTYw4j .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lMDw9uLwHeWTYw4j :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 需求澄清
架构设计
数据库设计
API 设计
模型层编码
控制器编码
服务层编码
集成订单系统
集成用户系统
管理后台
单元测试
集成测试
审查

7.3 执行细节

整个任务耗时约 25 分钟,关键执行细节如下:

  • s1 需求澄清:调用 R1,向用户确认三个未明确的边界条件,耗时 90s;
  • s3 数据库设计:Coder Agent 生成 schema,Reviewer Agent 发现缺少索引,触发一次仲裁,由 R1 采纳了 Reviewer 意见;
  • s8 集成订单系统:检索 Agent 从代码库中找到 5 处调用点,Coder Agent 逐一适配;
  • s11 单元测试:Tester Agent 生成 38 个用例,覆盖率 87%,Reviewer 认为关键分支覆盖不足,触发补充生成。

7.4 关键决策点

执行过程中出现三个值得记录的决策:

  1. 是否使用 R1 做需求澄清:成本更高但准确率显著提升,最终选择 R1;
  2. Coder 还是 Coder-V2:依据历史经验库,Coder 在该团队代码风格上匹配度更高;
  3. 是否并行执行 s11 与 s12:考虑到测试用例可能因集成测试发现 bug 而修改,最终选择串行。

7.5 结果与复盘

最终交付物包括:

  • 12 个源文件、4 个测试文件;
  • 38 个单元测试用例、9 个集成测试用例;
  • 一份架构说明文档、一份 API 文档。

复盘发现 Plan 中 s10「管理后台」粒度过大,导致单 Step 执行时间超过 6 分钟,下次应进一步拆分。这一经验被写入经验库。


八、性能优化实践

8.1 上下文压缩

长任务上下文是性能杀手。优化手段包括:

  • 滑动窗口:只保留最近 N 轮对话,更早的由摘要替代;
  • 检索增强:把历史上下文写入向量库,按需检索;
  • 分片摘要:每 K 轮生成一次摘要,避免单次摘要信息过载。

8.2 并发优化

  • 预热:对高概率被调用的 Agent 提前 warm up;
  • 批处理:把多个独立小任务合并成一次模型调用;
  • 缓存:对相同输入的 Step 结果做 LRU 缓存,避免重复计算。

8.3 成本控制

成本控制是中央编排的核心价值之一。常见策略:
#mermaid-svg-6jUfaeoibc8UUZHC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6jUfaeoibc8UUZHC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6jUfaeoibc8UUZHC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6jUfaeoibc8UUZHC .error-icon{fill:#552222;}#mermaid-svg-6jUfaeoibc8UUZHC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6jUfaeoibc8UUZHC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6jUfaeoibc8UUZHC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6jUfaeoibc8UUZHC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6jUfaeoibc8UUZHC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6jUfaeoibc8UUZHC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6jUfaeoibc8UUZHC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6jUfaeoibc8UUZHC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6jUfaeoibc8UUZHC .marker.cross{stroke:#333333;}#mermaid-svg-6jUfaeoibc8UUZHC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6jUfaeoibc8UUZHC p{margin:0;}#mermaid-svg-6jUfaeoibc8UUZHC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-6jUfaeoibc8UUZHC .cluster-label text{fill:#333;}#mermaid-svg-6jUfaeoibc8UUZHC .cluster-label span{color:#333;}#mermaid-svg-6jUfaeoibc8UUZHC .cluster-label span p{background-color:transparent;}#mermaid-svg-6jUfaeoibc8UUZHC .label text,#mermaid-svg-6jUfaeoibc8UUZHC span{fill:#333;color:#333;}#mermaid-svg-6jUfaeoibc8UUZHC .node rect,#mermaid-svg-6jUfaeoibc8UUZHC .node circle,#mermaid-svg-6jUfaeoibc8UUZHC .node ellipse,#mermaid-svg-6jUfaeoibc8UUZHC .node polygon,#mermaid-svg-6jUfaeoibc8UUZHC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6jUfaeoibc8UUZHC .rough-node .label text,#mermaid-svg-6jUfaeoibc8UUZHC .node .label text,#mermaid-svg-6jUfaeoibc8UUZHC .image-shape .label,#mermaid-svg-6jUfaeoibc8UUZHC .icon-shape .label{text-anchor:middle;}#mermaid-svg-6jUfaeoibc8UUZHC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-6jUfaeoibc8UUZHC .rough-node .label,#mermaid-svg-6jUfaeoibc8UUZHC .node .label,#mermaid-svg-6jUfaeoibc8UUZHC .image-shape .label,#mermaid-svg-6jUfaeoibc8UUZHC .icon-shape .label{text-align:center;}#mermaid-svg-6jUfaeoibc8UUZHC .node.clickable{cursor:pointer;}#mermaid-svg-6jUfaeoibc8UUZHC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-6jUfaeoibc8UUZHC .arrowheadPath{fill:#333333;}#mermaid-svg-6jUfaeoibc8UUZHC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6jUfaeoibc8UUZHC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6jUfaeoibc8UUZHC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6jUfaeoibc8UUZHC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-6jUfaeoibc8UUZHC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6jUfaeoibc8UUZHC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-6jUfaeoibc8UUZHC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6jUfaeoibc8UUZHC .cluster text{fill:#333;}#mermaid-svg-6jUfaeoibc8UUZHC .cluster span{color:#333;}#mermaid-svg-6jUfaeoibc8UUZHC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6jUfaeoibc8UUZHC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-6jUfaeoibc8UUZHC rect.text{fill:none;stroke-width:0;}#mermaid-svg-6jUfaeoibc8UUZHC .icon-shape,#mermaid-svg-6jUfaeoibc8UUZHC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6jUfaeoibc8UUZHC .icon-shape p,#mermaid-svg-6jUfaeoibc8UUZHC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-6jUfaeoibc8UUZHC .icon-shape .label rect,#mermaid-svg-6jUfaeoibc8UUZHC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6jUfaeoibc8UUZHC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6jUfaeoibc8UUZHC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6jUfaeoibc8UUZHC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是

新请求
预估成本
预估 < 预算?
正常执行
优化Plan
合并相似Step
降级模型
跳过低价值Step
重新预估

实际项目中,通过成本控制可以把单任务开销降低 30%~50%。

8.4 缓存层设计

Harness 内置三级缓存:

  1. 结果缓存:以 Step 输入哈希为 key,命中直接返回;
  2. Prompt 缓存:相同 system prompt 复用 KV cache,降低首 token 延迟;
  3. 工具结果缓存:如向量检索结果按 query+时间窗缓存。

九、挑战与解决方案

9.1 单点故障

挑战:Orchestrator 崩溃会导致整个任务中断。

解决方案

  • 主备编排器 + 心跳检测;
  • 检查点持久化,备节点可秒级接管;
  • Plan 设计为幂等,重跑不会产生副作用。

9.2 Agent 行为漂移

挑战:长时间运行后,Agent 可能偏离既定角色。

解决方案

  • 每个 Step 完成后强制重置 system prompt;
  • 引入「角色守护」轻量 Agent 监控主 Agent 输出,发现漂移立即告警;
  • 对关键 Step 采用「双 Agent 投票」机制。

9.3 死循环与资源耗尽

挑战:Agent 之间互相调用可能形成死循环,或某 Step 反复重试耗尽预算。

解决方案

  • 每个 Step 设置最大重试次数(默认 3)与超时(默认 120s);
  • Plan 级别设置总预算与总时长上限;
  • 检测到调用链成环时立即终止。

9.4 可观测性

挑战:多 Agent 协作日志分散,难以定位问题。

解决方案:建立统一的 Trace 系统,每次任务分配唯一 trace_id,所有 Agent、Harness、工具调用都携带该 ID。日志结构如下:

json 复制代码
{
  "trace_id": "trace_20260824_001",
  "plan_id": "plan_20260824_001",
  "step_id": "s3",
  "agent": "coder",
  "model": "deepseek-coder",
  "event": "tool_call",
  "tool": "file_write",
  "duration_ms": 230,
  "tokens_in": 1200,
  "tokens_out": 800
}

通过 trace_id 可以串起完整的执行链路,便于排查与复盘。

9.5 安全与权限

挑战:Agent 可能调用危险工具(如删除文件、执行 shell)。

解决方案

  • 工具分级:read-only / write / dangerous;
  • 危险工具调用必须经 Orchestrator 二次确认;
  • Agent 只能访问被授权的目录与资源;
  • 所有敏感操作记录审计日志,支持事后回放。

十、可观测性与可审计性

10.1 三层观测体系

中央编排的可观测性可以分为三层:
#mermaid-svg-DHIdAeOezGDwHxyT{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DHIdAeOezGDwHxyT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DHIdAeOezGDwHxyT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DHIdAeOezGDwHxyT .error-icon{fill:#552222;}#mermaid-svg-DHIdAeOezGDwHxyT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DHIdAeOezGDwHxyT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DHIdAeOezGDwHxyT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DHIdAeOezGDwHxyT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DHIdAeOezGDwHxyT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DHIdAeOezGDwHxyT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DHIdAeOezGDwHxyT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DHIdAeOezGDwHxyT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DHIdAeOezGDwHxyT .marker.cross{stroke:#333333;}#mermaid-svg-DHIdAeOezGDwHxyT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DHIdAeOezGDwHxyT p{margin:0;}#mermaid-svg-DHIdAeOezGDwHxyT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DHIdAeOezGDwHxyT .cluster-label text{fill:#333;}#mermaid-svg-DHIdAeOezGDwHxyT .cluster-label span{color:#333;}#mermaid-svg-DHIdAeOezGDwHxyT .cluster-label span p{background-color:transparent;}#mermaid-svg-DHIdAeOezGDwHxyT .label text,#mermaid-svg-DHIdAeOezGDwHxyT span{fill:#333;color:#333;}#mermaid-svg-DHIdAeOezGDwHxyT .node rect,#mermaid-svg-DHIdAeOezGDwHxyT .node circle,#mermaid-svg-DHIdAeOezGDwHxyT .node ellipse,#mermaid-svg-DHIdAeOezGDwHxyT .node polygon,#mermaid-svg-DHIdAeOezGDwHxyT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DHIdAeOezGDwHxyT .rough-node .label text,#mermaid-svg-DHIdAeOezGDwHxyT .node .label text,#mermaid-svg-DHIdAeOezGDwHxyT .image-shape .label,#mermaid-svg-DHIdAeOezGDwHxyT .icon-shape .label{text-anchor:middle;}#mermaid-svg-DHIdAeOezGDwHxyT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DHIdAeOezGDwHxyT .rough-node .label,#mermaid-svg-DHIdAeOezGDwHxyT .node .label,#mermaid-svg-DHIdAeOezGDwHxyT .image-shape .label,#mermaid-svg-DHIdAeOezGDwHxyT .icon-shape .label{text-align:center;}#mermaid-svg-DHIdAeOezGDwHxyT .node.clickable{cursor:pointer;}#mermaid-svg-DHIdAeOezGDwHxyT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DHIdAeOezGDwHxyT .arrowheadPath{fill:#333333;}#mermaid-svg-DHIdAeOezGDwHxyT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DHIdAeOezGDwHxyT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DHIdAeOezGDwHxyT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DHIdAeOezGDwHxyT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DHIdAeOezGDwHxyT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DHIdAeOezGDwHxyT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DHIdAeOezGDwHxyT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DHIdAeOezGDwHxyT .cluster text{fill:#333;}#mermaid-svg-DHIdAeOezGDwHxyT .cluster span{color:#333;}#mermaid-svg-DHIdAeOezGDwHxyT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DHIdAeOezGDwHxyT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DHIdAeOezGDwHxyT rect.text{fill:none;stroke-width:0;}#mermaid-svg-DHIdAeOezGDwHxyT .icon-shape,#mermaid-svg-DHIdAeOezGDwHxyT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DHIdAeOezGDwHxyT .icon-shape p,#mermaid-svg-DHIdAeOezGDwHxyT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DHIdAeOezGDwHxyT .icon-shape .label rect,#mermaid-svg-DHIdAeOezGDwHxyT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DHIdAeOezGDwHxyT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DHIdAeOezGDwHxyT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DHIdAeOezGDwHxyT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 运行时层
模型 QPS
Token 消耗
工具调用延迟
编排层
Plan 深度/宽度
Step 重试率
冲突仲裁次数
业务层
任务成功率
平均完成时长
成本/任务

业务层关注「任务是否成功完成」,编排层关注「Plan 是否合理」,运行时层关注「底层资源是否健康」。

10.2 关键指标

指标 含义 健康阈值
Plan 完成率 成功完成的 Plan 占比 >95%
Step 重试率 单 Step 平均重试次数 <0.3
平均 Plan 深度 关键路径长度 <8
Token 利用率 有效输出 / 总消耗 >60%
Agent 空闲率 空闲时间 / 总时间 <30%

10.3 审计回放

每次任务完成后,Orchestrator 会输出一份审计包,包含:

  • 完整 Plan 与最终状态;
  • 每个 Step 的输入、输出、工具调用记录;
  • 模型调用明细(含 prompt、completion、token 数);
  • 关键决策点的 Orchestrator 思考过程。

审计包可以用于事后复盘、合规审计、训练数据生成。


十一、与其他方案的对比

11.1 与去中心化协作的对比

维度 中央编排 去中心化协作
可控性
灵活性
调试难度
并发扩展 受 Orchestrator 限制 几乎无上限
成本可控
适用场景 工程化、生产级 探索性、研究型

11.2 与现有框架的对比

  • vs LangGraph:LangGraph 提供图式编排能力,但更偏底层原语;gent Plan x DeepSeek Harness 提供更高层的 Plan 抽象与开箱即用的 Agent。
  • vs AutoGen:AutoGen 强调自由对话,适合研究探索;本方案强调可控、可审计,适合生产落地。
  • vs MetaGPT:MetaGPT 偏向「软件公司」垂直场景;本方案更通用,可适配多种业务领域。

11.3 选型建议

  • 若任务边界清晰、对结果质量要求高、需要可审计 → 中央编排;
  • 若任务开放探索、对灵活性要求高、可接受不确定性 → 去中心化;
  • 若两者兼需 → 混合模式,由 Orchestrator 决定哪些 Step 走中央、哪些走自治。

十二、未来展望

12.1 从静态 Plan 到动态 Plan

当前 Plan 在规划阶段一次性生成,执行中难以调整。未来方向是「动态 Plan」:Orchestrator 根据中间结果实时增删 Step,甚至重写尚未执行的部分。
#mermaid-svg-tJYTVgdDVq7PYlMM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tJYTVgdDVq7PYlMM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tJYTVgdDVq7PYlMM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tJYTVgdDVq7PYlMM .error-icon{fill:#552222;}#mermaid-svg-tJYTVgdDVq7PYlMM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tJYTVgdDVq7PYlMM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tJYTVgdDVq7PYlMM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tJYTVgdDVq7PYlMM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tJYTVgdDVq7PYlMM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tJYTVgdDVq7PYlMM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tJYTVgdDVq7PYlMM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tJYTVgdDVq7PYlMM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tJYTVgdDVq7PYlMM .marker.cross{stroke:#333333;}#mermaid-svg-tJYTVgdDVq7PYlMM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tJYTVgdDVq7PYlMM p{margin:0;}#mermaid-svg-tJYTVgdDVq7PYlMM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tJYTVgdDVq7PYlMM .cluster-label text{fill:#333;}#mermaid-svg-tJYTVgdDVq7PYlMM .cluster-label span{color:#333;}#mermaid-svg-tJYTVgdDVq7PYlMM .cluster-label span p{background-color:transparent;}#mermaid-svg-tJYTVgdDVq7PYlMM .label text,#mermaid-svg-tJYTVgdDVq7PYlMM span{fill:#333;color:#333;}#mermaid-svg-tJYTVgdDVq7PYlMM .node rect,#mermaid-svg-tJYTVgdDVq7PYlMM .node circle,#mermaid-svg-tJYTVgdDVq7PYlMM .node ellipse,#mermaid-svg-tJYTVgdDVq7PYlMM .node polygon,#mermaid-svg-tJYTVgdDVq7PYlMM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tJYTVgdDVq7PYlMM .rough-node .label text,#mermaid-svg-tJYTVgdDVq7PYlMM .node .label text,#mermaid-svg-tJYTVgdDVq7PYlMM .image-shape .label,#mermaid-svg-tJYTVgdDVq7PYlMM .icon-shape .label{text-anchor:middle;}#mermaid-svg-tJYTVgdDVq7PYlMM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tJYTVgdDVq7PYlMM .rough-node .label,#mermaid-svg-tJYTVgdDVq7PYlMM .node .label,#mermaid-svg-tJYTVgdDVq7PYlMM .image-shape .label,#mermaid-svg-tJYTVgdDVq7PYlMM .icon-shape .label{text-align:center;}#mermaid-svg-tJYTVgdDVq7PYlMM .node.clickable{cursor:pointer;}#mermaid-svg-tJYTVgdDVq7PYlMM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tJYTVgdDVq7PYlMM .arrowheadPath{fill:#333333;}#mermaid-svg-tJYTVgdDVq7PYlMM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tJYTVgdDVq7PYlMM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tJYTVgdDVq7PYlMM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tJYTVgdDVq7PYlMM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tJYTVgdDVq7PYlMM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tJYTVgdDVq7PYlMM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tJYTVgdDVq7PYlMM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tJYTVgdDVq7PYlMM .cluster text{fill:#333;}#mermaid-svg-tJYTVgdDVq7PYlMM .cluster span{color:#333;}#mermaid-svg-tJYTVgdDVq7PYlMM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tJYTVgdDVq7PYlMM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tJYTVgdDVq7PYlMM rect.text{fill:none;stroke-width:0;}#mermaid-svg-tJYTVgdDVq7PYlMM .icon-shape,#mermaid-svg-tJYTVgdDVq7PYlMM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tJYTVgdDVq7PYlMM .icon-shape p,#mermaid-svg-tJYTVgdDVq7PYlMM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tJYTVgdDVq7PYlMM .icon-shape .label rect,#mermaid-svg-tJYTVgdDVq7PYlMM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tJYTVgdDVq7PYlMM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tJYTVgdDVq7PYlMM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tJYTVgdDVq7PYlMM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是

观察执行结果
评估Plan合理性
需要调整?
重写未执行Step
继续执行

12.2 Agent 自演化

通过经验库的持续积累,Agent 能力可以自演化:

  • 基于历史成功 Plan 微调 system prompt;
  • 基于失败案例补充工具与边界条件;
  • 基于用户反馈调整 Agent 评分权重。

12.3 跨 Orchestrator 协作

当单 Orchestrator 无法覆盖超大规模任务时,可以引入「Orchestrator of Orchestrators」结构,多个中央编排器再协作,形成分层联邦。这本质上是「中央 + 分布式」的混合范式。

12.4 与 MCP 等开放协议融合

Model Context Protocol(MCP)等开放协议正在标准化模型与工具的交互方式。未来 Harness 将原生支持 MCP,让 Agent 可以无缝接入第三方工具生态,进一步降低集成成本。

12.5 长程记忆与个性化

当前 Agent 记忆多为任务级,未来将引入跨任务的「长程记忆」,让 Agent 记住用户偏好、项目约定、历史决策。这需要解决记忆压缩、检索效率、隐私合规等新问题。


十三、最佳实践清单

基于上述实践,总结一份可落地的最佳实践清单,供读者参考。

13.1 Plan 设计

  • 单 Plan 的 Step 数量建议控制在 5~15 之间,过多则拆分为子 Plan;
  • 关键路径长度建议不超过 8,过长则考虑并行化;
  • 每个 Step 必须有明确的输入、输出与成功标准;
  • 为可失败 Step 设计降级路径。

13.2 Agent 设计

  • 单 Agent 职责单一,避免「全能 Agent」;
  • system prompt 简洁明确,包含角色、约束、输出格式;
  • 工具集最小化,只暴露必要能力;
  • 为每个 Agent 设计健康检查机制。

13.3 模型选择

  • 规划、审查、仲裁用 R1;
  • 编码用 Coder;
  • 轻量任务用 V3-Lite;
  • 复杂对话用 V3;
  • 定期评估新模型,及时切换。

13.4 成本管理

  • 设置任务级预算上限;
  • 对每个 Step 预估 token 消耗;
  • 监控实际 vs 预算偏差,超 20% 告警;
  • 定期清理缓存与历史上下文。

13.5 可观测性

  • 全链路 trace_id 贯穿;
  • 关键指标建立 dashboard 与告警;
  • 每次任务产出审计包;
  • 每周复盘失败 Plan,沉淀经验。

13.6 安全合规

  • 工具分级授权;
  • 敏感操作二次确认;
  • 完整审计日志;
  • 定期安全扫描 Agent 输出。

十四、总结

多 Agent 协作是 LLM 应用走向生产的必经之路,而中央编排则是让协作「可控、可审计、可成本化」的关键范式。本文以 gent Plan x DeepSeek Harness 为载体,系统梳理了中央编排的架构设计、核心实现、模型集成、协作流程、实战案例、性能优化、挑战应对与未来展望。

核心观点可以归纳为五条:

  1. 中央编排的本质是「让一组 Agent 像乐队一样协同演奏」,Orchestrator 是指挥,Agent 是乐手,Plan 是乐谱。
  2. Plan 优先是降本增效的关键:先规划后执行,避免盲目并发带来的资源浪费与结果冲突。
  3. DeepSeek Harness 提供执行底座:模型路由、上下文管理、工具调用、流式输出共同构成了可靠的运行时。
  4. 可观测性与可审计性是生产化的门槛:没有完整 trace 与审计包的协作系统,无法在真实业务中落地。
  5. 未来属于「动态 + 自演化 + 联邦」的混合范式:静态 Plan 是起点,动态调整与 Agent 自演化是终点。

中央编排并非万能药,它在灵活性上逊于去中心化协作,在扩展性上受限于 Orchestrator 能力。但在「工程化、生产级、可交付」这一诉求下,它仍然是目前最务实的选择。gent Plan 与 DeepSeek Harness 的结合,正是这一选择在工具层面的具体体现。

希望本文的实践梳理,能为正在探索多 Agent 协作落地的团队提供一份可参考的工程地图。在 LLM 能力持续跃迁的当下,编排范式本身也会持续演化,但「让协作可控、让结果可信」这一核心诉求不会改变。


附录:关键流程速查

A.1 一次任务的完整生命周期

#mermaid-svg-ZVMYJdi0Lh8cFmgk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .error-icon{fill:#552222;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .marker.cross{stroke:#333333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZVMYJdi0Lh8cFmgk p{margin:0;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .cluster-label text{fill:#333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .cluster-label span{color:#333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .cluster-label span p{background-color:transparent;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .label text,#mermaid-svg-ZVMYJdi0Lh8cFmgk span{fill:#333;color:#333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .node rect,#mermaid-svg-ZVMYJdi0Lh8cFmgk .node circle,#mermaid-svg-ZVMYJdi0Lh8cFmgk .node ellipse,#mermaid-svg-ZVMYJdi0Lh8cFmgk .node polygon,#mermaid-svg-ZVMYJdi0Lh8cFmgk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .rough-node .label text,#mermaid-svg-ZVMYJdi0Lh8cFmgk .node .label text,#mermaid-svg-ZVMYJdi0Lh8cFmgk .image-shape .label,#mermaid-svg-ZVMYJdi0Lh8cFmgk .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .rough-node .label,#mermaid-svg-ZVMYJdi0Lh8cFmgk .node .label,#mermaid-svg-ZVMYJdi0Lh8cFmgk .image-shape .label,#mermaid-svg-ZVMYJdi0Lh8cFmgk .icon-shape .label{text-align:center;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .node.clickable{cursor:pointer;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .arrowheadPath{fill:#333333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZVMYJdi0Lh8cFmgk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZVMYJdi0Lh8cFmgk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZVMYJdi0Lh8cFmgk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .cluster text{fill:#333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .cluster span{color:#333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZVMYJdi0Lh8cFmgk rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .icon-shape,#mermaid-svg-ZVMYJdi0Lh8cFmgk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .icon-shape p,#mermaid-svg-ZVMYJdi0Lh8cFmgk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .icon-shape .label rect,#mermaid-svg-ZVMYJdi0Lh8cFmgk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZVMYJdi0Lh8cFmgk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZVMYJdi0Lh8cFmgk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZVMYJdi0Lh8cFmgk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否

用户提交任务
Orchestrator 接收
Planner 生成 Plan
Plan 持久化
Scheduler 调度
Agent 执行
Harness 模型调用
工具调用
结果汇聚
Plan 完成?
复盘与经验沉淀
输出结果与审计包
结束

A.2 故障恢复流程

#mermaid-svg-7ZPGv1ItEpnmTB5p{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7ZPGv1ItEpnmTB5p .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7ZPGv1ItEpnmTB5p .error-icon{fill:#552222;}#mermaid-svg-7ZPGv1ItEpnmTB5p .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7ZPGv1ItEpnmTB5p .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7ZPGv1ItEpnmTB5p .marker.cross{stroke:#333333;}#mermaid-svg-7ZPGv1ItEpnmTB5p svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7ZPGv1ItEpnmTB5p p{margin:0;}#mermaid-svg-7ZPGv1ItEpnmTB5p .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7ZPGv1ItEpnmTB5p .cluster-label text{fill:#333;}#mermaid-svg-7ZPGv1ItEpnmTB5p .cluster-label span{color:#333;}#mermaid-svg-7ZPGv1ItEpnmTB5p .cluster-label span p{background-color:transparent;}#mermaid-svg-7ZPGv1ItEpnmTB5p .label text,#mermaid-svg-7ZPGv1ItEpnmTB5p span{fill:#333;color:#333;}#mermaid-svg-7ZPGv1ItEpnmTB5p .node rect,#mermaid-svg-7ZPGv1ItEpnmTB5p .node circle,#mermaid-svg-7ZPGv1ItEpnmTB5p .node ellipse,#mermaid-svg-7ZPGv1ItEpnmTB5p .node polygon,#mermaid-svg-7ZPGv1ItEpnmTB5p .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7ZPGv1ItEpnmTB5p .rough-node .label text,#mermaid-svg-7ZPGv1ItEpnmTB5p .node .label text,#mermaid-svg-7ZPGv1ItEpnmTB5p .image-shape .label,#mermaid-svg-7ZPGv1ItEpnmTB5p .icon-shape .label{text-anchor:middle;}#mermaid-svg-7ZPGv1ItEpnmTB5p .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7ZPGv1ItEpnmTB5p .rough-node .label,#mermaid-svg-7ZPGv1ItEpnmTB5p .node .label,#mermaid-svg-7ZPGv1ItEpnmTB5p .image-shape .label,#mermaid-svg-7ZPGv1ItEpnmTB5p .icon-shape .label{text-align:center;}#mermaid-svg-7ZPGv1ItEpnmTB5p .node.clickable{cursor:pointer;}#mermaid-svg-7ZPGv1ItEpnmTB5p .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7ZPGv1ItEpnmTB5p .arrowheadPath{fill:#333333;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7ZPGv1ItEpnmTB5p .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7ZPGv1ItEpnmTB5p .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7ZPGv1ItEpnmTB5p .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7ZPGv1ItEpnmTB5p .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7ZPGv1ItEpnmTB5p .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7ZPGv1ItEpnmTB5p .cluster text{fill:#333;}#mermaid-svg-7ZPGv1ItEpnmTB5p .cluster span{color:#333;}#mermaid-svg-7ZPGv1ItEpnmTB5p div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7ZPGv1ItEpnmTB5p .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7ZPGv1ItEpnmTB5p rect.text{fill:none;stroke-width:0;}#mermaid-svg-7ZPGv1ItEpnmTB5p .icon-shape,#mermaid-svg-7ZPGv1ItEpnmTB5p .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7ZPGv1ItEpnmTB5p .icon-shape p,#mermaid-svg-7ZPGv1ItEpnmTB5p .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7ZPGv1ItEpnmTB5p .icon-shape .label rect,#mermaid-svg-7ZPGv1ItEpnmTB5p .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7ZPGv1ItEpnmTB5p .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7ZPGv1ItEpnmTB5p .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7ZPGv1ItEpnmTB5p :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是



检测到故障
编排器存活?
本地重试
备编排器接管
重试成功?
加载检查点
恢复未完成 Step
继续
降级或终止

A.3 Agent 评分公式

Agent 综合得分(用于 Step 分配):

复制代码
score = w1 * capability_match
      + w2 * historical_success_rate
      - w3 * current_load
      + w4 * cost_efficiency

推荐权重:w1=0.4, w2=0.3, w3=0.2, w4=0.1,可根据项目实际调整。

A.4 常见配置参数

参数 推荐值 说明
最大并发 Step 8 受模型 QPS 限制
单 Step 超时 120s 防止死循环
单 Step 最大重试 3 平衡成本与成功率
任务级预算上限 200K tokens 按业务调整
检查点间隔 10s 长任务必备
缓存 TTL 24h 兼顾新鲜度与命中率

全文完。

本文围绕 gent Plan x DeepSeek Harness 这一组合,从概念到实现、从架构到案例、从优化到展望,完整呈现了多 Agent 协作场景下中央编排的工程实践。文中所有 Mermaid 图均可直接渲染,方便读者快速理解整体结构与关键流程。希望这份实践梳理能为你的多 Agent 系统设计提供有价值的参考。

相关推荐
cczixun1 小时前
2026 智能体平台落地实战:从 POC 验证到生产上线,避开选型与交付陷阱
人工智能·落地·选型·智能体·2026
IT_陈寒1 小时前
Redis内存警告竟是因为这个不起眼的配置项
前端·人工智能·后端
CHY_1281 小时前
VSO.ai 系列(二):AI验证回归优化实战
人工智能·synopsys·vso.ai·验证加速
2401_890095612 小时前
武汉人工智能应用软件开发实施异常怎么排查?模拟环境与验证步骤
人工智能·案例复盘·武汉自动意志科技·智钳claw·企业ai智能体·ai漫剧生成
泰迪智能科技012 小时前
三种人社职业技能等级证书报考指南对比:人工智能训练师 / 计算机程序设计员 / 服务机器人应用技术员
人工智能·百度·机器人
森山冶仁2 小时前
AI 原生数据治理技术栈:大模型 + 向量库 + 知识图谱怎么选
人工智能·知识图谱·数据治理
记忆张量MemTensor2 小时前
产品更新|MemOS 现已支持 DeepSeek Harness 长期记忆接入
人工智能·typescript·开源·agent
FII工业富联科技服务2 小时前
WRC 2026技术拆解:从人类示范到真机反馈,机器人“大脑”如何完成训练闭环?
人工智能·机器人·自动化·制造
科里 Coralyx2 小时前
RLHF、InstructGPT、红队测试:从“会生成“到“可交付“
人工智能