多Agent系统编排详解:从架构设计到代码实现

对前篇# 多Agent系统的编排:架构、协议与企业级应用 - 掘金更深入的解读


一、从"单兵作战"到"集团军"的质变

传统的单Agent就像一个全能型员工,什么都能做,但什么都做不精。当任务复杂到一定程度,单Agent的局限性就暴露出来:

  • 上下文窗口溢出:处理长文档时,中间信息被"遗忘"
  • 专业能力瓶颈:既要是代码专家,又要是法律顾问,还要是财务分析师
  • 无法并行:一个任务没完成,其他任务只能等待

多Agent编排的核心思想是:分而治之。将复杂任务拆解为多个子任务,交给不同的专业Agent并行处理,最后汇总结果。

java 复制代码
传统单Agent模式:
用户请求 ──► [一个Agent处理所有逻辑] ──► 响应
                    ↑
              上下文窗口压力
              专业能力不足
              无法并行处理

多Agent编排模式:
用户请求 ──► 编排层 ──┬──► Agent A (数据提取) ──► 并行
                      ├──► Agent B (风险评估) ──► 并行
                      ├──► Agent C (合规审查) ──► 并行
                      └──► Agent D (结果汇总) ◄──┘
                              ↑
                    各自专注细分领域
                    共享上下文
                    状态管理

二、编排层的核心组件详解

2.1 编排层的四大职能单元

编排层不是简单的"任务分发器",它是一个复杂的状态机,包含四个核心组件:

python 复制代码
class OrchestrationLayer:
    """
    编排层的核心组件
    """

    def __init__(self):
        # 1. 规划单元 (Planning Unit)
        #    负责任务分解:将高层目标拆解为可执行的子任务
        self.planner = PlanningUnit()

        # 2. 策略单元 (Policy Unit)
        #    负责约束定义:领域规则、治理要求、合规边界
        self.policy_engine = PolicyUnit()

        # 3. 执行控制单元 (Execution & Control Unit)
        #    负责任务调度:并发管理、依赖处理、状态流转
        self.controller = ExecutionController()

        # 4. 质量运营单元 (Quality & Operations Unit)
        #    负责结果验证:Schema校验、异常检测、性能监控
        self.quality_monitor = QualityOperationsUnit()

        # 5. 状态管理单元 (State Management)
        #    负责持久化:检查点、进度跟踪、回滚支持
        self.state_manager = StateManager()

        # 6. 知识管理单元 (Knowledge Management)
        #    负责上下文:外部数据源连接、检索接口
        self.knowledge_base = KnowledgeUnit()

2.2 任务分发的艺术:Planning Unit

Planning Unit是编排层的"大脑",它决定"做什么"和"先做什么"。

python 复制代码
class PlanningUnit:
    """
    规划单元:目标分解与任务排序
    """

    def decompose_goal(self, high_level_goal: str, context: dict) -> TaskGraph:
        """
        将高层目标分解为任务图

        Args:
            high_level_goal: "评估贷款申请人的信用风险"
            context: {"applicant_id": "xxx", "loan_type": "mortgage"}

        Returns:
            TaskGraph: 带有依赖关系的有向无环图(DAG)
        """

        # 任务分解策略
        task_templates = {
            "credit_application": [
                {"task_id": "T1", "name": "提取申请人数据", "agent_type": "worker",
                 "depends_on": [], "output_schema": "ApplicantData"},
                {"task_id": "T2", "name": "计算信用评分", "agent_type": "worker",
                 "depends_on": ["T1"], "output_schema": "CreditScore"},
                {"task_id": "T3", "name": "欺诈检测", "agent_type": "worker",
                 "depends_on": ["T1"], "output_schema": "FraudIndicators"},
                {"task_id": "T4", "name": "合规审查", "agent_type": "service",
                 "depends_on": ["T1", "T2", "T3"], "output_schema": "ComplianceReport"},
                {"task_id": "T5", "name": "风险评估汇总", "agent_type": "worker",
                 "depends_on": ["T2", "T3", "T4"], "output_schema": "RiskAssessment"},
            ]
        }

        # 根据上下文选择任务模板
        template = self._select_template(high_level_goal, context)
        task_graph = self._build_task_graph(template, context)

        return task_graph

    def _build_task_graph(self, template: list, context: dict) -> TaskGraph:
        """构建任务依赖图"""
        graph = TaskGraph()

        for task_spec in template:
            # 解析依赖关系
            dependencies = []
            for dep_task_id in task_spec.get("depends_on", []):
                dependencies.append(graph.get_task(dep_task_id))

            # 创建任务节点
            task = Task(
                id=task_spec["task_id"],
                name=task_spec["name"],
                agent_type=task_spec["agent_type"],
                dependencies=dependencies,
                output_schema=task_spec["output_schema"],
                context=context
            )
            graph.add_task(task)

        # 计算拓扑排序,确定执行顺序
        graph.topological_sort()

        return graph

