支持私有云部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Agent框架大比拼:谁将引领智能应用的未来?

发布日期:2025-04-01 05:25:03 浏览次数: 1593 作者:算法狗
推荐语

探索人工智能的未来,了解代理框架如何塑造智能应用的新纪元。

核心内容:
1. 代理框架的核心概念及其对AI领域的影响
2. 开源解决方案在代理框架中的重要性和优势
3. 流行的代理框架和工具:LangChain、LangGraph、CrewAI的特点与应用

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家

1. 引言

代理框架(Agentic Frameworks)通过使自主系统能够动态地感知、推理和行动,彻底改变了人工智能领域。本节探讨了代理框架的核心概念,并强调了为什么开源解决方案对于现代人工智能开发中的创新和可扩展性至关重要。

1.1 什么是代理框架?

代理框架代表了人工智能系统设计范式的转变。与依赖于静态、预定义工作流的传统人工智能应用不同,代理框架引入了能够自主感知、推理和行动的动态、自适应系统。这些框架使复杂任务能够被分解为更小的子任务,由专门的代理协作完成更广泛的目标。通过利用大型语言模型(LLMs),代理框架能够管理工作流、做出决策并无缝集成工具,使其成为动态决策和实时问题解决等高级应用的理想选择。

关键参考:像 LangGraph 和 CrewAI 这样的代理框架体现了这种动态方法,使开发人员能够超越单代理、线性工作流,进入多代理、协作系统的领域。

1.2 为什么它们很重要?

从头开始构建代理并非易事。像 LangGraph、CrewAI 和 OpenAI Swarm 这样的框架简化了这一过程,使开发人员能够专注于他们的应用逻辑,而不是为状态管理、编排和工具集成重新发明轮子。

在核心层面,代理框架提供了:

  • 一种简单的方法来定义代理和工具
  • 一种编排机制
  • 状态管理
  • 用于启用更复杂应用的附加工具,例如:持久层(内存)、中断等

我们将在接下来的部分中逐一介绍这些内容。

2. 流行的代理框架与库

现在,让我们深入了解目前可用的一些最突出的人工智能代理框架和工具:

2.1 LangChain

LangChain 是一个强大且灵活的框架,使开发大型语言模型(LLMs)驱动的应用程序变得更加容易。凭借其丰富的工具集和抽象层,开发人员可以设计出具备复杂推理、任务执行以及与外部数据源和 API 交互的强大人工智能代理。

从根本上说,开发人员在与 LLMs 协作时面临诸多挑战,例如在长时间对话中保持上下文、整合外部信息以及协调多步骤项目。LangChain 正是为解决这些问题而设计的。由于其模块化架构,该框架可以轻松组合各种组件,并用于多种用途。

GitHub 链接LangChain GitHub
文档链接LangChain 官方文档

2.2 LangGraph

LangGraph 是 LangChain 的一个扩展,用于创建基于大型语言模型(LLMs)的状态化、多代理应用。它特别适合构建涉及规划、反思和多代理协调的复杂、交互式人工智能系统。

GitHub 链接LangGraph GitHub
文档链接LangGraph 官方文档

2.3 CrewAI

CrewAI 是一个用于编排角色扮演人工智能代理的框架。它允许开发人员创建一个“团队”,每个代理都有特定的角色和职责,共同完成复杂任务。这个框架特别适合构建能够解决多面问题的协作人工智能系统,这些问题需要多样化的专业知识和协调一致的努力。

GitHub 链接CrewAI GitHub
文档链接CrewAI 官方文档

2.4 Microsoft Semantic Kernel

Microsoft Semantic Kernel 旨在弥合传统软件开发与人工智能能力之间的差距。它特别关注将大型语言模型(LLMs)集成到现有应用中。这个框架为开发人员提供了在不完全推翻现有代码库的情况下,整合人工智能功能的工具。

SDK 的轻量级特性和对多种编程语言的支持使其能够高度适应各种开发环境。其编排器能够管理复杂的多步骤人工智能任务,使开发人员能够在应用中创建复杂的人工智能驱动工作流。

