链载Ai

标题: 1W5000字 深度剖析大模型Agent框架 [打印本页]

作者: 链载Ai    时间: 前天 17:53
标题: 1W5000字 深度剖析大模型Agent框架

深度剖析 Agent 框架:以 LangGraph 为例,探索 AI 开发新范式

Agent 系列第四篇,后续持续更新 。 Agent 框架正在彻底改变人工智能系统的运行方式,使智能、自主的 Agent 能够动态推理、计划和交互。在文章中,我们探讨了 Agent 框架的重要性,介绍了 8 个 Agent 框架,并比较了它们的优势。然后,我们深入研究了 LangGraph,了解了它基于图的架构、状态管理和现实世界的应用程序。动手部分展示了如何使用 LangGraph 构建具有内存、人在回路功能和可扩展工作流的人工智能 Agent。
更多 LLM 架构文章点击查看:LLM 架构专栏
大模型架构专栏文章阅读指南
Agent系列 1W字用Python从零搭建AI智能体


欢迎加入大模型交流群:加群链接[1]https://docs.qq.com/doc/DS3VGS0NFVHNRR0Ru#
公众号【柏企阅文

1. 介绍

Agent 框架让自主系统能够动态感知、推理和行动,彻底革新了人工智能领域。本节将深入探究 Agent 框架的核心概念,并着重强调开源解决方案在现代 AI 开发中,对于创新和可扩展性的重要意义。

1.1 什么是 Agent 框架?

Agent 框架代表着人工智能系统设计模式的重大转变。与依赖静态、预定义工作流程的传统 AI 应用程序不同,Agent 框架引入了动态自适应系统,该系统具备自主感知、推理和行动的能力。这些框架可以把复杂任务拆解成多个小子任务,交给专门的 Agent 协作完成,以实现更宏大的目标。借助大型语言模型(LLM),Agent 框架能够管理工作流程、做出决策,还能无缝集成各种工具,这使得它成为动态决策、实时问题解决等高级应用的理想之选。

关键参考:像 LangGraph 和 CrewAI 这样的 Agent 框架,就是这种动态方法的典型代表,它们帮助开发者突破单 Agent、线性工作流程的局限,进入多 Agent 协作系统的全新领域。

1.2 为什么它们很重要?

从头开始构建 Agent 绝非易事。LangGraph、CrewAI 和 OpenAI Swarm 等框架大大简化了这个过程,让开发者能够把精力集中在应用程序逻辑上,而不用在状态管理、编排和工具集成这些方面重复造轮子。

Agent 框架的核心优势体现在:

接下来的章节,我们将详细介绍这些内容。

2. 流行的 Agent 框架和库

现在,让我们深入了解当下一些最知名的 AIAgent 框架和工具:

2.1 Langchain

LangChain 是一个强大且适应性很强的框架,它让开发由大型语言模型(LLM)驱动的应用程序变得更加轻松。凭借丰富的工具集和抽象概念,开发者利用它可以设计出功能强大的人工智能 Agent,这些 Agent 具备复杂推理、任务执行能力,还能与外部数据源和 API 进行交互。

从根本上讲,在长时间对话中保持上下文连贯性、整合外部信息以及协调多步骤项目,是开发者在与 LLM 合作时面临的几个难题,而 LangChain 恰好能解决这些问题。得益于其模块化架构,该框架可以很方便地由各种组件组合而成,满足不同的开发需求。

**langchain github**[2]

**langchain 文档链接**[3]

2.2 LangGraph

LangGraph 是 LangChain 的扩展框架,它支持使用大型语言模型(LLM)创建有状态的多参与者应用程序。在构建涉及规划、反思、思考以及多 Agent 协作的复杂交互式 AI 系统时,LangGraph 特别有用。

GitHub 链接:LangGraph[4]

文档链接:LangGraph 文档[5]

2.3 CrewAI

CrewAI 是一个用于编排角色扮演 AIAgent 的框架。借助它,开发者能够创建一个 AIAgent“团队”,团队中的每个 Agent 都有明确的角色和职责,共同协作完成复杂任务。对于构建那些需要多种专业知识协同合作,以解决多方面问题的协作 AI 系统而言,这个框架非常实用。

GitHub 链接:CrewAI GitHub[6]文档:CrewAI 文档[7]

2.4 微软语义内核(Microsoft Semantic Kernel)

微软语义内核旨在缩小传统软件开发和人工智能能力之间的差距,尤其专注于将大型语言模型(LLM)集成到现有的应用程序中。该框架为开发者提供了一系列工具,使得他们无需彻底修改现有代码库,就能轻松融入人工智能功能。

SDK 的轻量级特性以及对多种编程语言的支持,让它能很好地适应各种开发环境。其编排器可以管理复杂的多步骤人工智能任务,帮助开发者在应用程序内创建复杂的 AI 驱动工作流。

GitHub 链接:Microsoft Semantic Kernel github[8]

文档链接:Microsoft 语义内核 documentation[9]

2.5 微软 AutoGen(Microsoft AutoGen)