2.3 策略执行:Policy Unit的约束引擎

Policy Unit定义了"怎么做",它嵌入了领域知识和治理规则。

python 复制代码
class PolicyUnit:
    """
    策略单元:领域约束与治理规则
    """

    def __init__(self):
        # 规则库:领域特定的业务规则
        self.rule_engine = RuleEngine()

        # 合规检查器:监管要求的强制执行
        self.compliance_checker = ComplianceChecker()

    def get_execution_constraints(self, task: Task, context: dict) -> Constraints:
        """
        获取任务执行时的约束条件

        Returns:
            Constraints: 包含访问权限、数据范围、超时限制等
        """

        constraints = Constraints()

        # 1. 数据访问策略
        constraints.data_access_policy = {
            "allowed_fields": ["credit_score", "payment_history", "debt_ratio"],
            "restricted_fields": ["ssn", "medical_history"],  # 需要额外授权
            "masking_rules": {
                "account_number": "last_4_digits_only",
                "income": "range_buckets"  # 精确收入 → 收入区间
            }
        }

        # 2. 业务规则
        constraints.business_rules = self.rule_engine.get_applicable_rules(
            task=task,
            context=context
        )

        # 3. 合规要求
        constraints.compliance_requirements = self.compliance_checker.get_requirements(
            domain="banking",
            operation="credit_assessment"
        )

        # 4. 执行限制
        constraints.max_retries = 3
        constraints.timeout_seconds = 30
        constraints.requires_human_approval = context.get("high_value_transaction", False)

        return constraints

    def validate_output(self, task: Task, output: dict) -> ValidationResult:
        """
        验证Agent输出是否符合策略要求
        """
        violations = []

        # Schema验证
        schema_valid = self._validate_schema(output, task.output_schema)
        if not schema_valid:
            violations.append("Schema validation failed")

        # 业务规则验证
        rule_violations = self.rule_engine.check(output, task.business_rules)
        violations.extend(rule_violations)

        # 合规验证
        compliance_violations = self.compliance_checker.verify(output)
        violations.extend(compliance_violations)

        return ValidationResult(
            passed=len(violations) == 0,
            violations=violations
        )

三、执行控制:任务调度的核心逻辑

3.1 Execution Controller的状态机

每个任务在执行过程中会经历多种状态:

python 复制代码
from enum import Enum
from typing import Optional
import asyncio

class TaskState(Enum):
    PENDING = "pending"           # 等待调度
    WAITING_DEPS = "waiting"      # 等待依赖完成
    RUNNING = "running"           # 执行中
    VALIDATING = "validating"     # 验证中
    COMPLETED = "completed"       # 完成
    FAILED = "failed"            # 失败
    RETRYING = "retrying"        # 重试中