GitHub 链接Microsoft Semantic Kernel GitHub
文档链接Microsoft Semantic Kernel 官方文档

2.5 Microsoft AutoGen

Microsoft AutoGen 是一个开源框架,用于构建高级人工智能代理和多代理系统。由微软研究院开发,AutoGen 提供了一个灵活且强大的工具集,用于创建对话式和任务完成型人工智能应用。它强调模块化、可扩展性和易用性,使开发人员能够高效地构建复杂的人工智能系统。

文档链接Microsoft AutoGen 官方文档
GitHub 链接Microsoft AutoGen GitHub

2.6 Smolagents

Smolagents 是一个前沿的开源框架,旨在彻底改变人工智能代理的开发。它为开发人员提供了一个全面的工具包,用于构建智能的、协作的多代理系统。该框架专注于灵活性和模块化,能够创建独立运行或在人类监督下协作的复杂人工智能系统。

文档链接Smolagents 官方文档
GitHub 链接Smolagents GitHub

2.7 Agno (Phidata)

我们讨论的最后一个代理框架是 Phidata。它是一个多模态代理框架,能够开发协作运行的代理系统。它还设计了与组件(如内存和工具)协同工作的功能,帮助它们自主且一致地运行。

Phidata 代理默认支持多模态数据,如文本、图像和音频数据,使其无需依赖外部工具即可发挥价值。该框架还提供了代理的可视化界面(Agentic UI),以便用户与代理进行视觉交互。它也是率先引入代理检索增强生成(Agentic RAG)的框架,代理可以搜索知识库以获取所需信息。

文档链接Phidata 官方文档
GitHub 链接Phidata GitHub

3. 代理框架的比较

下图提供了一个高层次的比较,涵盖了本文讨论的关键人工智能代理框架。此比较旨在突出每个框架的独特优势和关注领域,帮助开发人员和研究人员为特定需求选择最合适的工具。

4. 深入了解 LangGraph

LangGraph 是由 LangChain 团队开发的一个库,旨在帮助开发人员创建基于图的单代理或多代理人工智能应用。作为一个低级框架,LangGraph 让你能够控制代理之间的交互方式、使用的工具以及应用内的信息流动。

4.1 什么是图?

想象你有一组数据,可以表示为一个网络,其中每个数据或实体与其他数据或实体存在关系,这种关系可以有多种类型(一对一、一对多、多对多等)。图的两个主要组成部分是节点和边。

这种类型数据的一些例子包括交通数据或社交媒体网络,其中每个实体或用户与其他实体或用户存在关系,这就是图在可视化这种数据时的优势所在。

图有两种类型:

  • 有向图:在有向图中,边有方向,表示节点之间的流动或关系(例如,在社交媒体上关注某人)。
  • 无向图:在无向图中,边没有方向,表示对称关系(例如,在领英上的连接)。

4.2 核心概念

4.2.1 图结构

LangGraph 的设计核心是基于图的应用工作流表示。这个图包含两个主要元素:

  • 节点:工作单元的构建块
    图中的每个节点代表应用内的一个独立工作单元或动作。这些节点本质上是封装特定任务的 Python 函数。这些任务可以包括:

    • 直接与 LLM 交互以进行文本生成、总结或其他基于语言的任务。
    • 与外部工具和 API 交互以获取数据或在现实世界中执行动作。
    • 通过格式化、过滤或转换等过程处理数据。
    • 与用户交互以收集输入或显示信息。
  • :信息和控制流的引导者
    边是 LangGraph 内的连接组织,建立信息流动的路径并决定操作的顺序。LangGraph 支持多种边类型:

    • 简单边:表示从一个节点到另一个节点的直接且无条件的流动。第一个节点的输出作为后续节点的输入,形成线性进展。
    • 条件边:引入动态性,允许工作流根据特定节点操作的结果进行分支。例如,根据用户的响应,图可能会决定终止交互或调用工具。这种决策能力对于创建能够适应不同情况的应用程序至关重要。

4.2.2 状态管理

