📖说明

本篇文章是:从零开始,亲手开发你的第一个AI大模型!的最终篇。在第二篇的基础上配合 Gemini 大模型,实现智能 Agent 的工具链集成。

在我上一篇文章中,我们探讨了如何通过 Model Context Protocol(MCP)将 Gemini 大模型集成为 MCP 客户端,从而实现结构化、具备工具调用能力的智能交互,同时也介绍了 MCP 的核心理念、典型应用场景,并展示了相关演示。

而本篇文章将进一步深入,重点讲解如何借助 ADK 中的 Agent,以 MCP 客户端的形式调用外部 MCP 工具的能力,配合 Gemini 大模型,实现智能 Agent 的工具链集成。话不多说,我们直接进入代码实现!

图片

🎯 我们的最终目标

我们将使用 Google 开源的 Agent Development Kit(ADK),结合 Gemini 大语言模型 和 MCP 工具协议,从零构建一个智能航班查询 Agent,实现以下功能:

💡 当用户输入诸如“帮我查查从亚特兰大到拉斯维加斯 5 月 5 号的航班”这样的请求时,Agent 会自动调用 MCP 接口,查找实时航班信息,并以结构化方式返回给用户。

代码结构

我们将延续上一篇文章中使用的架构,并在此基础上,引入 ADK(Agent Development Kit)进行集成。

图片

实现部分

接下来,我们将通过拆解关键步骤,逐步构建这个由 ADK + MCP + Gemini AI 组成的智能 Agent 流水线。

准备工作

在开始实现之前,请确保已完成以下环境配置:

  • 已安装 Python 3.8 及以上版本

  • 拥有 Google Gemini 生成式 AI 的 API Key(用于调用 Gemini 大模型)

  • 有效的 SerpAPI 密钥(用于获取实时航班数据)

上述KEY如何申请?在本系列文章的第二篇均有介绍!

Step1:设置虚拟环境

我们首先需要创建并激活一个 Python 虚拟环境,然后安装所需的依赖库。

# 设置虚拟环境(适用于 macOS 或 Unix 系统)
python -m venv venv && source venv/bin/active 

# 安装 Agent Development Kit(代理开发工具包)
pip install google-adk

# 安装 MCP server 
pip install mcp-flight-search

# 安装 GenAI Python SDK
pip install google-genai
  • google-sdk:Google 推出的 Agent Development Kit,用于构建智能代理(Agent)。

  • google-genai:Google 提供的库,用于与生成式 AI 模型(如 Gemini)进行交互。

  • mcp-flight-search:一个基于 MCP 协议的服务端,利用 SerpAPI 通过 MCP 库实现航班搜索功能。

图片

设置环境变量:

请注意这里的区别:在 ADK 中,使用的是 GOOGLE_API_KEY,而不是 GEMINI_API_KEY

export GOOGLE_API_KEY="your-google-api-key"
export SERP_API_KEY="your-serpapi-key"

Step2:安装 MCP 服务端 mcp-flight-search

为了让 Gemini 能与真实世界的 API 交互,我们将使用一个符合 MCP 协议的服务端。

在本文中,我们选择使用 mcp-flight-search —— 这是一个基于 FastMCP 构建的轻量级 MCP 服务端,它通过 SerpAPI 提供实时航班查询工具。

你可以通过以下链接验证该 MCP 服务端包是否已正确安装:🔗 https://pypi.org/project/mcp-flight-search/

# Install from PyPI ( Already Installed from Step 1)
pip install mcp-flight-search

Step3:理解 ADK 作为 MCP 客户端的角色

from google.adk.agents.llm_agent import LlmAgent
from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters

LlmAgent是 ADK 中的核心组件,负责充当应用中的“思考大脑”。它利用大语言模型(LLM)的能力来进行推理、理解自然语言、做出决策、生成响应,并与各类工具进行交互。

图片

Runner 负责在 Agent 生命周期中协调各个组件之间的交互。它采用内存级实现来管理 artifact(工件)、session(会话)和 memory(记忆)服务,从而为 Agent 的运行提供一个轻量级、独立的执行环境。

图片

InMemorySessionService 是 ADK 中 SessionService 接口的一个实现,它将所有会话数据(包括对话历史、状态信息和元数据)直接存储在应用的内存中。这意味着一旦应用停止或重启,所有会话信息都将丢失。

图片

当用户与 AI Agent 进行交互时,系统会创建一个 Session 对象,用于跟踪整个对话过程。

图片

