从零搭建多Agent协同系统:Google ADK 框架实战

简介: 本文介绍如何用Google ADK框架+阿里云AgentRun,从零搭建多Agent协同系统:将复杂任务拆解为专业Agent(如VibeCoder生成代码、CodeReviewer审查),通过A2A协议实现标准化协作与调度,兼顾工程性与易部署性。(239字)

当你只有一个 AI 助手时,它是个工具。当你有多个 AI 助手相互协作时,你就有了一支团队。本文带你用 Google ADK 框架 + 阿里云 AgentRun,从零搭建一个多 Agent 协同系统。


为什么要多 Agent?

单 Agent 的局限性越来越明显。一个典型的场景:你让一个 Agent 同时完成"搜索资料 → 分析数据 → 写报告 → 画图表",它往往顾此失彼。context window 被塞满,推理链条过长导致幻觉频发,一个环节出错整条链路崩溃。

多 Agent 协同的核心思想很简单:把复杂任务拆给多个专业 Agent,就像公司里有研发、测试、运维的分工。

Google 2025 年推出的 Agent Development Kit (ADK)A2A 协议(Agent-to-Agent Protocol),正是为了解决这个问题——定义了一套多 Agent 之间如何发现彼此、如何通信、如何协作的标准。


A2A 协议的核心概念

A2A 协议的核心抽象是三个角色:

┌─────────────┐    发现/调用     ┌─────────────┐
│  Client     │ ──────────────→ │  Remote     │
│  Agent      │ ←────────────── │  Agent      │
└─────────────┘    返回结果      └─────────────┘
  • Client Agent:发起调用的一方,类似"项目经理"
  • Remote Agent:被调用的一方,类似"专业执行者"
  • Agent Card:每个 Agent 的能力声明卡片(JSON 格式),类似"简历"

当你注册一个 Remote Agent 时,它会暴露一张 Agent Card,描述自己能做什么、需要什么参数、输出什么。Client Agent 读取这些 Card,按需调度。

这不就是微服务的 Agent 版本吗?确实如此。A2A 把微服务架构中"服务发现、RPC 调用、负载均衡"的思想搬到了 Agent 世界。


实战:搭建一个"氛围编程 + 代码审查"双 Agent 系统

场景设计

我们搭建两个 Agent:

Agent 角色 能力
VibeCoder 氛围编程专家 根据需求描述直接生成代码
CodeReviewer 代码审查专家 审查代码质量、安全性、性能

工作流:用户提需求 → VibeCoder 生成代码 → CodeReviewer 审查 → 返回最终结果

Step 1:定义 Agent Card

每个 Agent 需要一张能力声明卡片:

# vibe_coder_card.py
agent_card = {
   
    "name": "VibeCoder",
    "description": "氛围编程专家,根据自然语言需求生成代码",
    "url": "https://your-agent-domain.com/vibecoder",
    "capabilities": {
   
        "streaming": True,
        "pushNotifications": False
    },
    "skills": [
        {
   
            "id": "generate_code",
            "name": "代码生成",
            "description": "根据需求描述生成前端/后端代码",
            "inputSchema": {
   
                "type": "object",
                "properties": {
   
                    "requirement": {
   "type": "string", "description": "需求描述"},
                    "language": {
   "type": "string", "enum": ["python", "javascript", "typescript"]},
                    "framework": {
   "type": "string", "description": "目标框架"}
                },
                "required": ["requirement", "language"]
            }
        }
    ]
}
# code_reviewer_card.py
agent_card = {
   
    "name": "CodeReviewer",
    "description": "代码审查专家,检查代码质量和安全性",
    "url": "https://your-agent-domain.com/codereviewer",
    "capabilities": {
   
        "streaming": True,
        "pushNotifications": False
    },
    "skills": [
        {
   
            "id": "review_code",
            "name": "代码审查",
            "description": "审查代码并给出改进建议",
            "inputSchema": {
   
                "type": "object",
                "properties": {
   
                    "code": {
   "type": "string", "description": "待审查的代码"},
                    "language": {
   "type": "string"},
                    "focus_areas": {
   
                        "type": "array",
                        "items": {
   "enum": ["security", "performance", "readability", "architecture"]}
                    }
                },
                "required": ["code", "language"]
            }
        }
    ]
}