管理多代理系统的一个关键方面是确保所有代理对当前任务的状态有一个共同的理解。LangGraph 通过自动状态管理来解决这一问题。这意味着该库会自动处理跟踪和更新代理执行任务时的中心状态对象。

这个状态对象充当一个存储库,用于存储需要在工作流的不同点之间共享的关键信息。这可能包括:

  • 对话历史:在聊天机器人应用中,状态可以存储用户与机器人之间的持续对话,以便生成上下文相关的回应。
  • 上下文数据:与当前任务相关的信息,如用户偏好、过去的行为或相关的外部数据,可以存储在状态中,供代理在决策时使用。
  • 内部变量:代理可能会使用状态来跟踪内部标志、计数器或其他指导其行为和决策的变量。

5. 动手实践 LangGraph

5.1 安装

要开始使用 LangGraph,你需要安装它。

在终端或命令提示符中运行以下命令以安装 LangGraph:

pip install -U langgraph

此命令将下载并安装 LangGraph 的最新版本。-U 标志确保你获得最新版本。

5.2 使用 LangGraph 创建一个基础聊天机器人

这个示例是理解 LangGraph 基本概念的良好起点。

1. 导入必要的库

首先,从 LangGraph 和其他相关库中导入所需的类和模块。

from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages

2. 定义状态结构

创建一个类来定义状态对象的结构,该状态对象将在图的节点之间共享和更新信息。

class State(TypedDict):
    # 'messages' 用于存储聊天机器人的对话历史。
    # 'add_messages' 函数确保新消息被追加到列表中。
    messages: Annotated[list, add_messages]

# 创建一个 StateGraph 实例,传入 State 类。
graph_builder = StateGraph(State)

3. 初始化 LLM

实例化你选择的 LLM 模型,并提供必要的 API 密钥或配置参数。这个 LLM 将用于为聊天机器人的回应提供支持。

# pip install -U langchain_anthropic
from langchain_anthropic import ChatAnthropic

llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")

4. 创建聊天机器人节点

定义一个封装聊天机器人逻辑的 Python 函数。这个函数将接收当前状态作为输入,并根据 LLM 的输出生成回应。

def chatbot(state: State):
    # 使用 LLM 根据当前对话历史生成回应。
    response = llm.invoke(state["messages"])

    # 返回更新后的状态,其中包含新追加的消息。
    return {"messages": [response]}

# 将 'chatbot' 节点添加到图中。
graph_builder.add_node("chatbot", chatbot)

5. 定义入口和结束点

指定图内工作流的起点和终点。

# 对于这个基础聊天机器人,'chatbot' 节点既是入口点也是结束点。
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)

6. 编译图

通过编译创建一个可运行的图实例。

graph = graph_builder.compile()

7. 可视化图

通过运行简单的 Python 代码,你可以可视化图中的节点和边。

from IPython.display import Image, display

try:
    display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
    # 这需要一些额外的依赖项,是可选的
    pass

8. 运行聊天机器人

实现一个循环以与用户交互,将用户输入传递给图,并显示聊天机器人的回应。

while True:
    user_input = input("用户:")
    if user_input.lower() in ["退出""退出""q"]:
        print("再见!")
        break

    # 通过 LangGraph 处理用户输入。
    for event in graph.stream({"messages": [("用户", user_input)]}):
        for value in event.values():
            print("助手:", value["messages"][-1].content)

此代码片段为 LangGraph 聊天机器人提供了基本结构。你可以通过引入更复杂的状态管理、不同的 LLM 模型或连接到外部工具和 API 来扩展它。关键是为不同任务定义清晰的节点,并使用边来建立聊天机器人内信息和控制流动的期望路径。

5.3 高级 LangGraph 技术

工具集成

将工具集成到你的 LangGraph 聊天机器人中可以显著增强其能力,使其能够以你希望的方式访问和处理信息。

为我们的基础聊天机器人增强工具集成

让我们修改上一节中创建的基础聊天机器人,以包含一个可以搜索网络信息的工具。我们将使用 langchain_community.tools.tavily_search 中的 TavilySearchResults 工具。此示例需要 Tavily API 密钥。

