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 等代理框架将在塑造下一代智能应用中发挥关键作用。无论你是开发聊天机器人、自动化工具还是研究助手,这些框架都提供了构建更具适应性和高效人工智能系统的基石。
人工智能的未来是自主的、结构化的和互动的——而代理框架正在引领这一潮流。现在正是开始实验、构建和创新的绝佳时机。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。