Step 2:实现 Agent 核心逻辑

# agent_core.py
from google.adk.agents import LlmAgent
from google.adk.tools import built_in_tools
from google.adk.sessions import SessionService

class VibeCoderAgent:
    """氛围编程 Agent"""

    def __init__(self):
        self.agent = LlmAgent(
            name="VibeCoder",
            model="qwen-plus",  # 通义千问
            instruction="""
            你是一个专业的代码生成助手。请遵循以下原则:
            1. 生成完整可运行的代码
            2. 包含必要的注释和文档
            3. 遵循目标语言的最佳实践
            4. 输出时标注语言和文件名
            """,
            tools=[built_in_tools.code_executor]
        )

    async def generate(self, requirement: str, language: str, framework: str = None) -> dict:
        prompt = f"""
        需求:{requirement}
        语言:{language}
        框架:{framework or '无'}

        请生成完整代码,包括:
        - 项目结构说明
        - 核心代码文件
        - 依赖配置
        - 运行说明
        """
        response = await self.agent.run(prompt)
        return {
   
            "agent": "VibeCoder",
            "code": response.text,
            "language": language
        }

class CodeReviewerAgent:
    """代码审查 Agent"""

    def __init__(self):
        self.agent = LlmAgent(
            name="CodeReviewer",
            model="qwen-plus",
            instruction="""
            你是一个严格的代码审查员。请从以下维度审查代码:
            1. 安全性:是否存在注入、密钥泄露等风险
            2. 性能:是否有明显的性能瓶颈
            3. 可读性:命名、结构是否清晰
            4. 架构:设计是否合理

            使用评分制(1-10),并给出改进建议。
            """,
            tools=[built_in_tools.code_executor]
        )

    async def review(self, code: str, language: str, focus_areas: list = None) -> dict:
        areas = focus_areas or ["security", "performance", "readability", "architecture"]
        prompt = f"""
        请审查以下 {
   language} 代码,重点关注:{
   ', '.join(areas)}

        ```{
   language}
        {
   code}
    请按维度给出评分和改进建议。
    """
    response = await self.agent.run(prompt)
    return {
        "agent": "CodeReviewer",
        "review": response.text
    }

### Step 3:编排协同流程

