工作流编排:Agent的神经系统

单个Agent的能力有限。复杂任务需要多个Agent协作——有人负责搜索,有人负责推理,有人负责验证。工作流编排就是定义这些Agent如何协作的"神经系统"。

编排模式演进

模式一:静态DAG(有向无环图)

最简单的编排方式——预定义执行流程:

[收集信息] → [分析数据] → [生成报告] → [审核质量]

优点:

  • 确定性强,易于调试
  • 执行可预测
  • 性能好(可并行优化不依赖的节点)

局限:

  • 无法处理动态决策(发现需要额外搜索时无法回溯)
  • 流程僵化,不适配多变场景

模式二:条件分支DAG

在DAG基础上加入条件判断:

[收集信息] → [信息充分?]
              ├─ 是 → [分析数据]
              └─ 否 → [补充搜索] → [分析数据]

优点:

  • 支持基本决策逻辑
  • 仍保持可预测性

局限:

  • 分支数有限时有效
  • 复杂决策导致图过于复杂

模式三:状态机

状态机允许循环和回退:

状态: {current_step, context, results}

转移规则:
  collecting → (if enough info) → analyzing
  collecting → (if not enough) → collecting
  analyzing  → (if clear) → generating
  analyzing  → (if need more data) → collecting
  generating → (if quality ok) → done
  generating → (if quality low) → analyzing

优点:

  • 支持循环和重试
  • 状态可持久化
  • 更接近真实工作流

局限:

  • 状态爆炸风险
  • 仍需预定义转移规则

模式四:自适应流程

让LLM决定下一步做什么:

循环:
  当前状态 = {任务, 已完成步骤, 可用工具, 结果}
  下一步 = LLM(当前状态, 可选步骤列表)
  执行下一步
  更新状态
  如果完成 → 退出

优点:

  • 最大灵活性
  • 可处理未预料的情况

局限:

  • 不可预测
  • 难以调试
  • 可能进入无限循环
  • Token消耗大

实践架构

混合编排:分层设计

实践中最有效的是混合架构——高层用DAG保证可控性,低层用自适应流程处理细节:

[Phase 1: 信息收集] (DAG, 可并行)
  ├── Agent A: 搜索网页
  ├── Agent B: 查询数据库
  └── Agent C: 读取文件
  
[Phase 2: 分析推理] (自适应)
  └── LLM Agent:
      - 根据收集的信息自主分析
      - 如果发现信息缺口,可回退到Phase 1
      - 多轮推理直到得出结论

[Phase 3: 结果验证] (DAG)
  ├── 验证Agent: 检查事实性
  └── 格式Agent: 确保格式正确

[Phase 4: 输出] (固定)
  └── 生成最终报告

实现方案

class Workflow:
    def __init__(self):
        self.phases = []
        self.state = {}
    
    def add_phase(self, name, executor, condition=None):
        self.phases.append({
            'name': name,
            'executor': executor,
            'condition': condition
        })
    
    async def run(self, input_data):
        self.state = {'input': input_data, 'results': {}}
        
        for i, phase in enumerate(self.phases):
            # 检查条件
            if phase['condition'] and not phase['condition'](self.state):
                continue
            
            # 执行
            result = await phase['executor'](self.state)
            self.state['results'][phase['name']] = result
            
            # 自适应:允许LLM决定是否回退
            if result.get('retry'):
                # 回退到指定phase
                i = self.find_phase(result['retry_to']) - 1
        
        return self.state

并发控制

Agent并发

多个Agent并行执行可以大幅提升速度:

# 并行执行独立任务
tasks = [
    search_agent.search("AI芯片市场"),
    data_agent.query("chip_revenue"),
    doc_agent.read("market_report.pdf")
]
results = await asyncio.gather(*tasks)

资源限制

并发需要控制资源使用:

  • LLM API并发:避免触发rate limit
  • 工具调用并发:外部API有调用频率限制
  • 内存:每个Agent的上下文占内存

DAG到执行图

将DAG转换为可执行的并发计划:

DAG:
  A → C
  B → C
  B → D

并行执行计划:
  Step 1: [A, B] (并行)
  Step 2: [C, D] (B完成后,C和D可并行如果D不依赖C)

错误处理

重试策略

@retry(max_attempts=3, backoff=exponential)
async def call_agent(agent, input):
    result = await agent.run(input)
    if result.error:
        raise AgentError(result.error)
    return result

降级策略

  • Agent失败 → 使用更简单的Prompt重试
  • 工具不可用 → 使用替代工具
  • LLM超时 → 使用更快的模型(如从GPT-4降级到GPT-3.5)
  • 所有重试失败 → 跳过该步骤,在结果中标注缺失

Checkpoint机制

长流程需要checkpoint:

# 每完成一个phase后保存状态
await self.save_checkpoint(self.state)

# 恢复时从最近checkpoint开始
state = await self.load_checkpoint()
workflow.resume_from(state)

可观测性

日志记录

[2026-07-16 10:00:01] Phase: information_collection
[2026-07-16 10:00:01] Agent: web_search, Query: "AI芯片2025"
[2026-07-16 10:00:03] Agent: web_search, Results: 5 items
[2026-07-16 10:00:03] Agent: db_query, Query: "chip_revenue"
[2026-07-16 10:00:05] Agent: db_query, Results: 12 rows
[2026-07-16 10:00:05] Phase: information_collection, Status: complete

追踪

使用OpenTelemetry追踪Agent执行:

  • 每个Agent调用记录为span
  • 标记输入、输出、耗时、token数
  • 可视化执行DAG

评估指标

  • 端到端成功率:任务最终成功比例
  • 平均步数:完成任务需要的平均步骤数
  • 平均耗时:端到端延迟
  • 成本:每任务平均token消耗
  • 重试率:需要重试的步骤比例

总结

Agent工作流编排正在从"写死流程"走向"自适应流程"。但完全自适应的Agent在实际生产中仍不够可靠。最务实的方案是混合编排——在关键路径上用DAG保证可控性,在细节执行上给Agent自主决策空间。编排的核心不是"怎么自动执行",而是"怎么在出错时优雅地处理"。