MCPToolSet 是 ADK 中的一个类,用于让我们的 AI Agent 能够连接外部的 MCP 服务端。这些服务端通常会暴露一些工具(如 API 或服务),供 Agent 调用以完成特定任务。通过使用 MCPToolSet,Agent 可以实现对这些外部工具的自动发现、调用与管理,从而实现无缝集成。

StdioServerParameters 是一个配置类,用于指定 Agent 如何通过标准输入/输出流(stdin/stdout)与 MCP 服务端建立连接。当 MCP 服务端作为本地进程并通过控制台进行通信时,这个类尤其有用。

💡 MCPToolSet 与 StdioServerParameters 如何协同工作?

将 MCPToolSet 与 StdioServerParameters 结合使用时,ADK Agent 可以实现以下功能:

  1. 建立连接:通过 StdioServerParameters,定义启动 MCP 服务进程所需的命令及参数,从而初始化连接。

  2. 发现可用工具MCPToolSet 连接 MCP 服务端,并获取该服务端所暴露的所有可用工具列表。

  3. 集成工具到 Agent:将发现的工具适配成 ADK Agent 可识别和调用的格式,实现运行过程中的无缝工具调用。

  4. 管理连接生命周期MCPToolSet 负责 MCP 服务连接的建立与断开,确保资源得到妥善管理。

Step4:链接MCP服务器

StdioServerParameters 用于定义 MCP 的配置,使 MCPToolSet 能够以异步方式进行工具列表的获取与监听。

# --- Step 1: 从 MCP 服务端获取工具 ---
asyncdef get_tools_async():
    """从航班搜索 MCP 服务端获取工具。"""
    print("正在尝试连接 MCP 航班搜索服务端...")
    server_params = StdioServerParameters(
        command="mcp-flight-search",
        args=["--connection_type", "stdio"],
        env={"SERP_API_KEY": os.getenv("SERP_API_KEY")},
    )
    
    tools, exit_stack = await MCPToolset.from_server(
        connection_params=server_params
    )
    print("MCP 工具集创建成功。")
    return tools, exit_stack

Step5:使用ADK创建Agent

如上所述,我们使用的是 LlmAgent,它是应用中的“思考核心”部分。

# --- 第二步:定义 ADK Agent 的创建 ---
asyncdef get_agent_async():
    """创建一个配备了 MCP 工具的 ADK Agent。"""
    tools, exit_stack = await get_tools_async()
    print(f"已从 MCP 服务端获取 {len(tools)} 个工具。")
    
    # 创建符合示例结构的 LlmAgent
    root_agent = LlmAgent(
        model=os.getenv("GEMINI_MODEL", "gemini-2.5-pro-preview-03-25"),
        name='flight_search_assistant',
        instruction='帮助用户根据提示使用可用工具搜索航班。如果未指定返程日期,则将其设为空字符串表示单程。',
        tools=tools,
    )
    
    return root_agent, exit_stack

Step6:将 Agent 创建、会话管理与运行协调整合到 Runner 中

async def async_main():
    # 创建服务
    session_service = InMemorySessionService()

    # 创建一个会话
    session = session_service.create_session(
        state={}, app_name='flight_search_app', user_id='user_flights'
    )

    # 定义用户输入的查询语句
    query = "Find flights from Atlanta to Las Vegas 2025-05-05"
    print(f"用户查询:'{query}'")
    
    # 将输入格式化为 types.Content 类型
    content = types.Content(role='user', parts=[types.Part(text=query)])

    # 获取 Agent 和资源释放堆栈
    root_agent, exit_stack = await get_agent_async()

    # 创建 Runner
    runner = Runner(
        app_name='flight_search_app',
        agent=root_agent,
        session_service=session_service,
    )

    print("正在运行 Agent...")
    events_async = runner.run_async(
        session_id=session.id, 
        user_id=session.user_id, 
        new_message=content
    )

    # 处理事件流
    final_content = None
    asyncfor event in events_async:
        print(f"接收到事件:{event}")

    # 始终清理资源
    print("正在关闭 MCP 服务端连接...")
    await exit_stack.aclose()
    print("资源清理完成。")

将 MCP 集成到 ADK 中的关键注意事项

1. MCP 与 ADK 的区别

  • MCP 是一个开放协议,用于标准化 AI 模型如何与外部工具和数据源进行交互。

  • ADK 是一个基于 Python 的框架,用于构建和部署智能代理(AI Agents)。

  • MCPToolset:连接 MCP 与 ADK,使 ADK Agent 能够调用 MCP 服务端所暴露的工具功能。

  • 若需在 Python 中构建 MCP 服务端,请使用 model-context-protocol 库。