# pip install -U tavily-python langchain_community
from typing import Annotated
from langchain_anthropic import ChatAnthropic
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import BaseMessage
from typing_extensions import TypedDict

from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
class State(TypedDict):
    messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)

tool = TavilySearchResults(max_results=2)
tools = [tool]
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")
llm_with_tools = llm.bind_tools(tools)

def chatbot(state: State):
    return {"messages": [llm_with_tools.invoke(state["messages"])]}

graph_builder.add_node("chatbot", chatbot)

tool_node = ToolNode(tools=[tool])
graph_builder.add_node("tools", tool_node)

graph_builder.add_conditional_edges(
    "chatbot",
    tools_condition,
)
graph_builder.add_edge("tools""chatbot")
graph_builder.set_entry_point("chatbot")

graph = graph_builder.compile()

解释:

  • 导入工具:导入所需的工具类,本例中为 TavilySearchResults
  • 定义和绑定工具:创建工具实例,并使用 llm.bind_tools() 将其绑定到 LLM。这会告知 LLM 可用的工具及其使用方式。
  • 创建 ToolNode:实例化一个 ToolNode,传入可用工具列表。
  • 将 ToolNode 添加到图中:使用 graph_builder.add_node() 将 ToolNode 添加到 LangGraph 中。
  • 条件路由:使用 graph_builder.add_conditional_edges() 根据 LLM 是否决定调用工具来设置路由逻辑。tools_condition 函数会检查 LLM 的响应是否包含工具调用指令。
  • 循环回:在执行工具后,使用 graph_builder.add_edge() 将流程导向聊天机器人节点,以便对话继续进行。

现在,当你运行聊天机器人并提出需要外部信息的问题时,LLM 可以选择调用网络搜索工具,检索相关信息,并将其纳入回应中。

6. 为聊天机器人添加记忆功能

记忆对于创建能够通过记住过去互动来进行有意义对话的聊天机器人至关重要。

LangGraph 的检查点系统

  • 检查点器(Checkpointer):当你编译 LangGraph 时,你可以提供一个检查点器对象。这个对象负责在不同时间点保存图的状态。
  • 线程 ID(Thread ID):每次调用图时,你提供一个线程 ID。检查点器使用这个 ID 来跟踪不同的对话线程。
  • 自动保存和加载:LangGraph 在给定线程 ID 的图执行的每个步骤后自动保存状态。当你再次使用相同的线程 ID 调用图时,它会自动加载保存的状态,使聊天机器人能够从上次停止的地方继续对话。

使用检查点实现记忆

在前面的代码基础上,以下是如何使用 LangGraph 的检查点功能添加记忆:

# ... (前面定义 State、graph_builder、节点和边的代码)

from langgraph.checkpoint.memory import MemorySaver

# 创建一个 MemorySaver 对象作为检查点器。
memory = MemorySaver()

# 编译图时,传入 'memory' 对象作为检查点器。
graph = graph_builder.compile(checkpointer=memory)

解释:

  • 导入 MemorySaver:从 langgraph.checkpoint.memory 导入 MemorySaver 类。
  • 创建 MemorySaver 对象:实例化 MemorySaver 对象,它将负责保存和加载图的状态。
  • **传入 compile()**:在编译图时,将 memory 对象作为 checkpointer 参数传入。

现在,当你运行聊天机器人时,首先使用一个 thread_id 作为此对话的键:

config = {"configurable": {"thread_id""1"}}

每个唯一的 thread_id 将存储其对话历史。

现在开始对话:

while True:
    user_input = input("用户:")
    if user_input.lower() in ["退出""退出""q"]:
        print("再见!")
        break

    # 通过 LangGraph 处理用户输入。
    for event in graph.stream({"messages": [("用户", user_input)]}, config):
        for value in event.values():
            print("助手:", value["messages"][-1].content)

注意config 在调用图时作为第二个位置参数提供。

7. 人机协作(Human-in-the-Loop)