class ExecutionController:
    """
    执行控制器:管理任务的完整生命周期
    """

    def __init__(self, max_concurrency: int = 5):
        # 并发控制器:限制同时运行的任务数
        self.semaphore = asyncio.Semaphore(max_concurrency)

        # 任务队列:按优先级排序
        self.task_queue = PriorityQueue()

        # 运行中的任务
        self.running_tasks: dict[str, Task] = {}

        # 任务状态存储
        self.task_states: dict[str, TaskState] = {}

        # 结果缓存
        self.task_results: dict[str, Any] = {}

    async def execute_task_graph(self, task_graph: TaskGraph) -> dict:
        """
        执行完整任务图
        """
        self.task_graph = task_graph

        # 1. 初始化所有任务状态
        for task in task_graph.tasks:
            self.task_states[task.id] = TaskState.PENDING

        # 2. 启动执行循环
        execution_loop = asyncio.create_task(self._execution_loop())

        # 3. 等待所有任务完成或失败
        while not self._all_tasks_final():
            await asyncio.sleep(0.1)

        await execution_loop

        # 4. 汇总结果
        return self._aggregate_results(task_graph)

    async def _execution_loop(self):
        """
        主执行循环:持续调度可执行的任务
        """
        while not self._all_tasks_final():
            # 找出所有可以执行的任务(依赖已满足)
            ready_tasks = self._get_ready_tasks()

            for task in ready_tasks:
                # 并发控制
                asyncio.create_task(self._execute_task_with_semaphore(task))

            await asyncio.sleep(0.05)  # 避免CPU空转

    def _get_ready_tasks(self) -> list[Task]:
        """
        获取所有依赖已满足、可以执行的任务
        """
        ready = []

        for task in self.task_graph.tasks:
            if self.task_states[task.id] != TaskState.PENDING:
                continue

            # 检查所有依赖是否完成
            deps_completed = all(
                self.task_states[dep.id] == TaskState.COMPLETED
                for dep in task.dependencies
            )

            if deps_completed:
                ready.append(task)

        return ready

    async def _execute_task_with_semaphore(self, task: Task):
        """
        使用信号量控制并发执行
        """
        async with self.semaphore:
            await self.execute_single_task(task)

    async def execute_single_task(self, task: Task) -> Any:
        """
        执行单个任务
        """
        try:
            # 状态: PENDING -> WAITING_DEPS -> RUNNING
            self.task_states[task.id] = TaskState.RUNNING
            self.running_tasks[task.id] = task

            # 获取执行的Agent
            agent = self._get_agent_for_task(task)

            # 获取依赖任务的结果
            dep_results = {
                dep.id: self.task_results[dep.id]
                for dep in task.dependencies
            }

            # 构建执行上下文
            execution_context = self._build_context(task, dep_results)

            # 执行任务
            result = await agent.execute(execution_context)

            # 状态: RUNNING -> VALIDATING
            self.task_states[task.id] = TaskState.VALIDATING

            # 验证结果
            validation_result = await self._validate_task_result(task, result)

            if validation_result.passed:
                self.task_states[task.id] = TaskState.COMPLETED
                self.task_results[task.id] = result
            else:
                await self._handle_task_failure(task, validation_result.violations)

        except Exception as e:
            await self._handle_task_failure(task, [str(e)])

        finally:
            self.running_tasks.pop(task.id, None)

    async def _validate_task_result(self, task: Task, result: Any) -> ValidationResult:
        """
        验证任务结果:Schema + 策略
        """
        # Schema验证
        schema_valid = self._validate_schema(result, task.output_schema)

        if not schema_valid:
            return ValidationResult(passed=False, violations=["Schema mismatch"])

        # 策略验证
        policy_result = self.policy_engine.validate_output(task, result)

        return policy_result

    async def _handle_task_failure(self, task: Task, violations: list):
        """
        处理任务失败:重试 or 标记失败
        """
        if task.retry_count < task.max_retries:
            task.retry_count += 1
            self.task_states[task.id] = TaskState.RETRYING

            # 指数退避
            await asyncio.sleep(2 ** task.retry_count)

            # 重新调度
            self.task_states[task.id] = TaskState.PENDING
        else:
            self.task_states[task.id] = TaskState.FAILED
            self.task_results[task.id] = TaskFailure(
                task_id=task.id,
                violations=violations
            )

3.2 并发执行与依赖管理

多Agent的核心优势之一是并行处理。看这个例子:

python 复制代码
# 任务依赖关系:
# T1 (数据提取) ─┬─> T2 (信用评分)
#               └─> T3 (欺诈检测)
#                    │
#                    └─> T4 (合规审查) <── T2 (信用评分)
#                              │
#                              └─> T5 (风险汇总)

# 执行时间线 (并行优化后):
#
# Time ──────────────────────────────────────────────────────►
#
# T1: ████████████ (2s)
#
# T2:              ████████████████ (3s)
#
# T3:              ██████████ (2s)
#                        │
#                        └─ T4 等待 T3 完成
# T4:                            ██████████ (2s)
#                                       │
#                                       └─ T5 等待 T2, T3, T4
# T5:                                        ████████████ (2s)
#
# 总耗时: 2 + 3 + 2 + 2 = 9s (而非串行的 11s)