```python
# orchestrator.py
import asyncio

class MultiAgentOrchestrator:
    """多 Agent 协同编排器"""

    def __init__(self):
        self.vibe_coder = VibeCoderAgent()
        self.code_reviewer = CodeReviewerAgent()

    async def execute(self, requirement: str, language: str, framework: str = None):
        print(f"[Orchestrator] 接收需求:{requirement}")

        # 阶段1:生成代码
        print("[Orchestrator] → 调度 VibeCoder 生成代码...")
        code_result = await self.vibe_coder.generate(requirement, language, framework)
        print(f"[Orchestrator] ✓ 代码生成完成 ({len(code_result['code'])} 字符)")

        # 阶段2:审查代码
        print("[Orchestrator] → 调度 CodeReviewer 审查代码...")
        review_result = await self.code_reviewer.review(
            code_result['code'], 
            language,
            ["security", "performance", "readability"]
        )
        print("[Orchestrator] ✓ 代码审查完成")

        # 阶段3:整合结果
        return {
            "requirement": requirement,
            "code": code_result["code"],
            "review": review_result["review"],
            "summary": self._summarize(review_result["review"])
        }

    def _summarize(self, review_text: str) -> str:
        # 提取评分和关键建议
        return review_text[:500]  # 简化版摘要

# 使用示例
async def main():
    orchestrator = MultiAgentOrchestrator()
    result = await orchestrator.execute(
        requirement="创建一个 FastAPI 接口,接受用户查询并返回数据库搜索结果",
        language="python",
        framework="fastapi"
    )
    print(f"\n=== 最终结果 ===\n{result['code']}\n\n=== 审查意见 ===\n{result['review']}")

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

部署到生产:为什么选择 Serverless Agent 平台?

到这里你可能会问:写了这么多代码,部署在哪?自己搭服务吗?

自己部署会遇到一个很现实的问题:Agent 是长时运行任务,不像普通 API 请求几百毫秒就能返回。一个多 Agent 协同流程可能要跑几分钟甚至更久。用传统服务器部署,你需要处理:

  • 长连接管理(WebSocket / SSE)
  • 并发任务调度(同时跑 10 个 Agent 流程怎么办)
  • GPU 资源弹性(推理时用 GPU,空闲时别浪费钱)

这就是为什么我选择了 阿里云 AgentRun(函数计算 FC + 百炼的 Agent 平台):

  • Serverless 免运维:不用管服务器,Agent 跑在函数计算上
  • GPU 弹性伸缩:推理时自动分配 GPU 算力,空闲时缩到 0
  • 内置模型接入:直接用百炼的通义千问等大模型,不用自己搭模型服务
  • API 集成:部署完直接拿 API 凭证,在业务代码里调用

把上面的代码部署到 AgentRun 上,只需要三步:

  1. 在 AgentRun 控制台选择"Google ADK 多 Agent 协同"模板
  2. 上传上面写的 Agent Card 和核心代码
  3. 点击部署,拿 API 端点

不需要配服务器,不需要装 CUDA,不需要写 Kubernetes YAML。


多 Agent 协同的最佳实践

在实际项目中踩过一些坑,分享几条经验:

1. Agent 粒度要适中。别拆太细——一个 Agent 只做一件事(比如"验证邮箱格式"),调用开销会很高。也别太粗——一个 Agent 包揽所有事,就失去了协同的意义。参考标准:一个 Agent 的职责能用一句话说清楚,且无需内部多步骤决策。

2. 错误处理要分级。Agent A 调用 Agent B 失败了怎么办?建议三层兜底:

  • L1:重试(幂等任务)
  • L2:降级(用规则引擎代替)
  • L3:透传失败信息给用户

3. 监控多 Agent 的"端到端延迟"。单 Agent 的延迟可能是 2 秒,但经过 3 个 Agent 串行调用就变成 6 秒。用 AgentRun 的链路追踪,可以清楚看到每个 Agent 的耗时分布。

4. A2A 协议的 Agent Card 要写得诚实。别夸大能力——Agent Card 是"服务契约",夸大了会导致 Client Agent 做出错误调度决策。


总结

多 Agent 协同不是噱头,是解决复杂任务工程的必然方向。Google ADK + A2A 协议提供了一个标准化的框架,而 Serverless Agent 平台(如阿里云 AgentRun)解决了部署和运维的难题。

如果你也想试试,可以从官方的"氛围编程专家"模板开始——这是一个基于 ADK 的多 Agent 协同 Demo,展示了上面说的完整流程。

本文中的示例代码已经内置在 阿里云 AgentRun 的 Google ADK 模板 中,可以直接免费体验:点击跳转到免费体验地址


相关文章
|
8天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
3010 7
|
11天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
3102 20
|
23天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23568 15
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
4天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
1987 3
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
|
10天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
2503 3
|
9天前
|
人工智能 安全 开发工具
Claude Code 官方工作原理与使用指南
Claude Code 不是传统代码补全工具,而是 Anthropic 推出的终端 AI 代理,具备代理循环、双驱动架构(模型+工具)、全局项目感知、6 种权限模式等核心能力,本文基于官方文档系统解析其工作原理与高效使用技巧。
1369 0
|
9天前
|
存储 Linux iOS开发
【2026最新】MarkText中文版Markdown编辑器使用图解(附安装包)
MarkText是一款免费开源、跨平台的Markdown编辑器,主打所见即所得实时预览,支持Windows/macOS/Linux。内置数学公式、流程图、代码高亮、多主题及PDF/HTML导出,是Typora的轻量免费替代首选。(239字)

热门文章

最新文章