This commit is contained in:
Nelson
2026-04-06 12:36:04 +08:00
commit 514723dbe7
23 changed files with 7529 additions and 0 deletions

View File

@@ -0,0 +1,275 @@
"""
Google ADK 多智能体系统完整示例
展示各种多 Agent 协作模式
对应教程第05章 - 多智能体系统
"""
# 导入 ADK 核心模块
from google.adk.agents import ( # 导入所有 Agent 类型
Agent, # LLM Agent别名
LlmAgent, # LLM Agent完整名
SequentialAgent, # 顺序工作流
ParallelAgent, # 并行工作流
LoopAgent, # 循环工作流
BaseAgent, # 基础 Agent自定义用
)
from google.adk.events import Event, EventActions # 导入事件类型
from google.adk.agents.invocation_context import InvocationContext # 导入上下文
from typing import AsyncGenerator # 导入异步生成器
# ========================================
# 模式一:协调器/调度器模式
# ========================================
# 定义专门的子 Agent
math_agent = LlmAgent(
name="MathExpert", # 数学专家
model="gemini-2.0-flash", # 模型
description="擅长数学计算和统计分析。", # 描述
instruction="你是数学专家,解决数学问题。给出详细的计算过程。", # 指令
)
writing_agent = LlmAgent(
name="WritingExpert", # 写作专家
model="gemini-2.0-flash", # 模型
description="擅长文案撰写和内容创作。", # 描述
instruction="你是写作专家,帮助用户撰写高质量的内容。", # 指令
)
coding_agent = LlmAgent(
name="CodingExpert", # 编程专家
model="gemini-2.0-flash", # 模型
description="擅长编程和代码调试。", # 描述
instruction="你是编程专家,帮助用户解决编程问题。提供带注释的代码。", # 指令
)
# 定义协调器
coordinator = LlmAgent(
name="Coordinator", # 协调器
model="gemini-2.0-flash", # 模型
description="根据问题类型分配给合适的专家。", # 描述
instruction=( # 指令
"你是一个任务协调器。\n"
"根据用户的问题类型,将任务分配给合适的专家:\n"
"- 数学相关 → MathExpert\n"
"- 写作相关 → WritingExpert\n"
"- 编程相关 → CodingExpert\n"
"使用 transfer_to_agent 工具进行任务分配。"
),
sub_agents=[math_agent, writing_agent, coding_agent], # 注册子 Agent
)
# ========================================
# 模式二:顺序流水线模式
# ========================================
# 步骤一:信息提取
extractor = LlmAgent(
name="Extractor", # 信息提取 Agent
model="gemini-2.0-flash", # 模型
instruction="从用户输入中提取关键信息。只输出提取的关键信息。", # 指令
output_key="extracted_info", # 输出保存到 state
)
# 步骤二:信息分析
analyzer = LlmAgent(
name="Analyzer", # 信息分析 Agent
model="gemini-2.0-flash", # 模型
instruction=( # 指令:引用上一步输出
"分析以下提取的信息,给出深度分析报告。\n"
"提取的信息:{extracted_info}"
),
output_key="analysis_result", # 输出保存到 state
)
# 步骤三:报告生成
reporter = LlmAgent(
name="Reporter", # 报告生成 Agent
model="gemini-2.0-flash", # 模型
instruction=( # 指令:引用前两步输出
"根据分析结果生成一份简洁的报告。\n"
"原始信息:{extracted_info}\n"
"分析结果:{analysis_result}"
),
)
# 创建顺序流水线
pipeline = SequentialAgent(
name="InfoPipeline", # 流水线名称
sub_agents=[extractor, analyzer, reporter], # 按顺序执行
)
# ========================================
# 模式三:并行扇出模式
# ========================================
# 并行任务一:天气查询
weather_agent = LlmAgent(
name="WeatherFetcher", # 天气查询
model="gemini-2.0-flash", # 模型
instruction="查询并返回天气信息。只返回天气数据。", # 指令
output_key="weather_data", # 输出保存到 state
)
# 并行任务二:新闻查询
news_agent = LlmAgent(
name="NewsFetcher", # 新闻查询
model="gemini-2.0-flash", # 模型
instruction="查询并返回最新新闻。只返回新闻摘要。", # 指令
output_key="news_data", # 输出保存到 state
)
# 并行任务三:交通查询
traffic_agent = LlmAgent(
name="TrafficFetcher", # 交通查询
model="gemini-2.0-flash", # 模型
instruction="查询并返回交通状况。只返回交通信息。", # 指令
output_key="traffic_data", # 输出保存到 state
)
# 创建并行执行器
gatherer = ParallelAgent(
name="InfoGatherer", # 并行执行器名称
sub_agents=[weather_agent, news_agent, traffic_agent], # 并行执行
)
# ========================================
# 模式四循环优化模式Generator-Critic
# ========================================
# 生成器 Agent
generator = LlmAgent(
name="Generator", # 生成器
model="gemini-2.0-flash", # 模型
instruction=( # 指令
"你是一个创意写手。\n"
"根据用户需求创作内容。\n"
"将创作的内容保存到 state['draft']。"
),
output_key="draft", # 输出保存到 state
)
# 评审器 Agent
critic = LlmAgent(
name="Critic", # 评审器
model="gemini-2.0-flash", # 模型
instruction=( # 指令
"你是一个严格的内容评审。\n"
"评审以下内容给出评分1-10和改进建议。\n"
"当前草稿:{draft}\n"
"如果评分 >= 8将 state['approved'] 设为 True。\n"
"否则,将改进建议保存到 state['feedback']。"
),
)
# 条件检查 Agent
class ApprovalChecker(BaseAgent):
"""检查内容是否通过审批"""
async def _run_async_impl(
self,
ctx: InvocationContext, # 调用上下文
) -> AsyncGenerator[Event, None]: # 返回事件生成器
"""执行检查"""
approved = ctx.session.state.get("approved", False) # 获取审批状态
yield Event( # 生成事件
author=self.name, # 事件作者
actions=EventActions(
escalate=approved, # 通过则退出循环
),
)
# 创建迭代优化循环
review_loop = LoopAgent(
name="ReviewLoop", # 循环名称
max_iterations=3, # 最多迭代3次
sub_agents=[critic, ApprovalChecker(name="Checker"), generator], # 循环体
)
# ========================================
# 模式五:多层级嵌套
# ========================================
# 第三层:具体执行 Agent
code_reviewer = LlmAgent(
name="CodeReviewer", # 代码审查
model="gemini-2.0-flash", # 模型
description="审查代码质量。", # 描述
instruction="审查代码并给出改进建议。", # 指令
)
test_writer = LlmAgent(
name="TestWriter", # 测试编写
model="gemini-2.0-flash", # 模型
description="编写单元测试。", # 描述
instruction="为代码编写单元测试。", # 指令
)
# 第二层:开发流水线
dev_pipeline = SequentialAgent(
name="DevPipeline", # 流水线
sub_agents=[code_reviewer, test_writer], # 顺序执行
)
# 第二层:其他 Agent
doc_writer = LlmAgent(
name="DocWriter", # 文档编写
model="gemini-2.0-flash", # 模型
description="编写技术文档。", # 描述
instruction="编写清晰的技术文档。", # 指令
)
# 第一层:根协调器
root_agent = LlmAgent(
name="RootCoordinator", # 根协调器
model="gemini-2.0-flash", # 模型
description="开发团队协调器。", # 描述
instruction=( # 指令
"你是一个开发团队协调器。\n"
"代码审查和测试交给 DevPipeline。\n"
"文档编写交给 DocWriter。"
),
sub_agents=[dev_pipeline, doc_writer], # 子 Agent
)
# ========================================
# 打印结构信息
# ========================================
if __name__ == "__main__":
print("=" * 60) # 分隔线
print("Google ADK 多智能体系统示例") # 标题
print("=" * 60) # 分隔线
print("\n📦 模式一:协调器/调度器") # 模式一
print(f" 根 Agent: {coordinator.name}") # 根 Agent
print(f" 子 Agent: {[a.name for a in coordinator.sub_agents]}") # 子 Agent
print("\n📦 模式二:顺序流水线") # 模式二
print(f" 流水线: {pipeline.name}") # 流水线
print(f" 步骤: {[a.name for a in pipeline.sub_agents]}") # 步骤
print("\n📦 模式三:并行扇出") # 模式三
print(f" 并行器: {gatherer.name}") # 并行器
print(f" 任务: {[a.name for a in gatherer.sub_agents]}") # 任务
print("\n📦 模式四:循环优化") # 模式四
print(f" 循环: {review_loop.name}") # 循环
print(f" 最大迭代: {review_loop.max_iterations}") # 最大迭代
print("\n📦 模式五:多层级嵌套") # 模式五
print(f" 根: {root_agent.name}") # 根
print(f" 第二层: {[a.name for a in root_agent.sub_agents]}") # 第二层
print(f" 第三层: {[a.name for a in dev_pipeline.sub_agents]}") # 第三层
print("\n✅ 所有模式定义完成!") # 成功信息
print("使用 'adk web''adk run' 运行。") # 运行提示