# 如果再增加一个并行分支:
# T6 (收入验证) 与 T1 并行
#
# T6: ████████████ (2s)
#      └──────────────────────────> T5 等待 T6
#
# 优化后总耗时: max(2,2+3+2+2) = 9s (不变,但更均衡)

四、Agent协作协议:MCP与A2A

4.1 MCP (Model Context Protocol):Agent与工具的桥梁

MCP定义了Agent如何与外部工具、数据源交互。它的设计遵循客户端-服务器模式

python 复制代码
# MCP客户端:Agent端
class MCPToolClient:
    """
    MCP客户端 - Agent使用它来调用外部工具
    """

    def __init__(self, server_endpoint: str, auth_token: str):
        self.endpoint = server_endpoint
        self.auth_token = auth_token
        self.session_id = None

    async def connect(self):
        """建立MCP会话"""
        response = await self._request("POST", "/sessions", {
            "client_id": "agent_001",
            "capabilities": ["tools", "resources", "prompts"]
        })
        self.session_id = response["session_id"]
        return self.session_id

    async def call_tool(self, tool_name: str, parameters: dict) -> Any:
        """
        调用远程工具

        MCP会自动处理:
        1. Schema验证 - 确保参数格式正确
        2. 访问控制 - 检查Agent是否有权限调用此工具
        3. 审计日志 - 记录所有调用
        4. 结果缓存 - 避免重复调用
        """

        # 从工具注册表获取工具元数据
        tool_meta = await self._get_tool_metadata(tool_name)

        # MCP强制执行约束
        constrained_params = self._apply_constraints(
            parameters,
            tool_meta["constraints"]
        )

        # 调用工具服务器
        result = await self._request("POST", f"/tools/{tool_name}/call", {
            "session_id": self.session_id,
            "parameters": constrained_params,
            "tool_call_id": self._generate_call_id()
        })

        return result["data"]

    def _apply_constraints(self, params: dict, constraints: dict) -> dict:
        """
        MCP约束执行:数据脱敏、字段限制等
        """
        # 字段级访问控制
        allowed = set(constraints.get("allowed_fields", params.keys()))
        filtered = {k: v for k, v in params.items() if k in allowed}

        # 数据脱敏
        for field, rule in constraints.get("masking_rules", {}).items():
            if field in filtered:
                filtered[field] = self._mask_data(field, filtered[field], rule)

        return filtered


# MCP服务器:工具提供者
class MCPToolServer:
    """
    MCP服务器 - 对外提供工具服务
    """

    def __init__(self):
        self.tools = {}  # 工具注册表
        self.access_policies = {}  # 访问策略

    def register_tool(self, name: str, handler: callable, schema: dict, constraints: dict):
        """注册一个工具"""
        self.tools[name] = {
            "handler": handler,
            "input_schema": schema,
            "constraints": constraints
        }

    async def handle_call(self, tool_name: str, params: dict, context: dict) -> Any:
        """处理工具调用请求"""

        # 1. Schema验证
        if not self._validate_input(tool_name, params):
            raise MCPSchemaError("Input validation failed")

        # 2. 访问控制检查
        if not self._check_access(context):
            raise MCPAccessDenied(f"No access to tool: {tool_name}")

        # 3. 执行工具
        tool = self.tools[tool_name]
        result = await tool["handler"](params, context)

        # 4. 结果审计
        self._audit_call(tool_name, params, result, context)

        return result

4.2 A2A (Agent-to-Agent) Protocol:Agent间的对等协作

A2A让Agent之间可以直接通信,协商任务、分享结果:

