276 lines
10 KiB
Python
276 lines
10 KiB
Python
"""
|
||
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' 运行。") # 运行提示
|