各种开源智能体框架的提及度和GitHub星标数
我们都听说过CrewAI和AutoGen,但您知道吗,目前已有数十种开源智能体框架,其中许多是在过去一年中发布的。
我们简单测试了一些较受欢迎的框架,以了解它们的工作原理和上手难度。接下来将逐一介绍每个框架的特点。
本文将重点介绍LangGraph、Agno、SmolAgents、Mastra、Pydantic AI和Atomic Agents,同时也会将它们与CrewAI和AutoGen进行对比。
我们如何对比不同的框架
我们将探讨这些框架的实际功能、不同的设计选择、它们之间的差异,以及背后的一些思想流派。
智能体AI
智能体AI本质上是围绕大型语言模型(LLMs)构建系统,使其具备准确的知识、数据访问能力和行动能力。你可以将其理解为使用自然语言来自动化流程和任务。
在自动化中使用自然语言处理(NLP)并非新鲜事——多年来我们一直使用NLP来提取和处理数据。新的变化在于,我们现在可以给予语言模型更大的自由度,让它们能够处理模糊信息并动态做出决策。
通过自然语言进行动态路由——大型语言模型(LLMs)能够解读模糊信息
但这仅仅因为大型语言模型(LLMs)能够理解语言,并不意味着它们具有自主能力——甚至不意味着它们理解你试图自动化的任务。这就是为什么构建可靠的系统需要大量工程设计的原因。
框架的作用是什么?
本质上,智能体框架能帮助你进行提示词工程,并实现与大型语言模型(LLMs)之间的数据路由——但它们还提供了额外的抽象层,让上手变得更简单。
如果你要从零开始构建一个系统,让大型语言模型调用不同的API(即工具),你需要在系统提示词中定义这一点。然后,你会要求大型语言模型在返回响应的同时,告知它想调用的工具,这样系统才能解析并执行API调用。
大型语言模型接收提示词的示意图(实际文本远多于图中所示)
所以本质上,我们说的是提示词工程——它是任何框架的基础。
框架通常在两方面提供帮助:一是合理构建提示词,确保大型语言模型按正确格式响应;二是解析响应,将其路由到正确的工具(无论是API、文档还是其他什么)。
在构建知识体系时,框架可能会帮助进行文档分块、嵌入处理和存储。这些内容会作为上下文添加到提示词中,类似我们构建标准RAG系统的方式。
框架还能在错误处理、结构化输出、验证、可观测性、部署等方面提供支持——总体而言,它能帮你组织代码,以便构建更复杂的系统,比如多智能体架构。
不过,很多人觉得使用完整的框架有些小题大做。
问题在于:如果大型语言模型没有正确使用工具,或者出现故障,抽象层就会变成麻烦,因为你很难对其进行调试。如果你切换模型,这也可能成为问题——系统提示词可能是为某一个模型量身定制的,换到其他模型上可能不适用。
这就是为什么有些开发者会重写框架的部分内容——比如LangGraph中的create_react_agent——以获得更好的控制权。
有些框架更轻量,有些则更厚重并提供额外功能,但它们都有相应的社区支持,帮助你入门。而且一旦你学会了一个(包括其底层工作原理),再学其他的就会更容易。
不同的开源框架
我们确实会参考社区的反馈,来了解一个框架在实际场景中的表现。但最受欢迎的框架未必总是理想之选。
我们都听说过的有CrewAI和AutoGen。CrewAI是一个高抽象度的框架,它隐藏了底层细节,能让你快速构建智能体系统。AutoGen专注于自主、异步的智能体协作,智能体可以自由地按照自己的方式协作——这可能让它更适合测试和研究。
主流且广为人知的库
LangGraph虽然已经相当知名,但值得作为开发者的主要框架之一被重点提及。它采用基于图的方法,你可以构建节点并通过智能体将它们连接起来。与前两者相比,它让你对工作流有更严格的工程控制,且不预设智能体应该拥有多少自主性。
需要注意的是,很多人认为LangGraph的抽象层过于复杂,且难以调试。其特点是学习曲线陡峭,但一旦掌握了基础知识,就会变得容易。
接下来,我还想介绍几个较新的框架。
Agno(前身为Phi-Data),它专注于提供极佳的开发者体验。它的文档也是我见过最清晰的之一。它非常“即插即用”,通过大量内置功能帮助你快速上手,这些功能被组织成符合逻辑、清晰易懂的抽象层。
SmolAgents是一个极简框架,它引入了一种智能体——CodingAgent,这种智能体通过代码而非JSON进行数据路由。它还能让你直接访问整个Hugging Face模型库,开箱即用。
代码智能体通过代码而非JSON进行数据路由(大多数其他框架采用JSON)
至于那些不常被提及的开源框架:
PydanticAI基于Pydantic构建,抽象层极少,是一个高度透明的极简框架。当你需要严格的类型安全、可预测的经过验证的输出,以及细粒度控制(以便更容易调试)时,它非常合适。
Atomic Agents由一位独立的智能体构建者开发,它采用基于 schema 的构建块,像乐高一样拼接在一起,非常注重结构和控制。它的诞生源于实际应用中缺乏好用的替代方案。
PydanticAI和Atomic Agents的目标都是摆脱独立行动的“黑箱”AI。
Mastra由Gatsby团队打造,是一个JavaScript框架,专为前端开发者设计,方便他们在自己的生态系统中构建智能体。
较非主流的框架及其发布时间
接下来,我们会逐一介绍这些框架的特点以及它们的独特之处。
它们的共同特点
大多数框架都具备相同的核心组件:对不同模型、工具、内存和RAG的支持。
大多数开源框架在很大程度上是模型无关的,这意味着它们被设计为支持多种提供商。不过,如前所述,每个框架都有自己的系统提示词结构——而这种结构可能更适合某些模型。
这也是为什么理想情况下,你希望能够访问系统提示词,并在需要时对其进行调整。
所有智能体框架都支持工具功能,因为工具是构建具备行动能力的系统的核心。它们还通过简单的抽象层,让你能轻松定义自己的自定义工具。如今,大多数框架要么官方支持MCP,要么通过社区解决方案支持。
它们通常具备的功能示意图
需要注意的是,并非所有模型都支持函数调用——而函数调用是使用工具的必要条件。若想了解哪些模型最适合作为基础LLM,你可以查看Hugging Face的智能体排行榜。
为了让智能体在LLM调用之间保留短期记忆,所有框架都会使用状态(state)。状态能帮助LLM记住之前步骤或对话部分中的内容。
大多数框架还提供简单的选项,可通过不同数据库搭建RAG,为智能体提供知识支持。
最后,几乎所有框架都支持异步调用、结构化输出、流式传输以及添加可观测性的能力。
部分框架缺失的功能
框架在某些方面存在差异,例如对多模态输入、内存和多智能体系统的支持。有些框架会为你处理这些,而另一些则需要你自行搭建连接。
首先,部分框架拥有处理多模态(即文本、图像和语音)的内置解决方案。只要模型支持,你也可以自己实现这些功能。
如前所述,短期记忆(状态)是所有框架都包含的——没有它,就无法构建使用工具的系统。然而,长期记忆的实现更为复杂,这也是框架之间存在差异的地方。有些框架提供内置解决方案,而另一些则需要你自行连接其他解决方案。
框架在处理多智能体能力方面也有所不同。多智能体系统允许你构建协作或分层结构,由多个智能体组成团队,通过监督者连接。
大多数框架建议让智能体专注于特定任务——范围狭窄,工具集有限。这意味着你可能需要构建智能体团队来处理复杂工作流。所有框架都能让你构建一个团队,但有些在扩展到具有多层的多分层系统时会变得复杂。
这正是LangGraph脱颖而出的地方——你可以构建节点,将它们连接到各种监督者,并可视化不同团队的交互方式。在大规模构建多智能体系统时,它显然是最灵活的。
Agno最近新增了对团队的支持,包括协作型和分层型,但目前针对更复杂的多分层结构的示例还不多。
SmolAgents允许你将智能体连接到监督者,但随着系统规模扩大,可能会变得复杂。它在智能体团队结构方面让我想起了CrewAI。Mastra在这方面与之类似。
对于PydanticAI和Atomic Agents,你需要手动链接智能体团队,因此编排工作由你负责。
它们的差异之处
框架的差异体现在它们的抽象程度、赋予智能体的自主性,以及让系统运行所需的编码量上。
首先,有些框架着重包含大量内置功能,方便快速上手。
可以说,Mastra、CrewAI,以及在某种程度上Agno,都是为“即插即用”设计的。
各种框架的抽象程度对比
LangGraph也有相当程度的抽象,但它采用基于图的系统,需要手动连接节点。这赋予你更多控制权,但也意味着你必须自行设置和管理所有连接,因此学习曲线较陡峭。
接下来是低抽象层框架,如PydanticAI、SmolAgents和Atomic Agents。
这些框架注重透明性,但通常需要你自己构建编排逻辑。这能让你获得完全控制权,也便于调试——但会增加构建时间。
另一个差异点是框架赋予智能体的自主性程度。有些框架的设计理念是,大型语言模型足够智能,能自主完成任务;另一些则倾向于严格控制——让智能体专注于单一任务,并逐步引导其执行。
AutoGen和SmolAgents属于前者,其余则更倾向于控制。
各种框架的智能体自主性程度对比
这里有一点需要考虑:开发者构建注重严格控制的框架,往往是因为他们尚未找到让智能体自主工作的可靠方法——至少目前还不可靠。
这个领域也越来越趋近于工程化。
如果你要构建这些系统,确实需要了解编程。真正的问题是,不同框架对技术能力的要求有多大差异。
构建不同框架所需的经验水平
如果你经验较少,选择CrewAI、Agno或Mastra可能是个不错的主意。
对于简单场景,SmolAgents也相当直观。
至于PydanticAI、Atomic Agents和LangGraph——你需要自己编写更多逻辑。不过公平地说,也完全可以构建一个智能体来帮助你正确结构化代码。
如果你完全是编程新手,可以看看Flowise或Dify。
最后,值得一提的是这些框架的开发者体验。
据我观察,大多数开发者认为CrewAI和AutoGen调试起来比较棘手。SmolAgents的CodeAgent引入了一种新颖的方法,让智能体通过输出代码来路由数据——想法很酷,但并非总能按预期工作。
LangGraph,尤其是与LangChain结合使用时,学习曲线陡峭,且存在一些令人困惑的抽象层,你可能最终需要拆分并重新构建这些抽象层。
PydanticAI和Atomic Agents总体上受到开发者的喜爱,但它们却确实需要你自己构建编排逻辑。
Agno和Mastra是可靠的选择,但你可能会遇到诸如循环调用之类的问题,这类问题难以调试。