Google Agent Development Kit (ADK) 指南 第三章:核心概念与架构

Google Agent Development Kit (ADK) 指南 第三章:核心概念与架构

系列教程:这是《Google ADK 指南》系列的第三章。

前置知识:已完成第二章,完成环境搭建。


目录

  1. [ADK 架构概览](#ADK 架构概览)
  2. 核心组件详解
  3. 数据流与执行模型
  4. 扩展点与插件
  5. 最佳实践

1. ADK 架构概览

1.1 整体架构

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                        应用层                                   │
│    (Chatbot、API Service、Batch Processing、Web UI)             │
├─────────────────────────────────────────────────────────────────┤
│                        ADK 框架层                                │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌───────────┐  │
│  │   Agent     │ │    Tool     │ │   Memory    │ │  Evaluator│  │
│  │   Engine    │ │   Manager   │ │   Manager   │ │           │  │
│  └─────────────┘ └─────────────┘ └─────────────┘ └───────────┘  │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │                    Orchestrator                             ││
│  │  (Single Agent | Multi-Agent | Workflow | Parallel)         ││
│  └─────────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────────┤
│                        模型层                                    │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌───────────┐  │
│  │   Gemini    │ │    PaLM     │ │   Codey     │ │  Third-   │  │
│  │   2.0       │ │     2       │ │             │ │   party   │  │
│  └─────────────┘ └─────────────┘ └─────────────┘ └───────────┘  │
├─────────────────────────────────────────────────────────────────┤
│                      GCP 基础设施层                              │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌───────────┐  │
│  │   Vertex    │ │     GCS     │ │  BigQuery   │ │    IAM    │  │
│  │     AI      │ │             │ │             │ │           │  │
│  └─────────────┘ └─────────────┘ └─────────────┘ └───────────┘  │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌───────────┐  │
│  │   Cloud     │ │   Pub/Sub   │ │  Cloud      │ │  Secret   │  │
│  │   Logging   │ │             │ │  Functions  │ │  Manager  │  │
│  └─────────────┘ └─────────────┘ └─────────────┘ └───────────┘  │
└─────────────────────────────────────────────────────────────────┘

1.2 设计原则

原则 说明 实现方式
模块化 组件独立可替换 清晰接口定义
可扩展 易于添加新功能 插件架构
可观测 运行状态透明 日志、指标、追踪
安全 数据保护优先 IAM、加密、审计
高性能 低延迟高吞吐 异步、缓存、批处理

2. 核心组件详解

2.1 Agent(智能体)

定义:Agent 是 ADK 的核心,负责接收输入、决策、调用工具、生成输出。

核心属性

python 复制代码
from google.adk import Agent
from google.adk.models import Gemini
from google.adk.memory import ConversationBufferMemory

agent = Agent(
    # 基础配置
    name="customer_service_agent",
    description="客户服务智能代理",
    
    # 模型配置
    model=Gemini("gemini-2.0-pro"),
    
    # 指令(System Prompt)
    instruction="""你是一个专业的客户服务代表。
    - 用友好、专业的语气回答
    - 只根据知识库内容回答
    - 不知道的事情要承认""",
    
    # 工具列表
    tools=[search_tool, order_tool, refund_tool],
    
    # 记忆配置
    memory=ConversationBufferMemory(max_turns=20),
    
    # 生成配置
    generation_config={
        "temperature": 0.7,
        "max_output_tokens": 2048,
        "top_p": 0.95
    },
    
    # 安全配置
    safety_settings={
        "HARM_CATEGORY_HARASSMENT": "BLOCK_MEDIUM_AND_ABOVE"
    }
)

Agent 生命周期

复制代码
初始化 → 接收输入 → 思考规划 → 调用工具 → 生成响应 → 更新记忆 → 输出
   ↑                                                                  │
   └────────────────────────── 循环 ──────────────────────────────────┘

2.2 Tool(工具)

定义:Tool 是 Agent 可调用的外部函数或 API。

工具类型

类型 说明 示例
函数工具 Python 函数 计算器、日期处理
API 工具 HTTP API 天气、地图、支付
数据库工具 SQL 查询 订单查询、用户信息
GCP 工具 Google 服务 BigQuery、Storage

创建工具

python 复制代码
from google.adk import Tool
from pydantic import BaseModel, Field

# 方式 1:装饰器(推荐)
@Tool(
    name="calculate_shipping",
    description="计算运费",
    parameters={
        "weight": {"type": "number", "description": "包裹重量 (kg)"},
        "destination": {"type": "string", "description": "目的地城市"},
        "express": {"type": "boolean", "description": "是否快递"}
    }
)
def calculate_shipping(weight: float, destination: str, express: bool = False) -> str:
    """计算运费并返回结果"""
    base_rate = 10.0
    express_rate = 2.0 if express else 0.0
    total = base_rate * weight + express_rate
    return f"运费:${total:.2f}"

# 方式 2:类定义(复杂工具)
from google.adk.tools import BaseTool

class OrderLookupTool(BaseTool):
    name = "lookup_order"
    description = "查询订单状态"
    
    class Parameters(BaseModel):
        order_id: str = Field(..., description="订单 ID")
        email: str = Field(..., description="用户邮箱")
    
    def execute(self, order_id: str, email: str) -> dict:
        # 查询数据库
        order = db.query("SELECT * FROM orders WHERE id=? AND email=?", 
                        order_id, email)
        return {
            "status": order.status,
            "items": order.items,
            "tracking": order.tracking_number
        }

2.3 Memory(记忆)

定义:Memory 管理 Agent 的状态和历史信息。

记忆类型

python 复制代码
# 1. 对话缓冲记忆(短期)
from google.adk.memory import ConversationBufferMemory
memory = ConversationBufferMemory(max_turns=10)

# 2. 向量记忆(长期)
from google.adk.memory import VectorStoreMemory
from google.adk.vectorstores import VertexAISearch
memory = VectorStoreMemory(
    store=VertexAISearch(
        project_id="your-project",
        location_id="global"
    )
)

# 3. 实体记忆(结构化)
from google.adk.memory import EntityMemory
memory = EntityMemory(
    entities=["user_profile", "preferences", "history"]
)

# 4. 组合记忆
from google.adk.memory import CompositeMemory
memory = CompositeMemory(
    short_term=ConversationBufferMemory(max_turns=10),
    long_term=VectorStoreMemory(...)
)

记忆操作

python 复制代码
# 添加记忆
memory.add_message(role="user", content="你好")
memory.add_message(role="assistant", content="你好!有什么可以帮助你的?")

# 获取历史
history = memory.get_history(last_n=5)

# 搜索记忆
results = memory.search("用户偏好", top_k=3)

# 清除记忆
memory.clear()

2.4 Evaluator(评估器)

定义:Evaluator 评估 Agent 输出质量。

内置评估器

python 复制代码
from google.adk.evaluators import (
    RelevanceEvaluator,
    FaithfulnessEvaluator,
    SafetyEvaluator,
    CustomEvaluator
)

# 相关性评估
relevance_eval = RelevanceEvaluator(
    model=Gemini("gemini-2.0-flash"),
    threshold=0.7
)

# 忠实度评估(是否基于事实)
faithfulness_eval = FaithfulnessEvaluator(
    context_required=True
)

# 安全评估
safety_eval = SafetyEvaluator(
    blocked_categories=["HARASSMENT", "HATE_SPEECH"]
)

# 自定义评估
class ToneEvaluator(CustomEvaluator):
    def evaluate(self, response: str, context: dict) -> float:
        # 评估语气是否友好
        if any(word in response for word in ["抱歉", "感谢", "请"]):
            return 1.0
        return 0.5

# 组合评估
from google.adk.evaluators import EnsembleEvaluator
evaluator = EnsembleEvaluator(
    evaluators=[relevance_eval, faithfulness_eval, safety_eval],
    weights=[0.4, 0.4, 0.2]
)

2.5 Orchestrator(编排器)

定义:Orchestrator 协调多个 Agent 或复杂工作流。

编排模式

python 复制代码
# 1. 单 Agent(默认)
from google.adk import SingleAgentOrchestrator
orchestrator = SingleAgentOrchestrator(agent=single_agent)

# 2. 多 Agent 路由
from google.adk import MultiAgentOrchestrator
orchestrator = MultiAgentOrchestrator(
    agents={
        "sales": sales_agent,
        "support": support_agent,
        "billing": billing_agent
    },
    router=SemanticRouter(  # 语义路由
        model=Gemini("gemini-2.0-flash")
    )
)

# 3. 顺序工作流
from google.adk import SequentialWorkflow
workflow = SequentialWorkflow(
    steps=[
        intent_agent,      # 识别意图
        retrieval_agent,   # 检索信息
        response_agent     # 生成回复
    ]
)

# 4. 并行处理
from google.adk import ParallelWorkflow
workflow = ParallelWorkflow(
    agents=[agent1, agent2, agent3],
    merge_strategy="concatenate"  # 合并策略
)

# 5. 条件分支
from google.adk import ConditionalWorkflow
workflow = ConditionalWorkflow(
    conditions=[
        {
            "condition": lambda ctx: ctx["intent"] == "complaint",
            "agent": complaint_agent
        },
        {
            "condition": lambda ctx: ctx["intent"] == "inquiry",
            "agent": inquiry_agent
        }
    ],
    default=default_agent
)

3. 数据流与执行模型

3.1 请求处理流程

复制代码
用户输入
    ↓
┌─────────────────┐
│  输入预处理      │  (清洗、验证、标准化)
└────────┬────────┘
         ↓
┌─────────────────┐
│  意图识别        │  (分类、实体抽取)
└────────┬────────┘
         ↓
┌─────────────────┐
│  检索记忆        │  (历史对话、用户信息)
└────────┬────────┘
         ↓
┌─────────────────┐
│  规划与决策      │  (选择工具、制定步骤)
└────────┬────────┘
         ↓
┌─────────────────┐
│  工具执行        │  (并行/串行调用)
└────────┬────────┘
         ↓
┌─────────────────┐
│  响应生成        │  (LLM 生成)
└────────┬────────┘
         ↓
┌─────────────────┐
│  质量评估        │  (安全性、相关性)
└────────┬────────┘
         ↓
┌─────────────────┐
│  输出后处理      │  (格式化、过滤)
└────────┬────────┘
         ↓
    用户输出

3.2 执行模式

同步执行

python 复制代码
response = agent.run("你好")
print(response.text)

异步执行

python 复制代码
import asyncio

async def main():
    response = await agent.run_async("你好")
    print(response.text)

asyncio.run(main())

流式执行

python 复制代码
for chunk in agent.run_stream("写一篇长文章"):
    print(chunk.text, end="", flush=True)

批处理

python 复制代码
inputs = ["问题 1", "问题 2", "问题 3"]
responses = agent.batch_run(inputs, max_concurrent=5)

3.3 错误处理

python 复制代码
from google.adk.exceptions import (
    AgentError,
    ToolExecutionError,
    ModelAPIError,
    TimeoutError
)

try:
    response = agent.run(user_input, timeout=30)
except ToolExecutionError as e:
    # 工具执行失败
    logger.error(f"工具失败:{e.tool_name}, 错误:{e.message}")
    response = agent.run("抱歉,暂时无法完成该操作。")
except ModelAPIError as e:
    # 模型 API 错误
    logger.error(f"模型错误:{e.status_code}")
    response = agent.run("服务暂时不可用,请稍后重试。")
except TimeoutError:
    # 超时
    logger.warning("请求超时")
    response = agent.run("处理超时,请简化问题。")
except AgentError as e:
    # 通用错误
    logger.error(f"Agent 错误:{e}")
    raise

4. 扩展点与插件

4.1 自定义模型 provider

python 复制代码
from google.adk.models import BaseModel, register_model

class CustomModel(BaseModel):
    def __init__(self, model_name: str, api_key: str):
        self.model_name = model_name
        self.api_key = api_key
    
    def generate(self, prompt: str, **kwargs) -> str:
        # 调用自定义模型 API
        response = requests.post(
            "https://api.custom-llm.com/generate",
            headers={"Authorization": f"Bearer {self.api_key}"},
            json={"prompt": prompt, "model": self.model_name}
        )
        return response.json()["text"]

# 注册
register_model("custom", CustomModel)

# 使用
agent = Agent(
    model=CustomModel("custom-v1", "your-api-key")
)

4.2 自定义工具

python 复制代码
from google.adk.tools import BaseTool
from pydantic import BaseModel

class DatabaseQueryTool(BaseTool):
    name = "query_database"
    description = "执行 SQL 查询"
    
    class Parameters(BaseModel):
        query: str
        read_only: bool = True
    
    def execute(self, query: str, read_only: bool = True) -> list:
        if read_only and not query.strip().upper().startswith("SELECT"):
            raise ValueError("只读模式只允许 SELECT 查询")
        
        conn = get_db_connection()
        cursor = conn.cursor()
        cursor.execute(query)
        return cursor.fetchall()

4.3 自定义记忆存储

python 复制代码
from google.adk.memory import BaseMemory

class RedisMemory(BaseMemory):
    def __init__(self, redis_url: str, session_id: str):
        import redis
        self.redis = redis.from_url(redis_url)
        self.session_key = f"adk:memory:{session_id}"
    
    def add_message(self, role: str, content: str):
        self.redis.lpush(self.session_key, f"{role}:{content}")
        self.redis.ltrim(self.session_key, 0, 99)  # 保留 100 条
    
    def get_history(self, last_n: int = 10):
        messages = self.redis.lrange(self.session_key, 0, last_n-1)
        return [m.decode().split(":", 1) for m in reversed(messages)]
    
    def clear(self):
        self.redis.delete(self.session_key)

5. 最佳实践

5.1 Agent 设计

推荐

  • 单一职责原则(一个 Agent 做好一件事)
  • 清晰的指令(System Prompt)
  • 合理的工具数量(3-7 个)
  • 适当的记忆长度(10-20 轮)

避免

  • 万能 Agent(什么都做)
  • 模糊的指令
  • 过多工具(>15 个)
  • 无限记忆

5.2 工具开发

推荐

  • 详细的描述和参数说明
  • 完善的错误处理
  • 超时控制
  • 结果格式化
python 复制代码
@Tool(
    name="search_products",
    description="搜索产品,支持关键词、价格范围、分类筛选",
    parameters={
        "keyword": {"type": "string", "description": "搜索关键词"},
        "min_price": {"type": "number", "description": "最低价格"},
        "max_price": {"type": "number", "description": "最高价格"},
        "category": {"type": "string", "description": "产品分类"}
    },
    timeout=10,  # 超时设置
    cache_ttl=300  # 缓存 5 分钟
)
def search_products(keyword: str, min_price: float = None, 
                    max_price: float = None, category: str = None) -> list:
    try:
        # 实现...
        pass
    except Exception as e:
        logger.error(f"搜索失败:{e}")
        return []

5.3 性能优化

python 复制代码
# 1. 启用缓存
from google.adk.caching import ResponseCache
agent.cache = ResponseCache(ttl=3600)

# 2. 批量工具调用
@Tool(batch_enabled=True)
def batch_lookup_ids(ids: list[str]) -> list:
    # 一次调用查询多个 ID
    pass

# 3. 异步并发
import asyncio
results = await asyncio.gather(
    tool1.run_async(arg1),
    tool2.run_async(arg2),
    tool3.run_async(arg3)
)

# 4. 流式响应
for chunk in agent.run_stream(long_query):
    process(chunk)  # 边生成边处理

5.4 安全实践

python 复制代码
# 1. 输入验证
from google.adk.security import InputValidator

validator = InputValidator(
    max_length=1000,
    blocked_patterns=[r"<script>", r"DROP TABLE"],
    require_auth=True
)

# 2. 输出过滤
from google.adk.security import OutputFilter

filter = OutputFilter(
    remove_pii=True,  # 移除个人信息
    block_sensitive=True  # 阻止敏感信息
)

# 3. 速率限制
from google.adk.security import RateLimiter

limiter = RateLimiter(
    requests_per_minute=60,
    tokens_per_minute=10000
)

# 4. 审计日志
from google.adk.logging import AuditLogger

audit = AuditLogger(
    log_input=True,
    log_output=True,
    log_tool_calls=True,
    retention_days=90
)

系列教程导航

相关推荐
码农小白AI2 小时前
AI审核驱动下的IACheck:港口沉积物检测报告如何实现质量稳步提升
人工智能
2501_948114242 小时前
OpenClaw 时代的多模型接入实战:当开源智能体遇上聚合网关,一个人如何跑通全自动生产流水线
人工智能·gpt·开源
中电金信2 小时前
中电金信助力腾讯安全多模态智能鉴伪系统上线
人工智能
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章40-特征找图
图像处理·人工智能·opencv·算法·计算机视觉
油泼辣子多加2 小时前
【DL】Transformer算法应用
人工智能·深度学习·算法·机器学习·transformer
fof9202 小时前
Base LLM | 从 NLP 到 LLM 的算法全栈教程 第二天
人工智能·算法·自然语言处理
云蝠呼叫大模型联络中心2 小时前
零售行业智能客服与客户数据分析:技术架构与实战案例
大数据·人工智能·架构·数据分析·零售·#智能外呼合规·#云蝠智能
2301_764441332 小时前
PocketPal AI版本与部署
人工智能
乱世刀疤2 小时前
openclaw常用指令
人工智能·openclaw