从零开始,亲手开发你的第一个AI大模型!(三)Agent实战
在我上一篇文章中,我们探讨了如何通过 Model Context Protocol(MCP)将 Gemini 大模型集成为 MCP 客户端,从而实现结构化、具备工具调用能力的智能交互,同时也介绍了 MCP 的核心理念、典型应用场景,并展示了相关演示。而本篇文章将进一步深入,重点讲解如何借助 ADK 中的 Agent,以 MCP 客户端的形式调用外部 MCP 工具的能力,配合 Gemini 大模型,
在我上一篇文章中,我们探讨了如何通过 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 可以实现以下功能:
- 建立连接:通过
StdioServerParameters,定义启动 MCP 服务进程所需的命令及参数,从而初始化连接。 - 发现可用工具:
MCPToolSet连接 MCP 服务端,并获取该服务端所暴露的所有可用工具列表。 - 集成工具到 Agent:将发现的工具适配成 ADK Agent 可识别和调用的格式,实现运行过程中的无缝工具调用。
- 管理连接生命周期:
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("资源清理完成。")
Step7:运行你的Demo吧!
query = "Find flights from Atlanta to Las Vegas 2025-05-05"
Demo with Standard Logging:

已关注
关注
重播 分享 赞
关闭
观看更多
更多
退出全屏
切换到竖屏全屏**退出全屏
AI拍档已关注
分享视频
,时长00:09
0/0
00:00/00:09
切换到横屏模式
继续播放
进度条,百分之0
[播放](javascript:😉
00:00
/
00:09
00:09
全屏
倍速播放中
[ 0.5倍 ](javascript:😉[ 0.75倍 ](javascript:😉[ 1.0倍 ](javascript:😉[ 1.5倍 ](javascript:😉[ 2.0倍 ](javascript:😉
[ 超清 ](javascript:😉[ 流畅 ](javascript:😉
您的浏览器不支持 video 标签
继续观看
从零开始,亲手开发你的第一个AI大模型!(三)Agent实战
观看更多
转载
,
从零开始,亲手开发你的第一个AI大模型!(三)Agent实战
AI拍档已关注
分享点赞在看
已同步到看一看[写下你的评论](javascript:😉
[ 视频详情 ](javascript:😉
Demo with Debug logging:

已关注
关注
重播 分享 赞
关闭
观看更多
更多
退出全屏
切换到竖屏全屏**退出全屏
AI拍档已关注
分享视频
,时长00:18
0/0
00:00/00:18
切换到横屏模式
继续播放
进度条,百分之0
[播放](javascript:😉
00:00
/
00:18
00:18
全屏
倍速播放中
[ 0.5倍 ](javascript:😉[ 0.75倍 ](javascript:😉[ 1.0倍 ](javascript:😉[ 1.5倍 ](javascript:😉[ 2.0倍 ](javascript:😉
[ 超清 ](javascript:😉[ 流畅 ](javascript:😉
您的浏览器不支持 video 标签
继续观看
从零开始,亲手开发你的第一个AI大模型!(三)Agent实战
观看更多
转载
,
从零开始,亲手开发你的第一个AI大模型!(三)Agent实战
AI拍档已关注
分享点赞在看
已同步到看一看[写下你的评论](javascript:😉
[ 视频详情 ](javascript:😉
将 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 可有效缓解该问题。
': ‘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

大模型岗位需求
大模型时代,企业对人才的需求变了,AIGC相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。
掌握大模型技术你还能拥有更多可能性:
• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;
• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;
• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;
• 更优质的项目可以为未来创新创业提供基石。
可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把全套AI技术和大模型入门资料、操作变现玩法都打包整理好,希望能够真正帮助到大家。
读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用
零基础入门AI大模型
今天贴心为大家准备好了一系列AI大模型资源,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
有需要的小伙伴,可以点击下方链接免费领取【保证100%免费】
内容包括:项目实战、面试招聘、源码解析、学习路线。





如果大家想领取完整的学习路线及大模型学习资料包,可以扫下方二维码获取
👉2.大模型配套视频👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。(篇幅有限,仅展示部分)

大模型教程
👉3.大模型经典学习电子书👈
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(篇幅有限,仅展示部分,公众号内领取)

电子书
👉4.大模型面试题&答案👈
截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(篇幅有限,仅展示部分,公众号内领取)

大模型面试
**因篇幅有限,仅展示部分资料,**有需要的小伙伴,可以点击下方链接免费领取【保证100%免费】
**或扫描下方二维码领取 **

更多推荐


所有评论(0)