python 复制代码
class A2AProtocol:
    """
    Agent-to-Agent通信协议
    """

    def __init__(self, agent_id: str):
        self.agent_id = agent_id
        self.message_queue = asyncio.Queue()
        self.peers: dict[str, 'A2AProtocol'] = {}

    async def send_message(self, target_agent: str, message: A2AMessage) -> Any:
        """
        发送消息给另一个Agent
        """
        # 构建A2A消息格式
        a2a_message = {
            "message_id": self._generate_message_id(),
            "sender": self.agent_id,
            "recipient": target_agent,
            "message_type": message.type,
            "payload": message.payload,
            "metadata": {
                "timestamp": self._current_timestamp(),
                "conversation_id": message.conversation_id,
                "reply_to": message.reply_to
            },
            "security": {
                "signature": self._sign_message(message),
                "cert": self._get_agent_certificate()
            }
        }

        # 路由到目标Agent
        if target_agent in self.peers:
            # 直接点对点通信
            return await self.peers[target_agent].receive_message(a2a_message)
        else:
            # 通过编排器中转
            return await self._relay_via_orchestrator(a2a_message)

    async def receive_message(self, message: dict) -> Any:
        """
        接收来自其他Agent的消息
        """
        # 验证消息签名
        if not self._verify_signature(message):
            raise A2ASecurityError("Invalid message signature")

        # 消息处理
        handler = self._get_handler(message["message_type"])
        response_payload = await handler(message["payload"], message["metadata"])

        # 发送响应
        if message["metadata"].get("reply_to"):
            await self.send_message(
                target_agent=message["sender"],
                message=A2AMessage(
                    type="response",
                    payload=response_payload,
                    conversation_id=message["metadata"]["conversation_id"],
                    reply_to=message["message_id"]
                )
            )

        return response_payload


class A2AMessage:
    """A2A消息类型"""

    # 任务委托
    TASK_DELEGATION = "task_delegation"
    # 结果共享
    RESULT_SHARING = "result_sharing"
    # 协商
    NEGOTIATION = "negotiation"
    # 诊断信息
    DIAGNOSTIC = "diagnostic"
    # 状态更新
    STATUS_UPDATE = "status_update"


# Agent间协作示例
class CollaborativeAgentsExample:
    """
    展示Agent如何通过A2A协作
    """

    async def credit_assessment_workflow(self):
        """
        信用评估工作流中的Agent协作
        """

        # 创建Agent
        data_extractor = Agent("data_extractor", capabilities=["ocr", "document_parsing"])
        fraud_detector = Agent("fraud_detector", capabilities=["pattern_recognition"])
        compliance_reviewer = Agent("compliance_reviewer", capabilities=["rule_evaluation"])
        risk_assessor = Agent("risk_assessor", capabilities=["risk_scoring"])

        # 建立A2A连接
        await data_extractor.a2a.connect_peer(fraud_detector)
        await data_extractor.a2a.connect_peer(compliance_reviewer)
        await fraud_detector.a2a.connect_peer(compliance_reviewer)
        await compliance_reviewer.a2a.connect_peer(risk_assessor)

        # ===== 协作流程 =====

        # 1. Data Extractor 完成数据提取,共享结果
        extracted_data = await data_extractor.execute(data_source="loan_application.pdf")

        await data_extractor.a2a.send_message(
            target_agent="fraud_detector",
            message=A2AMessage(
                type=A2AMessage.RESULT_SHARING,
                payload={"applicant_data": extracted_data},
                conversation_id="assessment_001"
            )
        )

        await data_extractor.a2a.send_message(
            target_agent="compliance_reviewer",
            message=A2AMessage(
                type=A2AMessage.RESULT_SHARING,
                payload={"applicant_data": extracted_data},
                conversation_id="assessment_001"
            )
        )

        # 2. Fraud Detector 和 Compliance Reviewer 并行工作
        fraud_analysis = await fraud_detector.execute(data=extracted_data)
        compliance_review = await compliance_reviewer.execute(data=extracted_data)

        # 3. Fraud Detector 发现可疑模式,主动通知 Compliance Reviewer
        if fraud_analysis["suspicious_patterns"]:
            await fraud_detector.a2a.send_message(
                target_agent="compliance_reviewer",
                message=A2AMessage(
                    type=A2AMessage.DIAGNOSTIC,
                    payload={
                        "warning": "Fraud indicators found",
                        "details": fraud_analysis["suspicious_patterns"]
                    },
                    conversation_id="assessment_001"
                )
            )

        # 4. Risk Assessor 等待所有上游结果,汇总评估
        final_risk = await risk_assessor.execute(
            credit_data=extracted_data,
            fraud_report=fraud_analysis,
            compliance_report=compliance_review
        )

        return final_risk

五、状态管理与知识管理

5.1 State Manager:任务状态的守护者