Microsoft AutoGen 是一个开源框架,主要用于构建高级 AIAgent 和多 Agent 系统。它由微软研究院开发,为创建对话式和任务完成型的 AI 应用程序,提供了一套灵活且强大的工具包。该框架强调模块化、可扩展性和易用性,能帮助开发者高效构建复杂的 AI 系统。

**AutoGen 文档**[10]GitHub 链接:Microsoft Autogen[11]

2.6 Smolagents

Smolagent 是一个处于前沿的开源框架,旨在彻底变革人工智能 Agent 的开发方式。它为开发者提供了一套全面的工具包,用于构建智能、协作的多 Agent 系统。该框架注重灵活性和模块化,所创建的复杂人工智能系统既可以独立运行,也能在人类监督下协同工作。

**Smolagents 文档**[12]**Smolagents GitHub 链接**[13]

2.7 AutoGPT

AutoGPT 基于强大的 GPT-4 语言模型,通过语言输入就能执行目标导向的任务,它标志着自主人工智能 Agent 领域取得了重大进展。这款先进的人工智能助手将决策能力提升到了新高度,超越了基础的反射 Agent,集成了众多复杂功能,使其在各类应用场景中都极具价值。

**AutoGPT 文档**[14]**AutoGPT GitHub 链接**[15]

2.8 Agno(Phidata)

我们要讨论的最后一个 AIAgent 框架是 Phidata。这是一个多模态 Agent 框架,可用于开发协作执行任务的 Agent 系统。它还能与内存、工具等组件协同工作,助力 Agent 自主、稳定地运行。

默认情况下,PhidataAgent 支持文本、图像、音频等多模态数据,这使得它无需依赖外部工具就具备很高的价值。该框架还提供了 Agent 用户界面,如果您喜欢通过可视化方式与 Agent 交互,这个界面就能派上用场。此外,他们还是 Agent 检索增强生成(Agentic RAG)技术的先驱,Agent 可以利用该技术搜索知识库。

**Phidata 文档**[16]**Phidata GitHub 链接**[17]

3. Agent 框架的比较

下面的图表对本文讨论的关键 AIAgent 框架进行了高层次的对比。通过这种对比,我们可以清楚地看到每个框架的独特优势和重点应用领域,方便开发者和研究人员根据自身具体需求,选择最合适的工具。

4. 深入了解 LangGraph

LangGraph 是 LangChain 团队开发的一个库,目的是帮助开发者创建基于图的单 Agent 或多 AgentAI 应用程序。作为底层框架,LangGraph 赋予开发者控制 Agent 交互方式、工具选择以及应用程序内信息流的能力。

4.1 什么是图?

想象一下,有一组数据可以用网络来表示,其中每个数据或实体都与其他数据或实体存在某种关系,而且这种关系可以是一对一、一对多、多对多等多种类型。图主要由两个部分组成:节点和边。

交通数据、社交媒体网络数据就是这类数据的典型例子。在社交媒体网络中,每个用户与其他用户之间都存在关联关系,使用图结构能够很直观地将这种数据可视化呈现出来。

图主要分为两种类型:

4.2 关键概念

4.2.1 图结构

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

4.2.2 状态管理

管理多 Agent 系统时,确保所有 Agent 对任务当前状态有一致的理解是非常关键的。LangGraph 通过自动状态管理机制解决了这个问题。这意味着,当 Agent 执行任务时,该库会自动对中央状态对象进行跟踪和更新。

这个状态对象就像是一个信息仓库,存储着工作流程中不同节点都可能需要访问的关键信息,主要包括:

5. 动手使用 LangGraph

5.1 安装

要开始使用 LangGraph,首先需要进行安装。在终端或命令提示符中,输入以下命令:

pip install -U langgraph

这个命令会下载并安装最新版本的 LangGraph。其中,-U参数用于确保安装的是最新版。

5.2 在 LangGraph 中创建基本聊天机器人

这个示例是帮助大家理解 LangGraph 基本概念的绝佳起点。

  1. 导入必要的库:首先,从 LangGraph 和其他相关库中导入所需的类和模块。
fromtypingimportAnnotated
fromtyping_extensionsimportTypedDict
fromlanggraph.graphimportStateGraph, START, END
fromlanggraph.graph.messageimportadd_messages
  1. 定义状态结构:创建一个类,用于定义状态对象的结构。这个状态对象将存储图中节点之间需要共享和更新的信息。
classState(TypedDict):
messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)
  1. 初始化 LLM:实例化你选择的 LLM 模型,并提供必要的 API 密钥或配置参数。这个 LLM 将为聊天机器人的回复提供支持。
fromlangchain_anthropicimportChatAnthropic
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")
  1. 创建聊天机器人节点:定义一个 Python 函数,封装聊天机器人节点的逻辑。该函数以当前状态作为输入,并根据 LLM 的输出生成回复。
defchatbot(state: State):
response = llm.invoke(state["messages"])
return{"messages": [response]}

graph_builder.add_node("chatbot", chatbot)
  1. 定义入口和终点:在图中明确工作流程的起始点和结束点。
