211 lines
7.7 KiB
Python
211 lines
7.7 KiB
Python
"""
|
||
Google ADK LLM 智能体完整示例
|
||
展示 LlmAgent 的各种配置和用法
|
||
|
||
对应教程:第03章 - LLM 智能体详解
|
||
"""
|
||
|
||
# 导入 ADK 核心模块
|
||
from google.adk.agents import Agent, LlmAgent # Agent 和 LlmAgent
|
||
from google.adk.agents import SequentialAgent # 顺序工作流
|
||
from google.adk.models.lite_llm import LiteLlm # LiteLLM 适配器
|
||
from google.adk.tools import google_search # Google 搜索工具
|
||
from google.adk.tools import code_execution # 代码执行工具
|
||
|
||
# 导入运行相关模块
|
||
from google.adk.runners import Runner # 运行器
|
||
from google.adk.sessions import InMemorySessionService # 内存会话服务
|
||
from google.genai import types # Google GenAI 类型定义
|
||
|
||
# 导入异步库
|
||
import asyncio # 异步编程库
|
||
|
||
|
||
# ========================================
|
||
# 示例一:基础 LlmAgent 配置
|
||
# ========================================
|
||
|
||
# 使用 Gemini 模型(默认)
|
||
gemini_agent = Agent(
|
||
name="gemini_agent", # Agent 名称
|
||
model="gemini-2.0-flash", # 使用 Gemini 2.0 Flash
|
||
instruction="你是一个专业的编程助手。", # 系统指令
|
||
description="擅长编程和代码审查。", # 描述(用于多 Agent 路由)
|
||
)
|
||
|
||
# 使用 LiteLLM 适配 DeepSeek 模型
|
||
deepseek_agent = Agent(
|
||
name="deepseek_agent", # Agent 名称
|
||
model=LiteLlm( # 使用 LiteLLM 适配器
|
||
model="deepseek/deepseek-chat", # 格式:provider/model_name
|
||
api_key="你的_DEEPSEEK_API_KEY", # API Key
|
||
),
|
||
instruction="你是一个中文写作助手。", # 系统指令
|
||
)
|
||
|
||
# 使用 LiteLLM 适配 OpenAI 模型
|
||
openai_agent = Agent(
|
||
name="openai_agent", # Agent 名称
|
||
model=LiteLlm( # 使用 LiteLLM 适配器
|
||
model="openai/gpt-4o", # OpenAI GPT-4o
|
||
api_key="你的_OPENAI_API_KEY", # API Key
|
||
),
|
||
instruction="你是一个数据分析助手。", # 系统指令
|
||
)
|
||
|
||
|
||
# ========================================
|
||
# 示例二:使用 Google 内置工具
|
||
# ========================================
|
||
|
||
# 带搜索能力的 Agent
|
||
search_agent = Agent(
|
||
name="search_agent", # Agent 名称
|
||
model="gemini-2.0-flash", # 使用 Gemini 模型
|
||
instruction=( # 系统指令
|
||
"你是一个信息查询助手。\n"
|
||
"使用 Google Search 工具搜索最新信息。\n"
|
||
"根据搜索结果提供准确、全面的回答。"
|
||
),
|
||
tools=[google_search], # 注册 Google 搜索工具
|
||
)
|
||
|
||
# 带代码执行能力的 Agent
|
||
code_agent = Agent(
|
||
name="code_agent", # Agent 名称
|
||
model="gemini-2.0-flash", # 使用 Gemini 模型
|
||
instruction=( # 系统指令
|
||
"你是一个数据分析助手。\n"
|
||
"使用 Code Execution 工具执行 Python 代码。\n"
|
||
"确保代码正确且高效。"
|
||
),
|
||
tools=[code_execution], # 注册代码执行工具
|
||
)
|
||
|
||
# 多功能 Agent(搜索 + 代码执行)
|
||
super_agent = Agent(
|
||
name="super_agent", # Agent 名称
|
||
model="gemini-2.0-flash", # 使用 Gemini 模型
|
||
instruction="你是一个全能助手,可以搜索信息和执行代码。", # 指令
|
||
tools=[google_search, code_execution], # 注册多个工具
|
||
)
|
||
|
||
|
||
# ========================================
|
||
# 示例三:output_key 用法
|
||
# ========================================
|
||
|
||
# 第一步:提取信息的 Agent
|
||
extractor = Agent(
|
||
name="Extractor", # 信息提取 Agent
|
||
model="gemini-2.0-flash", # 模型
|
||
instruction="从用户输入中提取关键信息。只输出提取的信息。", # 指令
|
||
output_key="extracted_info", # 将输出保存到 state['extracted_info']
|
||
)
|
||
|
||
# 第二步:分析信息的 Agent(引用第一步的输出)
|
||
analyzer = Agent(
|
||
name="Analyzer", # 信息分析 Agent
|
||
model="gemini-2.0-flash", # 模型
|
||
instruction=( # 指令:通过 {key} 引用 state 中的值
|
||
"分析以下提取的信息,给出深度分析。\n"
|
||
"提取的信息:{extracted_info}"
|
||
),
|
||
output_key="analysis_result", # 将分析结果保存到 state
|
||
)
|
||
|
||
# 创建顺序流水线
|
||
pipeline = SequentialAgent(
|
||
name="InfoPipeline", # 流水线名称
|
||
sub_agents=[extractor, analyzer], # 按顺序执行
|
||
)
|
||
|
||
|
||
# ========================================
|
||
# 示例四:Agent Transfer(动态委派)
|
||
# ========================================
|
||
|
||
# 定义专门的子 Agent
|
||
booking_agent = LlmAgent(
|
||
name="BookingAgent", # 预订 Agent
|
||
model="gemini-2.0-flash", # 模型
|
||
description="负责处理航班和酒店的预订请求。", # 描述
|
||
instruction="你是一个预订助手,帮助用户预订航班和酒店。", # 指令
|
||
)
|
||
|
||
info_agent = LlmAgent(
|
||
name="InfoAgent", # 信息查询 Agent
|
||
model="gemini-2.0-flash", # 模型
|
||
description="负责回答一般性问题和提供信息。", # 描述
|
||
instruction="你是一个信息助手,回答用户的各种问题。", # 指令
|
||
)
|
||
|
||
# 定义协调器 Agent
|
||
coordinator = LlmAgent(
|
||
name="Coordinator", # 协调器
|
||
model="gemini-2.0-flash", # 模型
|
||
description="主协调器,负责分配任务。", # 描述
|
||
instruction=( # 指令
|
||
"你是一个协调器。\n"
|
||
"预订任务交给 BookingAgent。\n"
|
||
"信息查询交给 InfoAgent。\n"
|
||
"使用 transfer_to_agent 工具委派任务。"
|
||
),
|
||
sub_agents=[booking_agent, info_agent], # 注册子 Agent
|
||
)
|
||
|
||
|
||
# ========================================
|
||
# 示例五:通过代码运行 Agent
|
||
# ========================================
|
||
|
||
# 定义应用信息
|
||
APP_NAME = "llm_demo_app" # 应用名称
|
||
USER_ID = "user_001" # 用户 ID
|
||
SESSION_ID = "session_001" # 会话 ID
|
||
|
||
|
||
async def run_demo():
|
||
"""运行 LlmAgent 演示"""
|
||
|
||
# 创建会话服务
|
||
session_service = InMemorySessionService() # 内存会话服务
|
||
|
||
# 创建会话
|
||
session = await session_service.create_session(
|
||
app_name=APP_NAME, # 应用名称
|
||
user_id=USER_ID, # 用户 ID
|
||
session_id=SESSION_ID, # 会话 ID
|
||
)
|
||
|
||
# 创建运行器
|
||
runner = Runner(
|
||
agent=gemini_agent, # 使用 Gemini Agent
|
||
app_name=APP_NAME, # 应用名称
|
||
session_service=session_service, # 会话服务
|
||
)
|
||
|
||
# 构造用户消息
|
||
content = types.Content(
|
||
role='user', # 角色:用户
|
||
parts=[types.Part(text='用 Python 写一个冒泡排序算法')], # 消息
|
||
)
|
||
|
||
# 运行 Agent
|
||
events = runner.run_async(
|
||
user_id=USER_ID, # 用户 ID
|
||
session_id=SESSION_ID, # 会话 ID
|
||
new_message=content, # 用户消息
|
||
)
|
||
|
||
# 处理事件流
|
||
async for event in events: # 遍历所有事件
|
||
if event.is_final_response(): # 如果是最终响应
|
||
response = event.content.parts[0].text # 提取文本
|
||
print(f"Agent 回复:\n{response}") # 打印回复
|
||
|
||
|
||
# 运行演示
|
||
if __name__ == "__main__": # 当脚本被直接运行时
|
||
asyncio.run(run_demo()) # 执行异步函数
|