python 复制代码
class StateManager:
    """
    状态管理器:维护任务执行状态,支持检查点和回滚
    """

    def __init__(self, storage_backend: "StorageBackend"):
        self.storage = storage_backend
        self.checkpoint_interval = 5  # 每5个任务保存一次检查点

    async def save_checkpoint(self, workflow_id: str, state: WorkflowState):
        """保存工作流检查点"""
        checkpoint = {
            "workflow_id": workflow_id,
            "timestamp": self._current_timestamp(),
            "tasks": {},
            "results": {},
            "metadata": {}
        }

        for task_id, task_state in state.tasks.items():
            checkpoint["tasks"][task_id] = {
                "status": task_state.status,
                "retry_count": task_state.retry_count,
                "progress": task_state.progress
            }

        checkpoint["results"] = state.completed_results

        await self.storage.save(f"checkpoint/{workflow_id}", checkpoint)

    async def restore_checkpoint(self, workflow_id: str) -> WorkflowState:
        """从检查点恢复工作流"""
        checkpoint = await self.storage.load(f"checkpoint/{workflow_id}")

        return WorkflowState(
            workflow_id=workflow_id,
            tasks=checkpoint["tasks"],
            completed_results=checkpoint["results"]
        )

    async def update_task_state(self, workflow_id: str, task_id: str, updates: dict):
        """原子性更新任务状态"""
        # 使用乐观锁确保一致性
        current = await self.storage.get(f"state/{workflow_id}/tasks/{task_id}")

        if current["version"] != updates.get("expected_version"):
            raise ConcurrentModificationError()

        await self.storage.atomic_update(
            f"state/{workflow_id}/tasks/{task_id}",
            {
                **updates,
                "version": current["version"] + 1,
                "last_modified": self._current_timestamp()
            }
        )


class KnowledgeUnit:
    """
    知识单元:管理上下文和领域知识
    """

    def __init__(self):
        self.vector_store = None  # 向量数据库
        self.external_apis = {}     # 外部数据源API

    async def retrieve_relevant_context(
        self,
        query: str,
        task_type: str,
        max_results: int = 5
    ) -> list[ContextItem]:
        """
        根据任务类型检索相关上下文
        """

        # 向量相似度搜索
        results = await self.vector_store.similarity_search(
            query=query,
            filter={"task_types": task_type},
            top_k=max_results
        )

        # 补充外部数据
        if task_type == "credit_assessment":
            # 调用征信API
            credit_data = await self._fetch_credit_bureau_data(query)
            results.append(ContextItem(
                source="external_credit_bureau",
                content=credit_data,
                relevance_score=0.95
            ))

        return results

    async def refresh_knowledge(self, domain: str):
        """刷新领域知识(定时任务)"""
        if domain == "banking_regulations":
            # 从监管机构获取最新法规
            new_regs = await self._fetch_regulatory_updates()
            await self.vector_store.upsert(new_regs)

六、完整编排流程代码示例

python 复制代码
import asyncio
from typing import Any

class OrchestratedMultiAgentSystem:
    """
    完整的编排式多Agent系统
    """

    def __init__(self, config: SystemConfig):
        # 初始化编排层组件
        self.orchestration = OrchestrationLayer()

        # 初始化Agent注册表
        self.agent_registry = AgentRegistry()

        # 初始化协议处理器
        self.mcp_client = MCPToolClient(
            server_endpoint=config.mcp_server,
            auth_token=config.auth_token
        )
        self.a2a_protocol = A2AProtocol(agent_id=config.system_id)

        # 初始化存储
        self.state_manager = StateManager(config.storage)

    async def process_request(self, user_request: str) -> dict[str, Any]:
        """
        处理用户请求的完整流程
        """

        # ===== 阶段1: 请求理解与任务分解 =====
        planning_result = self.orchestration.planner.decompose_goal(
            high_level_goal=user_request,
            context={"user_id": "current_user", "timestamp": self._now()}
        )

        task_graph = planning_result["task_graph"]

        # ===== 阶段2: 为每个任务分配Agent =====
        for task in task_graph.tasks:
            # 根据Agent类型和能力选择合适的Agent
            agent = self.agent_registry.get_agent(
                agent_type=task.agent_type,
                capabilities=task.required_capabilities
            )
            task.assigned_agent = agent

            # 获取执行约束
            task.constraints = self.orchestration.policy_engine.get_execution_constraints(
                task=task,
                context=planning_result["context"]
            )

        # ===== 阶段3: 执行任务图 =====
        execution_result = await self.orchestration.controller.execute_task_graph(task_graph)

        # ===== 阶段4: 结果聚合与验证 =====
        final_result = await self._aggregate_and_validate(execution_result, task_graph)

        return final_result