2. 工具类型与集成方式

  • ADK 工具:如 BaseTool、FunctionTool 等 Python 对象,可直接在 ADK Agent 中使用。

  • MCP 工具:由 MCP 服务端提供的功能,经过 MCPToolset 适配后,可供 ADK Agent 调用。

  • 第三方工具:如 LangChain 和 CrewAI 提供的工具,可通过 LangchainTool 或 CrewaiTool 包装后集成到 ADK 中。

3. 异步架构设计

  • ADK 和 MCP 的 Python 实现均基于 Python 的 asyncio 框架构建。

  • 工具实现和服务端处理器应采用 async def 定义,以确保非阻塞执行。

4. MCP 中的有状态会话

  • 与常见的无状态 REST API 不同,MCP 建立的是持久、有状态的客户端与服务端连接。

  • 有状态机制支持上下文保留,但也要求开发者妥善管理会话状态。

5. 部署注意事项

  • MCP 的长连接特性在部署和扩展时可能带来挑战,尤其是在服务远程部署、同时处理多个用户的情况下。

  • 基础设施层面需考虑负载均衡与会话亲和性(session affinity),以维持连接稳定性。

6. 在 ADK 中管理 MCP 连接

  • MCPToolset 在 ADK 内部负责 MCP 连接的生命周期管理。

  • 使用 exit_stack 可确保在 Agent 执行结束后正确关闭连接,防止资源泄露。

🛠️ 常见问题排查(Troubleshooting)

默认情况下,ADK 库会要求配置 GCP 项目、Vertex AI 所在区域以及 VertexAI 的相关设置。请务必使用 GOOGLE_API_KEY,而不是 GEMINI_API_KEY,因为错误提示可能不会明确指出缺少的是哪个环境变量。

✅ 解决方案:确保将 API Key 设置为环境变量 GOOGLE_API_KEY。

ValueError: Missing key inputs argument! To use the Google AI API,provide (`api_key`) arguments. To use the Google Cloud API, provide (`vertexai`, `project` & `location`) arguments.

经常出现 429 和 500?

google.genai.errors.ClientError: 429 RESOURCE_EXHAUSTED. {'error': {'code': 429, 'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits.', 'status': 'RESOURCE_EXHAUSTED', 'details': [{'@type': 'type.googleapis.com/google.rpc.QuotaFailure', 'violations': [{'quotaMetric': 'generativelanguage.googleapis.com/generate_content_free_tier_requests', 'quotaId': 'GenerateRequestsPerDayPerProjectPerModel-FreeTier', 'quotaDimensions': {'model': 'gemini-2.0-pro-exp', 'location': 'global'}, 'quotaValue': '25'}]}, {'@type': 'type.googleapis.com/google.rpc.Help', 'links': [{'description': 'Learn more about Gemini API quotas', 'url': 'https://ai.google.dev/gemini-api/docs/rate-limits'}]}, {'@type': 'type.googleapis.com/google.rpc.RetryInfo', 'retryDelay': '27s'}]}}

An error occurred during execution: 500 INTERNAL. {'error': {'code': 500, 'message': 'An internal error has occurred. Please retry or report in https://developers.generativeai.google/guide/troubleshooting', 'status': 'INTERNAL'}}

✅ 解决方案:切换至 Gemini 2 Flash 模型。

原因:Gemini API 的“免费套餐(free tier)”是通过 API 服务提供的,适用于测试用途,其速率限制较低,容易触发请求限制。使用 Gemini 2 Flash 可有效缓解该问题。

📦 GitHub 项目地址 完整代码已发布至: 👉 arjunprabhulal/mcp-gemini-search

我们该怎样系统的去转行学习大模型 ?

很多想入行大模型的人苦于现在网上的大模型老课程老教材,学也不是不学也不是,基于此,我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近100余次后,终于把整个AI大模型的学习门槛,降到了最低!

在这个版本当中:

第一不需要具备任何算法和数学的基础
第二不要求准备高配置的电脑
第三不必懂Python等任何编程语言

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型教程已经给大家整理并打包,现在将这份 LLM大模型资料 分享出来: 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

一、大模型经典书籍(免费分享)

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

二、640套大模型报告(免费分享)

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、大模型系列视频教程(免费分享)

在这里插入图片描述

四、2025最新大模型学习路线(免费分享)

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1阶段:启航篇丨极速破界AI新时代

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理、关键技术以及大模型应用场景。

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体。

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调。

L5阶段:专题集丨特训篇 【录播课】

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方二维码,免费领取

Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