Strands vs ADK实战:从零构建AI学习系统,谁更胜一筹?

开发者用Strands和ADK构建同一AI课程系统,对比揭示框架差异与实战陷阱。
本文基于开发者用Strands和Google ADK构建AI课程生成系统的真实复盘,对比了两个框架在文档抓取、类型化输出、反馈循环和成本控制等方面的表现。文章指出,模拟测试通过不等于系统可用,必须用真实模型验证;ADK的插件机制和函数节点更灵活,Strands的图执行上限和流式输出更直观;课程质量受审查严格度影响,Claude审查员比Gemini更严格;成本控制需跨调用累计计量,两个框架都需额外钩子。最终作者选择Strands,但建议无论用哪个框架,都让第二个模型审查第一个模型的输出。
Strands vs ADK实战:从零构建AI学习系统,谁更胜一筹?
当AI框架的对比从纸面参数转向真实项目,差距才真正显现。一位开发者用Strands和Google ADK同时构建了一个AI课程生成系统,从文档抓取到测验设计,从反馈循环到成本控制,两个框架的表现截然不同。本文基于其详细复盘,拆解其中的关键差异与踩坑经验。

为什么需要重新思考AI课程生成
作者在Part 1中提出「现在我们可以构建它了」,Part 2则真正动手:用两个框架实现同一个学习系统,并给出相同的请求来对比生成的课程质量。
第一个版本由Claude Opus生成,包含235个测试且全部通过。但作者发现,这些测试从未与真实模型对话。当接入真实模型后,第一次调用就失败了;即使最终生成Terraform课程,测验答案直接放在问题下方,每个练习都附带完成文件。于是整个项目被推倒重来。
这个故事揭示了一个常见陷阱:测试通过不等于系统可用。尤其在AI应用开发中,模拟模型与真实模型的行为差异可能让所有测试形同虚设。
学习系统应该具备什么能力
作者重新梳理了需求清单,这些也是评估两个框架的基准:
- 用户说明学习目标后,系统追问几个问题以定制课程;
- 内容覆盖实际工作场景,例如模块版本锁定;
- 信息与构建当天的官方文档同步;
- 通过动手练习和测试验证学习效果;
- 先尝试再看答案;
- 构建成本可控且透明。
这些需求决定了后续所有技术选型。
使用体验:一条命令启动课程生成
安装后,用户只需运行:
learn "I want to learn TypeScript so I can build a small web app"
系统会询问背景和目标,然后自动抓取官方文档、规划课程、编写课程内容。作者展示了一次真实运行的输出:检查了126个事实,规划了5个单元12节课,最终成本约2.94美元。
学习过程中,用户可以通过learn check运行真实测试,learn hint逐条获取提示,learn quiz先答题再看解析。这种设计确保了「先尝试后看答案」的原则。
技术架构:一个Brain接口,两种实现
整个系统围绕一个Brain协议构建:
class Brain(Protocol):
def ask(self, name: str, instruction: str, prompt: str, schema: type[T], research: bool = False) -> T:
"""One agent call, returning `schema`. With research=True the agent can search and read."""
Strands使用Claude Sonnet 4.6(通过Amazon Bedrock),ADK使用Gemini 3.8 Flash。每个框架以不同方式实现ask并运行自己的图结构。这种设计让对比更加公平。
研究者如何获取最新文档
两个框架在工具集成上差异明显。Strands本身不提供搜索工具,需要接入MCP服务器;ADK内置google_search但仅限Gemini模型。
作者使用同一个AWS文档MCP服务器测试。Strands接入MCPClient后直接传入tools参数;ADK则通过McpToolset集成。在读取页面方面,Strands的web_fetch支持markdown模式返回原文,便于逐字校验事实;ADK的load_web_page在重定向和短行过滤上存在问题,导致代码示例大量丢失。
一个关键发现是:模型可能给出错误答案。当问及S3对象大小限制时,Claude回答5TB,Gemini回答50TB,而AWS官方文档写的是50TB。Claude只搜索一次便引用了一个同时提到两个数字的结果,Gemini则继续深入阅读FAQ页面。这促使作者强制要求每个事实必须附带原文引用。
MCP(Model Context Protocol)是Anthropic于2024年底提出的开放协议,旨在标准化AI模型与外部工具、数据源的连接方式。它采用客户端-服务器架构,模型通过MCP客户端调用MCP服务器暴露的工具(如搜索、数据库查询、文件读取等)。本文中,开发者使用AWS文档MCP服务器来让AI获取最新官方文档,Strands通过MCPClient直接集成,而ADK则通过McpToolset封装。MCP的价值在于解耦:工具提供方只需实现一次MCP服务器,任何支持MCP的框架都能复用,避免了为每个框架重复开发集成代码。
类型化输出:Strands直接返回对象,ADK需手动转换
两个框架都支持Pydantic模型,但使用方式不同。Strands在调用时传入structured_output_model=,结果通过result.structured_output获取,直接是模型实例。ADK则在Agent上设置output_schema=,结果以字典形式存入会话状态,需要手动调用model_validate转换。
ADK还引入了一个隐藏问题:当Agent同时拥有output_schema和内置工具时,ADK会自动添加一个名为set_model_response的函数工具,导致与Gemini API的内置工具冲突,必须设置include_server_side_tool_invocations=True才能解决。这个错误无法被模拟模型的测试捕获。
Pydantic是Python生态中广泛使用的数据验证库,通过类型注解定义数据模型,自动执行运行时类型检查和转换。在AI智能体开发中,Pydantic模型常被用来约束大语言模型的输出格式:开发者定义一个继承自BaseModel的类(如CoursePlan),框架会将其转换为JSON Schema,要求模型按此结构生成内容,再自动解析为模型实例。这种方式比自由文本输出更可靠,便于后续程序化处理。本文中,两个框架都支持Pydantic模型作为输出Schema,但Strands直接返回模型实例,ADK则返回字典需手动调用model_validate转换,这反映了它们在类型化输出管道设计上的差异。
反馈循环:Strands有执行上限,ADK需要自己控制
在Strands中,图节点必须是Agent或MultiAgentBase子类,普通函数会在运行时抛出ValueError。作者将每个阶段包装成MultiAgentBase子类,并通过set_max_node_executions()设置最大执行节点数,超过后图状态变为FAILED。
ADK的节点可以是任意函数,更加灵活,但没有任何内置的循环次数限制,必须由路由函数自行决定何时停止。
两种实现都允许审查节点将问题发回上游,但作者发现一个真实问题:当审查要求补充研究时,Strands会丢弃已检查的306个事实,重新开始,导致单次成本高达11.81美元。修复后,研究阶段保留已验证内容,只补充缺失部分。
在基于图的智能体框架中,节点执行次数上限是防止无限循环的关键安全机制。Strands的图引擎要求节点必须是Agent或MultiAgentBase子类,并通过set_max_node_executions()设置硬性上限,超过后图状态变为FAILED,这能有效避免因逻辑错误或模型异常导致的无限重试和成本失控。ADK则更加灵活,节点可以是任意函数,但框架不提供内置的循环限制,开发者必须在路由函数中自行实现终止条件。这种设计差异体现了两种哲学:Strands偏向约束下的安全,ADK偏向自由下的责任自负。在实际项目中,缺乏硬性上限可能导致意外的高额API调用费用,因此需要额外注意。
成本控制:插件机制让ADK更胜一筹
课程生成涉及数百次模型调用,成本控制至关重要。Strands通过add_hook为每个Agent添加钩子,在模型调用前检查累计花费;ADK则通过before_model_callback和after_model_callback实现类似功能,并且支持插件机制,一次注册即可应用于所有Agent。
两个框架都存在异常传播的坑:Strands在工具执行后会将异常包装成EventLoopException;ADK则先发出错误事件,再在流结束时抛出异常。
真实成本数据显示,Strands构建Terraform课程花费18.36美元,ADK仅3.35美元(不含前期研究和规划)。但作者也修复了多个计量bug,例如使用id(agent)作为键导致计数错误,以及进程重启后预算重置。
为了应对成本上限,系统现在会在花费达到上限一半时自动切换到更便宜的模型,并明确告知用户。
在智能体框架中,钩子(hook)和回调(callback)是拦截和扩展模型调用生命周期的机制。Strands通过add_hook为每个Agent注册钩子,可在模型调用前检查累计花费并决定是否继续;ADK则提供before_model_callback和after_model_callback,并支持插件机制,一次注册即可全局应用于所有Agent。这种插件化设计减少了重复代码,更易于维护统一的成本控制策略。然而,两者都需要注意异常传播行为:Strands会将工具执行后的异常包装成EventLoopException,ADK则先发出错误事件再在流结束时抛出异常,这会影响错误处理和计量逻辑的准确性。
课程质量:事实数量与审查严格度的博弈
最终对比显示,Strands(Claude)检查了546个事实、生成23节课,但只有12个练习通过全部检查;ADK(Gemini)检查162个事实、生成12节课,全部练习通过检查。成本方面,ADK明显更低。
然而,作者亲自做练习后发现更多问题。ADK课程最初有5个练习无法通过自身检查,根源是测试使用了command = plan而非command = apply。修复后,又发现某些TODO即使不完成也能通过测试,于是增加了逐个TODO的验证机制。
测验答案分布也暴露了模型偏好:Gemini将正确答案放在第一位的概率高达83%,Claude则偏好第二位(58%)。系统现已加入选项随机化。
审查方面,Gemini审查员通过了ADK全部12节课,而Claude审查员对Strands课程一个都没通过。交换审查员后,Claude在ADK课程中发现了29个问题,大多真实存在。审查员的严格程度直接影响课程表面质量。
实际工作场景的缺失
作者特别指出,两个课程都遗漏了「模块版本锁定」这一日常工作实践。尽管文档中有提及,但研究者基于文档结构制定计划,未能将其作为独立目标。修复方案是在研究阶段明确列出「实际工作中会做什么」,并与课程目标一一对应。
另一个安全隐患是,Strands课程最后6节课配置为使用真实AWS账户,其中两节课要求运行terraform apply,可能导致用户无意中创建真实资源。虽然learn check使用模拟提供者不会触及AWS,但作者已更新README警告。
最终选择:Strands vs ADK
作者的个人选择是Strands,主要因为起步更简单、图执行有硬性上限、流式输出更直观。但ADK在以下方面更优:仅需Gemini API密钥即可运行、adk web提供浏览器内聊天和调用追踪、任意函数可作为工作流节点、google_search在查找最新版本时8次全部正确。
最终建议是:无论选择哪个框架,都让第二个模型来审查第一个模型的输出。两个框架都能运行相同的阶段和类型化答案,课程质量更多取决于模型能力和检查机制的完善程度。
所有课程代码已在GitHub仓库开源,每节课顶部列出已知问题,欢迎通过Issue反馈。
相关推荐

Cursor AI编程实战:30分钟从零构建学生管理系统
B站UP主实战演示Cursor AI编程:30分钟用自然语言生成学生管理系统。详解Agent模式、Claude模型选择、提示词技巧与使用门槛,帮你判断Cursor是否值得入手。

AI编程工具20强榜单:从夯到拉的评分矩阵
B站UP主发布AI编程工具20强榜单,从夯到拉分为T0-T4五个层级,Claude Code和Codex并列T0。本文详解评分维度(能力、可靠性、耐操性、耐久性、成本、国内可用性)及工具表现,帮助开发者选择适合的AI编程助手。

Vibe Coding系统教程:零基础玩转AI编程实战
B站UP主耗时三个月打造的Vibe Coding系统教程,覆盖Codex、ClaudeCode、Cursor等AI编程工具,从基础逻辑到商业级项目实战三段式讲解,适合零基础学习者系统入门AI编程。