# 使用示例
async def main():
    config = SystemConfig(
        mcp_server="https://mcp.internal.tools",
        auth_token="your-auth-token",
        storage=PostgresStorage(...)
    )

    system = OrchestratedMultiAgentSystem(config)

    result = await system.process_request(
        "评估贷款申请人张三的信用风险,需要包括欺诈检测和合规审查"
    )

    print(f"评估结果: {result['risk_score']}")
    print(f"风险等级: {result['risk_level']}")
    print(f"合规状态: {result['compliance_status']}")


if __name__ == "__main__":
    asyncio.run(main())

七、编排策略:何时并行,何时串行

css 复制代码
┌─────────────────────────────────────────────────────────────────┐
│                    任务依赖关系决策树                              │
└─────────────────────────────────────────────────────────────────┘

                        ┌─────────────────┐
                        │  任务A 和 任务B  │
                        │  能否并行?      │
                        └────────┬────────┘
                                 │
                    ┌────────────┴────────────┐
                    │                         │
                   是                          否
                    │                         │
                    ▼                         ▼
        ┌───────────────────┐     ┌───────────────────┐
        │  A 的输出是 B 的   │     │  A 和 B 共享      │
        │  输入?            │     │  关键资源?       │
        └────────┬──────────┘     └────────┬──────────┘
                 │                          │
        ┌────────┴────────┐        ┌────────┴────────┐
        │                 │        │                 │
       是                 否       是                 否
        │                 │        │                 │
        ▼                 ▼        ▼                 ▼
   ┌─────────┐    ┌──────────┐ ┌─────────┐   ┌──────────┐
   │ 必须串行 │    │ 可以并行  │ │ 需要锁  │   │ 可以并行  │
   │ 等待 A   │    │           │ │ 协调    │   │           │
   │ 完成     │    │           │ │         │   │           │
   └─────────┘    └───────────┘ └─────────┘   └───────────┘


实际案例 - 贷款评估:

   任务                   依赖关系           策略
   ──────────────────────────────────────────────────────
   T1. 数据提取           无                并行 (多个数据源)
   T2. 信用评分           依赖T1            等待T1后串行
   T3. 欺诈检测           依赖T1            与T2并行 (独立分支)
   T4. 收入验证           无                与T1并行 (不同数据源)
   T5. 合规审查           依赖T2,T3,T4      等待所有上游完成
   T6. 风险汇总           依赖T5            等待T5后串行

   执行时间计算:
   - 串行: T1 + T2 + T3 + T4 + T5 + T6 = 2+3+2+2+2+1 = 12s
   - 优化并行: max(T1,T4) + T2 + T3 + T5 + T6 = 2 + 3 + 2 + 2 + 1 = 10s

八、总结:编排的本质

多Agent编排的核心可以归纳为三点:

1. 分工 (Division of Labor)

将复杂任务分解为专业化的子任务,交给专门化的Agent处理。

2. 协调 (Coordination)

通过编排层统一调度,处理依赖关系、并发控制、状态同步。

3. 整合 (Integration)

通过MCP/A2A等协议,确保Agent间的有效通信和结果聚合。

编排层就像乐队的指挥,不是演奏乐器,而是确保每个乐手在正确的时机演奏正确的部分,最终呈现一首完整的交响乐。


相关推荐
米小虾1 小时前
多Agent系统的编排:架构、协议与企业级应用
人工智能·agent
To_OC11 小时前
搞懂 Token 和 Embedding 后,我终于明白大模型是怎么 "读" 文字的
人工智能·llm·agent
冬奇Lab13 小时前
每日一个开源项目(第139篇):Voicebox - 本地运行的开源 ElevenLabs 替代品
人工智能·开源·资讯
冬奇Lab13 小时前
Skill 系列(03):Skill 设计范式——5 个模式让输出从混沌到可预测
人工智能·开源·agent
IT_陈寒15 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
星始流年17 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
凌奕17 小时前
让你的 AI 编程助手「偷懒」:50k Star 的 Ponytail,让 Agent 少写一半代码
chatgpt·agent·claude
大模型真好玩17 小时前
什么是Loop Engineering?最通俗易懂的Loop Engineering核心概念
人工智能·agent·deepseek