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,434 @@
# 第03章LLM 智能体详解
## 📌 本章目标
- 深入理解 LlmAgent 的工作原理
- 掌握 Agent 的指令设计Instruction Design
- 学习如何选择和配置不同的 LLM 模型
- 了解 output_key、before/after 回调等高级特性
- 使用 Google 内置工具(搜索、代码执行等)
---
## 3.1 LlmAgent 工作原理
### 3.1.1 执行流程
```
用户输入
┌─────────────────────────────────────────────────┐
│ LlmAgent │
│ │
│ 1. 接收用户消息 │
│ ↓ │
│ 2. before_model_callback模型调用前回调
│ ↓ │
│ 3. 构建上下文(系统指令 + 历史消息 + 工具定义) │
│ ↓ │
│ 4. 调用 LLM 获取响应 │
│ ↓ │
│ 5. after_model_callback模型调用后回调
│ ↓ │
│ 6. 判断是否需要调用工具 │
│ ├── 是 → before_tool_callback → 执行工具 │
│ │ → after_tool_callback → 回到步骤3 │
│ └── 否 → 输出最终响应 │
│ ↓ │
│ 7. 保存输出到 State如果设置了 output_key
│ ↓ │
│ 8. 返回响应给用户 │
└─────────────────────────────────────────────────┘
```
### 3.1.2 Agent 与 LlmAgent 的关系
```python
# Agent 是 LlmAgent 的别名,两者完全等价
from google.adk.agents import Agent # Agent = LlmAgent 的别名
from google.adk.agents import LlmAgent # LlmAgent 是完整类名
# 以下两种写法效果完全相同:
agent1 = Agent(name="test", model="gemini-2.0-flash")
agent2 = LlmAgent(name="test", model="gemini-2.0-flash")
```
---
## 3.2 指令设计Instruction Design
### 3.2.1 好的指令设计原则
```python
"""
Agent 指令设计示例
展示如何编写高质量的 Agent 系统指令
"""
from google.adk.agents import Agent
# ❌ 不好的指令设计:过于简单、缺乏约束
bad_agent = Agent(
name="bad_agent",
model="gemini-2.0-flash",
instruction="你是一个助手。", # 太模糊Agent 不知道该做什么
)
# ✅ 好的指令设计:清晰、具体、有约束
good_agent = Agent(
name="good_agent",
model="gemini-2.0-flash",
instruction="""你是一个专业的旅行规划助手。
## 你的职责
- 帮助用户规划旅行行程
- 提供目的地推荐和旅行建议
- 使用工具查询天气、航班等信息
## 回答规范
1. 始终使用中文回答
2. 回答要简洁明了,使用列表格式
3. 如果信息不足,主动询问用户
4. 不要编造不存在的信息
## 工具使用规则
- 查询天气时,使用 get_weather 工具
- 查询航班时,使用 search_flights 工具
- 只有在需要实时数据时才使用工具
""",
)
```
### 3.2.2 指令模板
```python
"""
常用指令模板
可以根据自己的需求修改使用
"""
# 模板一:数据分析助手
data_analyst_instruction = """你是一个数据分析专家。
## 核心能力
- 分析数据并生成洞察
- 创建数据可视化建议
- 解释统计指标的含义
## 工作流程
1. 理解用户的数据分析需求
2. 使用工具获取和处理数据
3. 生成分析报告,包含关键发现
4. 提供可操作的建议
## 输出格式
- 使用 Markdown 格式
- 包含数据表格和关键指标
- 提供结论和建议
"""
# 模板二:代码助手
code_assistant_instruction = """你是一个编程助手。
## 核心能力
- 编写和审查代码
- 调试和修复错误
- 代码重构和优化建议
## 规则
1. 代码注释使用中文
2. 遵循最佳实践和设计模式
3. 解释代码的工作原理
4. 提供测试建议
"""
# 模板三:客服助手
customer_service_instruction = """你是一个专业的客服代表。
## 核心职责
- 解答用户问题
- 处理投诉和反馈
- 引导用户完成操作
## 规则
1. 语气友好、专业
2. 先理解用户问题,再提供解决方案
3. 无法解决时,转交人工客服
4. 记录用户反馈
"""
```
---
## 3.3 模型选择与配置
### 3.3.1 Gemini 模型(默认)
```python
"""
使用 Gemini 模型配置 Agent
Gemini 是 ADK 默认优化的模型
"""
from google.adk.agents import Agent
# 使用 Gemini 2.0 Flash推荐性价比高
agent_flash = Agent(
name="flash_agent",
model="gemini-2.0-flash", # 快速、经济
instruction="你是一个高效的助手。",
)
# 使用 Gemini 2.5 Pro更强推理能力
agent_pro = Agent(
name="pro_agent",
model="gemini-2.5-pro-preview-05-06", # 更强的推理能力
instruction="你是一个需要深度推理的助手。",
)
# 使用 Gemini 3 Pro最新版本
agent_latest = Agent(
name="latest_agent",
model="gemini-3-pro-preview", # 最新版本
instruction="你是一个使用最新模型的助手。",
)
```
### 3.3.2 使用其他模型LiteLLM
```python
"""
使用 LiteLLM 适配其他模型
LiteLLM 支持 100+ 种模型
"""
from google.adk.agents import Agent # 导入 Agent 类
from google.adk.models.lite_llm import LiteLlm # 导入 LiteLLM 适配器
# ========================================
# 使用 DeepSeek 模型
# ========================================
deepseek_agent = Agent(
name="deepseek_agent", # Agent 名称
model=LiteLlm( # 使用 LiteLLM 适配器
model="deepseek/deepseek-chat", # 格式provider/model_name
api_key="你的_DEEPSEEK_API_KEY", # DeepSeek API Key
# api_base="https://api.deepseek.com", # 可选:自定义 API 地址
),
instruction="你是一个使用 DeepSeek 模型的助手。",
)
# ========================================
# 使用 OpenAI 模型
# ========================================
openai_agent = Agent(
name="openai_agent", # Agent 名称
model=LiteLlm( # 使用 LiteLLM 适配器
model="openai/gpt-4o", # OpenAI GPT-4o 模型
api_key="你的_OPENAI_API_KEY", # OpenAI API Key
),
instruction="你是一个使用 GPT-4o 模型的助手。",
)
# ========================================
# 使用 Claude 模型
# ========================================
claude_agent = Agent(
name="claude_agent", # Agent 名称
model=LiteLlm( # 使用 LiteLLM 适配器
model="anthropic/claude-3-5-sonnet-20241022", # Claude 模型
api_key="你的_ANTHROPIC_API_KEY", # Anthropic API Key
),
instruction="你是一个使用 Claude 模型的助手。",
)
```
### 3.3.3 模型选择指南
| 场景 | 推荐模型 | 原因 |
|------|----------|------|
| 简单对话 | gemini-2.0-flash | 速度快、成本低 |
| 复杂推理 | gemini-2.5-pro | 推理能力强 |
| 代码生成 | gemini-2.5-pro / gpt-4o | 代码质量高 |
| 中文场景 | deepseek-chat | 中文能力强 |
| 长文本处理 | gemini-2.5-pro | 支持长上下文 |
---
## 3.4 使用 Google 内置工具
### 3.4.1 Google Search网络搜索
```python
"""
使用 Google Search 工具
让 Agent 能够搜索互联网获取最新信息
"""
from google.adk.agents import Agent # 导入 Agent 类
from google.adk.tools import google_search # 导入 Google 搜索工具
# 创建带有搜索能力的 Agent
search_agent = Agent(
name="search_agent", # Agent 名称
model="gemini-2.0-flash", # 使用 Gemini 模型
instruction=( # 系统指令
"你是一个信息查询助手。\n"
"当用户提问时,使用 Google Search 工具搜索最新信息。\n"
"根据搜索结果提供准确、全面的回答。\n"
"如果搜索结果不够充分,可以多次搜索不同关键词。"
),
tools=[google_search], # 注册 Google 搜索工具
)
```
### 3.4.2 Code Execution代码执行
```python
"""
使用 Code Execution 工具
让 Agent 能够执行 Python 代码进行计算和分析
"""
from google.adk.agents import Agent # 导入 Agent 类
from google.adk.tools import code_execution # 导入代码执行工具
# 创建带有代码执行能力的 Agent
code_agent = Agent(
name="code_agent", # Agent 名称
model="gemini-2.0-flash", # 使用 Gemini 模型
instruction=( # 系统指令
"你是一个数据分析助手。\n"
"当需要进行数学计算、数据分析或生成图表时,\n"
"使用 Code Execution 工具执行 Python 代码。\n"
"确保代码正确且高效。"
),
tools=[code_execution], # 注册代码执行工具
)
```
### 3.4.3 组合多个内置工具
```python
"""
组合使用多个 Google 内置工具
创建功能更强大的 Agent
"""
from google.adk.agents import Agent # 导入 Agent 类
from google.adk.tools import google_search # 导入 Google 搜索工具
from google.adk.tools import code_execution # 导入代码执行工具
# 创建多功能 Agent
super_agent = Agent(
name="super_agent", # Agent 名称
model="gemini-2.0-flash", # 使用 Gemini 模型
instruction=( # 系统指令
"你是一个全能助手。\n"
"你可以搜索互联网获取最新信息。\n"
"你也可以执行代码来进行计算和分析。\n"
"根据用户的需求选择合适的工具。"
),
tools=[ # 注册多个工具
google_search, # 网络搜索
code_execution, # 代码执行
],
)
```
---
## 3.5 output_key — 输出到 State
```python
"""
output_key 参数详解
将 Agent 的输出保存到会话状态State
用于在多 Agent 系统中传递数据
"""
from google.adk.agents import Agent # 导入 Agent 类
# 创建一个将输出保存到 State 的 Agent
capital_agent = Agent(
name="capital_agent", # Agent 名称
model="gemini-2.0-flash", # 使用 Gemini 模型
instruction="回答用户关于国家首都的问题。只回答首都名称,不要多余内容。", # 指令
output_key="capital_city", # 🔑 关键参数:将输出保存到 state['capital_city']
)
# 当这个 Agent 运行后,它的最终响应文本会自动保存到 session.state['capital_city']
# 其他 Agent 可以通过 {capital_city} 在指令中引用这个值
```
---
## 3.6 Agent Transfer — 动态任务委派
```python
"""
Agent Transfer 机制
LLM 可以根据用户需求动态地将任务委派给其他 Agent
"""
from google.adk.agents import LlmAgent # 导入 LlmAgent 类
# 定义专门的子 Agent
booking_agent = LlmAgent(
name="BookingAgent", # 预订 Agent
model="gemini-2.0-flash", # 使用 Gemini 模型
description="负责处理航班和酒店的预订请求。", # 描述:用于 LLM 路由决策
instruction="你是一个预订助手,帮助用户预订航班和酒店。", # 系统指令
)
info_agent = LlmAgent(
name="InfoAgent", # 信息查询 Agent
model="gemini-2.0-flash", # 使用 Gemini 模型
description="负责回答一般性问题和提供信息。", # 描述:用于 LLM 路由决策
instruction="你是一个信息助手,回答用户的各种问题。", # 系统指令
)
# 定义协调器 Agent父 Agent
coordinator = LlmAgent(
name="Coordinator", # 协调器 Agent
model="gemini-2.0-flash", # 使用 Gemini 模型
description="主协调器,负责将用户请求分配给合适的子 Agent。", # 描述
instruction=( # 系统指令
"你是一个协调器助手。\n"
"当用户需要预订航班或酒店时,将任务委派给 BookingAgent。\n"
"当用户询问一般性问题时,将任务委派给 InfoAgent。\n"
"使用 transfer_to_agent 工具来委派任务。"
),
sub_agents=[ # 🔑 注册子 Agent
booking_agent, # 预订 Agent
info_agent, # 信息 Agent
],
)
# 工作原理:
# 1. 用户发送消息给 Coordinator
# 2. Coordinator 的 LLM 分析消息,决定委派给哪个子 Agent
# 3. LLM 生成 transfer_to_agent(agent_name='BookingAgent') 调用
# 4. ADK 框架自动将执行切换到目标 Agent
# 5. 目标 Agent 处理请求并返回结果
```
---
## 3.7 完整代码示例
详见 `code/llm_agent_demo.py` — 包含完整的 LlmAgent 配置和运行示例。
---
## 📌 本章小结
- LlmAgent 是 ADK 最常用的智能体类型,以 LLM 为核心引擎
- 好的指令设计是 Agent 效果的关键
- ADK 默认优化 Gemini 模型,通过 LiteLLM 支持其他模型
- Google 内置工具(搜索、代码执行)可直接使用
- `output_key` 用于在多 Agent 系统中传递数据
- Agent Transfer 实现动态任务委派
**下一章**[第04章 - 自定义工具开发](./04-custom-tools.md) → 学习如何为 Agent 创建自定义工具。