为什么需要 Agent 编排

单个 Agent 能力有限。复杂任务需要多个 Agent 协作:一个负责检索、一个负责分析、一个负责生成报告。如何编排这些 Agent 是生产环境的核心问题。

编排模式分类

模式结构适用场景复杂度
串行A -> B -> C流水线任务
并行A,B,C -> 合并独立子任务
循环A -> B -> 判断 -> (A 或 结束)迭代优化
路由Input -> Router -> [A/B/C]分类分发
监督者Supervisor -> [A,B,C]中心调度
分层Top Supervisor -> Sub-Supervisors -> Workers大规模团队
图式DAG/状态机复杂工作流

1. Router Pattern

一个路由 Agent 根据输入决定调用哪个专家 Agent:

from typing import Literal
from pydantic import BaseModel

class RouteDecision(BaseModel):
    next_agent: Literal["coder", "researcher", "writer"]
    reason: str

async def router_agent(query: str) -> RouteDecision:
    prompt = f"""分析用户请求,决定由哪个 Agent 处理:
- coder: 编程/代码/技术实现
- researcher: 调研/搜索/信息收集
- writer: 写作/总结/翻译

用户请求: {query}"""
    
    resp = await llm.beta.chat.completions.parse(
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}],
        response_format=RouteDecision
    )
    return resp.choices[0].message.parsed

async def routed_pipeline(query: str):
    decision = await router_agent(query)
    agents = {"coder": coder_agent, "researcher": researcher_agent, "writer": writer_agent}
    agent = agents[decision.next_agent]
    return await agent(query)

2. Supervisor Pattern

Supervisor 管理多个 Worker Agent,决定调用顺序、判断是否完成:

class Supervisor:
    def __init__(self, workers: dict, llm, max_steps=10):
        self.workers = workers
        self.llm = llm
        self.max_steps = max_steps
    
    async def run(self, task: str) -> str:
        context = {"task": task, "history": [], "results": {}}
        for step in range(self.max_steps):
            decision = await self._plan(context)
            if decision["action"] == "FINISH":
                return decision.get("final_answer", "")
            if decision["action"] == "CALL_WORKER":
                worker = self.workers[decision["worker_name"]]
                result = await worker(decision["task_for_worker"])
                context["history"].append({
                    "worker": decision["worker_name"],
                    "input": decision["task_for_worker"],
                    "output": result
                })
                context["results"][decision["worker_name"]] = result
        return "Max steps reached"
    
    async def _plan(self, context) -> dict:
        prompt = f"""你是任务监督者。根据当前状态决定下一步。
任务: {context['task']}
已执行步骤: {context['history']}
可选动作: CALL_WORKER 或 FINISH
输出 JSON: {{"action": "...", "worker_name": "...", "task_for_worker": "...", "final_answer": "..."}}"""
        resp = await self.llm.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": prompt}],
            temperature=0,
            response_format={"type": "json_object"}
        )
        return json.loads(resp.choices[0].message.content)

3. 并行编排

多个 Agent 同时工作,结果合并:

import asyncio

async def parallel_orchestration(query: str):
    tasks = [
        search_web(query),
        search_knowledge_base(query),
        analyze_query_intent(query)
    ]
    web_results, kb_results, intent = await asyncio.gather(*tasks)
    final_answer = await merge_agent(
        query=query, web=web_results, kb=kb_results, intent=intent
    )
    return final_answer

4. 循环迭代模式

Agent 输出经过审查,不合格则重新执行:

class IterativeRefiner:
    async def run(self, task: str, max_iter: int = 3):
        result = await generator_agent(task)
        for i in range(max_iter):
            review = await reviewer_agent(task, result)
            if review.score >= 0.8:
                return result
            result = await generator_agent(
                f"{task}\n\n审查意见: {review.feedback}\n请改进。"
            )
        return result

5. 层次化编排

大规模 Agent 系统需要分层管理:

              Top Supervisor
             /              \
      Sub-Supervisor A    Sub-Supervisor B
      /        \              /        \
  Agent1   Agent2        Agent3    Agent4
class HierarchicalOrchestrator:
    def __init__(self):
        self.sub_a = Supervisor("research-team")
        self.sub_b = Supervisor("writing-team")
        self.sub_a.workers = {"searcher": searcher_agent, "analyzer": analyzer_agent}
        self.sub_b.workers = {"drafter": drafter_agent, "editor": editor_agent}
        self.top = Supervisor("top")
        self.top.workers = {
            "research-team": self.sub_a.run,
            "writing-team": self.sub_b.run
        }
    
    async def execute(self, task: str):
        return await self.top.run(task)

6. 图式编排(LangGraph)

用状态机定义复杂工作流:

from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator

class AgentState(TypedDict):
    query: str
    docs: list
    answer: str
    quality_score: float
    messages: Annotated[list, operator.add]

def retrieve_node(state: AgentState) -> AgentState:
    docs = vector_search(state["query"])
    return {"docs": docs, "messages": ["retrieved"]}

def generate_node(state: AgentState) -> AgentState:
    answer = llm_generate(state["query"], state["docs"])
    return {"answer": answer, "messages": ["generated"]}

def evaluate_node(state: AgentState) -> AgentState:
    score = evaluate_answer(state["answer"], state["query"])
    return {"quality_score": score, "messages": ["evaluated"]}

def should_retry(state: AgentState) -> str:
    if state["quality_score"] < 0.7:
        return "retrieve"
    return END

graph = StateGraph(AgentState)
graph.add_node("retrieve", retrieve_node)
graph.add_node("generate", generate_node)
graph.add_node("evaluate", evaluate_node)
graph.set_entry_point("retrieve")
graph.add_edge("retrieve", "generate")
graph.add_edge("generate", "evaluate")
graph.add_conditional_edges("evaluate", should_retry)

app = graph.compile()
result = app.invoke({"query": "什么是 RAG?", "docs": [], "answer": "",
                      "quality_score": 0, "messages": []})

选型建议

场景推荐模式理由
固定流水线串行简单可靠
独立子任务并行性能最优
分类分发Router清晰解耦
中心调度Supervisor灵活可控
大规模系统层次化可扩展
复杂工作流图式(LangGraph)表达力强

实战建议

  • 从简单开始:先用串行模式跑通,再根据瓶颈优化
  • 控制 Agent 数量:超过 5 个 Agent 时协调成本急剧上升,考虑分层
  • 超时与降级:每个 Agent 设置超时,超时后用降级策略(返回缓存或默认值)
  • 可观测性:编排系统必须有完整 trace,否则出问题完全无法定位
  • 成本控制:Supervisor 用小模型(GPT-4o-mini),Worker 按任务复杂度选模型—

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。