graph_builder.add_edge(START,"chatbot")
graph_builder.add_edge("chatbot", END)
  1. 编译图形:通过编译,创建图的可运行实例。
graph = graph_builder.compile()
  1. 可视化图形:运行一段简单的 Python 代码,就能将包含节点和边的图可视化展示出来。
fromIPython.displayimportImage, display
try:
display(Image(graph.get_graph().draw_mermaid_png()))
exceptException:
pass
  1. 运行聊天机器人:实现一个循环,用于与用户交互。将用户输入传递给图,并展示聊天机器人的回复。
whileTrue:
user_input = input("User: ")
ifuser_input.lower()in["quit","exit","q"]:
print("Goodbye!")
break
foreventingraph.stream({"messages": [("user", user_input)]}):
forvalueinevent.values():
print("Assistant:", value["messages"][-1].content)

这段代码为 LangGraph 聊天机器人搭建了一个基础框架。你可以在此基础上进一步扩展,比如引入更复杂的状态管理机制、更换不同的 LLM 模型,或者连接外部工具和 API。关键在于,要为不同任务定义清晰的节点,并通过边来设定聊天机器人内部的信息流和控制流程。

5.3 高级图形技术

工具集成:将工具集成到 LangGraph 聊天机器人中,可以让它按照你的需求访问和处理信息,从而显著提升其功能。使用工具集成增强我们的基本聊天机器人:我们对上一节创建的基本聊天机器人进行修改,添加一个能在网络上搜索信息的工具。这里我们使用langchain_community.tools.tavily_search中的TavilySearchResults工具,使用这个示例需要 Tavily API 密钥。

fromtypingimportAnnotated
fromlangchain_anthropicimportChatAnthropic
fromlangchain_community.tools.tavily_searchimportTavilySearchResults
fromlangchain_core.messagesimportBaseMessage
fromtyping_extensionsimportTypedDict
fromlanggraph.graphimportStateGraph
fromlanggraph.graph.messageimportadd_messages
fromlanggraph.prebuiltimportToolNode, tools_condition

classState(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)

defchatbot(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()

解释

现在,当你运行这个聊天机器人,并提出一个需要外部信息的问题时,LLM 可以选择调用网络搜索工具,获取相关数据,并将其融入到回复中。

6. 为聊天机器人添加 memory

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

LangGraph 的检查点系统

使用检查点实现内存

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

fromlanggraph.checkpoint.memoryimportMemorySaver
memory = MemorySaver()
graph = graph_builder.compile(checkpointer=memory)

解释:

现在,当您运行聊天机器人时,首先,使用 thread_id 作为此对话的密钥:

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

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

现在开始对话:

whileTrue:
user_input = input("User: ")
ifuser_input.lower()in["quit","exit","q"]:
print("Goodbye!")
break
foreventingraph.stream({"messages": [("user", user_input)]}, config):
forvalueinevent.values():
print("Assistant:", value["messages"][-1].content)

注意:调用我们的图时,配置作为第二个位置参数提供。

Human in the Loop

对于希望将人工监督、验证或决策纳入 AI 应用程序的情况,人在回路工作流至关重要。

使用中断实现人在环

下面的代码说明了使用 LangGraph 的interrupt_beforeinterrupt_after功能的人在循环实现。

fromtypingimportAnnotated
fromlangchain_anthropicimportChatAnthropic
fromlangchain_community.tools.tavily_searchimportTavilySearchResults
fromlangchain_core.messagesimportBaseMessage
fromtyping_extensionsimportTypedDict
fromlanggraph.checkpoint.memoryimportMemorySaver
fromlanggraph.graphimportStateGraph
fromlanggraph.graph.messageimportadd_messages
fromlanggraph.prebuiltimportToolNode, tools_condition

classState(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)

defchatbot(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"],
)

解释:

在此特定示例中,图表将在执行 tools 节点之前暂停。此 tools 节点负责运行 LLM 在轮到它时可能请求的任何工具。通过在这一点上中断,您基本上可以允许人类:

资源:https://github.com/langchain-ai/langgraph/blob/main/docs/docs/how-tos/human_in_the_loop/review-tool-calls.ipynb

LangGraph 的实际用途

LangGraph 通过管理状态、协调多个 Agent 并允许人工反馈,让您可以构建比简单的问答机器人更复杂和更具交互性的 AI 系统。以下是可以使用 LangGraph 的一些方式:

这些示例突出了 LangGraph 如何帮助弥合 AI 功能与现实世界情况的复杂性之间的差距。

结论

Agent 框架正在彻底改变人工智能系统的运行方式,使智能、自主的 Agent 能够动态推理、计划和交互。在文章中,我们探讨了 Agent 框架的重要性,介绍了一些最流行的库,并比较了它们的优势。然后,我们深入研究了 LangGraph,了解了它基于图的架构、状态管理和现实世界的应用程序。动手部分展示了如何使用 LangGraph 构建具有内存、人在回路功能和可扩展工作流的人工智能 Agent。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5