人机协作工作流对于需要在人工智能应用中纳入人类监督、验证或决策的情况至关重要。

使用中断实现人机协作

以下代码展示了如何使用 LangGraph 的 interrupt_before 或 interrupt_after 功能实现人机协作。以下是代码分解:

from typing import Annotated

from langchain_anthropic import ChatAnthropic
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import BaseMessage
from typing_extensions import TypedDict

from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
class State(TypedDict):
    messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)

tool = TavilySearchResults(max_results=2)
tools = [tool]
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")
llm_with_tools = llm.bind_tools(tools)

def chatbot(state: State):
    return {"messages": [llm_with_tools.invoke(state["messages"])]}

graph_builder.add_node("chatbot", chatbot)

tool_node = ToolNode(tools=[tool])
graph_builder.add_node("tools", tool_node)

graph_builder.add_conditional_edges(
    "chatbot",
    tools_condition,
)
graph_builder.add_edge("tools""chatbot")
graph_builder.set_entry_point("chatbot")

memory = MemorySaver()
graph = graph_builder.compile(
    checkpointer=memory,
    # 这是新的内容!
    interrupt_before=["tools"],
    # 注意:也可以在动作后中断,如果需要的话。
    # interrupt_after=["tools"]
)

解释:

在本例中,图将在执行工具节点之前暂停。这个工具节点负责运行 LLM 在其回合中可能请求的任何工具。在这个点中断,你可以让人类:

  • 批准工具调用:人类可以审查 LLM 想要进行的工具调用及其输入。如果他们认为合适,可以简单地允许图继续执行,工具将被执行。
  • 修改工具调用:如果人类认为需要调整 LLM 的工具调用(例如,细化搜索查询),他们可以修改图的状态,然后恢复执行。
  • 跳过工具调用:人类可能决定工具并非必要。也许他们已经知道 LLM 正在尝试查找的答案。在这种情况下,他们可以用适当的信息更新图的状态,LLM 将收到它,就好像工具返回了这些信息一样。

资源:以下是 Notebook,以更详细地了解人机协作。

8. LangGraph 的实际应用场景

LangGraph 让你能够构建比简单问答机器人更复杂、更具互动性的人工智能系统,通过管理状态、协调多个代理以及允许人类反馈来实现。以下是 LangGraph 可能的一些应用场景:

  • 更智能的客户服务:想象一个用于在线购物的聊天机器人,它可以记住你的过往订单和偏好。它可以回答有关产品的问题,跟踪你的包裹,甚至在需要时将你连接到人工客服代表。
  • 人工智能研究助手:需要研究项目帮助吗?由 LangGraph 提供支持的助手可以搜索大量学术论文和文章,总结关键发现,甚至帮助你整理笔记。
  • 个性化学习:LangGraph 可以为下一代教育平台提供动力。想象一个能够适应你的学习风格、识别你需要额外帮助的领域并推荐个性化资源的系统。
  • 业务流程优化:许多业务流程涉及多个步骤和人员。LangGraph 可以自动化这些工作流的部分,例如路由审批文件、分析数据或管理项目。

这些示例突显了 LangGraph 如何弥合人工智能能力与现实世界复杂性之间的差距。

9. 结论

代理框架正在彻底改变人工智能系统的工作方式,使得能够推理、规划和动态交互的智能自主代理成为可能。在这篇博客中,我们探讨了代理框架的重要性,调查了一些最流行的库,并比较了它们的优势。我们深入研究了 LangGraph,了解了其基于图的架构、状态管理和实际应用场景。动手实践部分展示了如何使用 LangGraph 构建具有记忆功能、人机协作能力和可扩展工作流的人工智能代理。

随着人工智能的不断发展,像 LangGraph、LangChain、CrewAI 等代理框架将在塑造下一代智能应用中发挥关键作用。无论你是开发聊天机器人、自动化工具还是研究助手,这些框架都提供了构建更具适应性和高效人工智能系统的基石。

人工智能的未来是自主的、结构化的和互动的——而代理框架正在引领这一潮流。现在正是开始实验、构建和创新的绝佳时机。

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询