介绍 Any-Agent:你的代码与众多智能体框架之间的抽象层

图片来自 Kevin Grieve / Unsplash
自 2022 年 ChatGPT 横空出世以来,生成式人工智能和大型语言模型(LLM)已成为文化焦点。这些工具在生活中的广泛和病毒式传播是前所未有、出乎意料的,并在某些方面引起争议:传播错误信息和通过其使用引入 自动化偏差 的风险是一个备受争议的话题。
提高由 LLM 提供支持的应用程序的可靠性、可解释性和能力一直是活跃的研究领域,并产生了诸如 检索增强生成(RAG)、结构化输出 和 工具使用 等技术。这些额外的能力可用于提高由 LLM 提供支持的聊天应用程序(例如 ChatGPT)的质量,并已集成到工作流自动化中,其中工作流是一系列预定义步骤,可在 LLM 的帮助下执行。
为了赋予 LLM 更强大的能力,它们可以集成到一个被社区称为“智能体”的框架中。这个术语相当模糊,但 Anthropic 在其 博客文章 中提供了一个有用的定义,明确区分了工作流和智能体:
“智能体”可以通过多种方式定义。一些客户将智能体定义为在长时间内独立运行的完全自主系统,它们使用各种工具来完成复杂的任务。另一些客户则使用该术语来描述遵循预定义工作流的更具规范性的实现。在 Anthropic,我们将所有这些变体归类为智能体系统,但在工作流和智能体之间划清了重要的架构界限。
- 工作流是通过预定义代码路径编排 LLM 和工具的系统。
- 另一方面,智能体是 LLM 动态指导其自身流程和工具使用,并保持对如何完成任务的控制的系统。
实现一个智能体并非易事:智能体必须可靠,并且设计清晰易懂,以便进行适当的评估和监控。为了实现这一目标,有大量的框架可用于帮助构建这些系统。有些框架是针对所使用的模型,有些是针对托管 LLM 的云提供商,还有一些则与模型和提供商无关。虽然并非详尽列表,但目前存在一些流行的选项,排名不分先后:OpenAI Agents Python SDK、LangGraph Python SDK、AWS Bedrock Agents SDK、Smolagents Python SDK、CrewAI Python SDK、AutoGen Python SDK 和 Agno Python SDK。
框架重要吗?
构建智能体的选项如此之多,选择框架似乎是一个随意决定:阅读文档并选择看起来最简单的 API 是否足够?目前尚不清楚框架会对智能体的性能产生巨大影响。尽管这是一个合理的假设,但事实证明它要复杂一些。智能体框架在实现智能体逻辑和路由方面相当有主见,即使对于像 ReAct 这样的明确处理框架也是如此。例如,Smolagents 库默认使用“CodeAgent”,它通过生成 python 代码执行所有任务,并具有 硬编码 的特定 LLM 提示文本。同样,Llama index 对错误处理有 硬编码文本。许多库可能还对默认的 system_prompt
做出了主观决定。即使可配置参数(如温度)设置为 0,提供给 LLM 的提示文本的差异也会导致不同的行为。
我们应该如何评估哪个框架最适合我们的使用?
人工智能智能体的世界才刚刚开始,随着选项的不断增多,如何在不锁定特定 API 的情况下选择框架变得很重要。尽管每个框架的语义和底层代码都不同,但它们中的许多都旨在高层次上完成类似的事情,我们发现提供一种通用语言来构建智能体可能很有用,无论您选择使用哪个框架来构建。
为此,今天我们分享一个我们已经开始着手开发的库,名为 Any-Agent!通过使用 Any-Agent,您只需构建一次智能体,当您想尝试最新最好的框架时,切换到新架构就像更改“AgentFramework”配置参数一样简单。此外,Any-Agent 处理日志规范化(由 open-inference 提供支持),因此无论您选择哪个框架,都可以看到一致的输出。
我们还 提供了一种评估 这些智能体的方法,采用“追溯优先”方法,该方法使用 LLM 作为判断者,帮助您确信智能体执行了您期望的步骤!
示例
让我们看一个简单的用例:在 LangChain 中创建一个代理,与在 smolagents 中创建一个代理(请注意,大多数真实的代理用例将比这复杂得多,涉及使用许多工具,可能还有模型上下文协议(MCP)服务器)。
以下是在 LangChain 中加载代理的代码:
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
model = ChatOpenAI(model="gpt-4o")
graph = create_react_agent(model)
def print_stream(stream):
for s in stream:
message = s["messages"][-1]
if isinstance(message, tuple):
print(message)
else:
message.pretty_print()
inputs = {"messages": [("user", "How many seconds would it take for a leopard at full speed to run through Pont des Arts?")]}
print_stream(graph.stream(inputs, stream_mode="values"))
以下是在 smolagents 中加载代理的代码:
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel
model = HfApiModel()
agent = CodeAgent(model=model)
agent.run("How many seconds would it take for a leopard at full speed to run through Pont des Arts?")
现在,您可以通过仅更改一个变量来使用 Any-Agent 运行其中任何一个。
from any_agent import AgentConfig, AgentFramework, AnyAgent
agent = AnyAgent.create(
AgentFramework("langchain"), # Set to "langchain" or "smolagents"
AgentConfig(model_id="gpt-4o-mini")
)
agent.run("How many seconds would it take for a leopard at full speed to run through Pont des Arts?")
Any-Agent 库还旨在为所有代理框架加载和配置 MCP 服务器,避免开发人员需要理解为所选代理框架加载 MCP 服务器的语义。
结论
使用代理框架进行构建和评估可能很复杂,但 Any-Agent 库使我们的团队更容易比较和测试不同的代理框架。AI 代理在提高生产力方面具有惊人的潜力,我们发现 Any-Agent 是探索这种潜力的宝贵工具。
我们希望您会在实验和项目中发现此库的实用性,并期待听到您的想法(https://github.com/mozilla-ai/any-agent)。