AI创想
标题:
LangGraph V1.0入门教程:轻松构建复杂Agent应用,小白也能学会!收藏必备
[打印本页]
作者:
AI小编
时间:
前天 09:12
标题:
LangGraph V1.0入门教程:轻松构建复杂Agent应用,小白也能学会!收藏必备
作者:CSDN博客
本文介绍了LangGraph V1.0及其与LangChain的关系,重点讲解了LangGraph的核心能力,包括持久执行、人在环路、综合记忆和可视化调试等。通过一个计算器Agent的实例,详细阐述了如何使用LangGraph API构建复杂Agent应用。LangGraph以其图结构清晰地描述和控制Agent执行流程,特别适合构建复杂、多步骤、可恢复的Agent系统,是开发者的必备工具。
文中所有示例代码:https://github.com/wzycoding/langchain-study
一、什么是LangGraph
1.1 LangGraph 和 LangChain 的关系
LangGraph 是一个
基于图结构的 Agent 编排框架
,专注于描述和控制 Agent 的执行流程。它可以独立使用,也可以与 LangChain 结合,用于更方便地调用模型、工具和记忆组件。
通过LangGraph可以轻松构建出可靠的Agent应用。LangGraph并不依赖于LangChain,但是配合LangChain使用可以发挥更好的效果。
1.2 LangGraph核心能力
LangGraph具有以下核心能力:
Durable execution
:持久执行,能够在执行失败后恢复继续执行,而无需从头开始,类似文件传输的断点续传机制,非常适合长时间运行、复杂的多步骤任务。
Human-in-the-loop
:人在环路,在任务执行过程中允许人工介入,用于确认是否执行关键操作。
Comprehensive Memory
:提供统一的状态与记忆管理能力,通过 State 和 Checkpoint 机制支持短期上下文保留,并可与 LangChain 的 Memory 或外部存储系统结合,实现长期记忆能力。短期记忆可以让AI记住最近几轮对话的信息,长期记忆可以让AI了解历史对话聊天的总结信息。
Debugging with LangSmith
:可视化调试,可以无缝集成LangSmith进行可视化调试和监控
Production-ready Deployment
:在配合持久化、错误恢复和监控体系的前提下,LangGraph 非常适合用于生产级 Agent 应用的构建。
二、快速入门LangGraph
2.1 LangGraph安装
创建项目并安装 LangGraph。
pip install -U langgraph
复制代码
在使用LangGraph时,通常要调用LLM模型,可以直接调用LLM也可以使用LangChain,一般使用LangChain会更加便捷,安装LangChain的命令如下,注意这里使用LangChain的最低Python版本为3.10+。
pip install -U langchain
复制代码
安装dotenv来进行配置的读取。
pip install python-dotenv
复制代码
2.2 LangGraph 提供的两种构建方式
在LangGraph中,提供了两种API来构建Agent应用:
LangGraph API:构建一个由边和节点组成的、具有复杂条件分支结构的Agent应用Functional API:通过单一函数进行构建,用于构建简单的Agent应用。
本专栏将会以LangGraph API为例,来介绍如何使用LangGraph API构建复杂Agent应用。
2.3 构建Agent基本步骤
LangGraph底层采用图结构来构建Agent应用,而构建图主要是构建图的节点和边,使用LangGraph构建Agent主要包括以下步骤:
(, 下载次数: 0)
上传
点击文件名下载附件
三、构建第一个LangGraph Agent
下面我们要构建一个计算器Agent,该Agent的图结构如下,从START节点出发,进入到LLM节点,执行完LLM节点之后,判断是否需要工具调用,如果需要工具调用,则进入工具节点,工具调用完成后再回到LLM节点,直到不需要工具调用,才走到END节点。
(, 下载次数: 0)
上传
点击文件名下载附件
下面我们来一起动手实现这个Agent。
3.1 前置准备工作
首先在.env文件中配置 OpenAI模型的密钥。
OPENAI_API_KEY=sk-***************************
OPENAI_API_BASE=https://****/v1
复制代码
在程序中对配置进行读取
import dotenv
dotenv.load_dotenv()
复制代码
定义LLM 对象,这里使用gpt-4o-mini模型
llm = init_chat_model("gpt-4o-mini",
temperature=0)
复制代码
定义计算加减乘除四个工具:
@tool
def add_two_numbers(a: int, b: int) -> int:
"""两个数相加 `a` 和 `b`.
Args:
a: 第一个整数
b: 第二个整数
"""
return a + b
@tool
def sub_two_numbers(a: int, b: int) -> int:
"""两个数相减 `a` 和 `b`.
Args:
a: 第一个整数
b: 第二个整数
"""
return a - b
@tool
def multi_two_numbers(a: int, b: int) -> int:
"""两个数相乘 `a` 和 `b`.
Args:
a: 第一个整数
b: 第二个整数
"""
return a * b
@tool
def divide_two_numbers(a: int, b: int) -> int:
"""两个数相除 `a` 和 `b`.
Args:
a: 第一个整数
b: 第二个整数
"""
return a / b
复制代码
之后将工具绑定到LLM对象上
# 2.将工具绑定到LLM
tools =[add_two_numbers, sub_two_numbers, multi_two_numbers, divide_two_numbers]
llm_with_tool = llm.bind_tools(tools)# 3.生成工具名称->工具对象的映射
tools_by_name ={tool.name: tool fortoolin tools}
复制代码
3.2 定义图状态数据
在状态数据中,因为其他节点间没有其他需要共享的中间数据,所以只定义了消息列表。
此外,在消息列表中,还指定了operator.add作为
归纳函数
,如果不指定归纳函数,当节点返回消息列表时,默认就会对消息列表数据进行覆盖,而使用operator.add则会将节点返回的消息添加到消息列表中。
# 4.定义State
class MessagesState(TypedDict):
# 图运行的消息列表
messages: Annotated[list[AnyMessage], operator.add]
复制代码
3.3 定义LLM节点
在LangGraph中节点本质上就是一个函数,入参传递图状态数据,在节点内部可以对图状态数据进行读取,返回需要更新的图状态数据。
在LLM节点中,调用LLM并传递消息列表,最终将AI生成的AIMessage返回,LangGraph会将消息添加到消息列表中。
# 5.定义llm节点
def llm_node(state: MessagesState):
"""调用LLM节点"""
ai_message = llm_with_tool.invoke(state["messages"])return{"messages":[ai_message]}
复制代码
3.4 定义工具节点
在工具节点内部,读取消息列表的的最后一条消息,因为调用完LLM节点之后才会调用工具节点,所以最后一条消息一定是AIMessage。
由于可能存在多个工具调用,需要循环AIMessage的tool_calls属性,如果存在工具调用,则根据工具名称获取工具,之后,调用工具并传入调用参数,最终将工具执行的结果构造成工具消息。
最后,将工具消息列表返回。
# 6.定义工具节点
def tool_node(state: MessagesState):
"""工具调用"""
tool_messages =[]fortool_callin state["messages"][-1].tool_calls:
tool = tools_by_name[tool_call["name"]]
tool_output = tool.invoke(tool_call["args"])
tool_messages.append(ToolMessage(content=tool_output,
tool_call_id=tool_call["id"],
name=tool_call["name"],
))return{"messages": tool_messages
}
复制代码
3.5 定义条件边路由函数
由于从 LLM 节点可能存在两条执行路径:第一种是需要调用工具,则会走到工具节点,第二种是LLM无需调用工具,则直接走到END结束节点。
因此要编写一个如下的条件边路由函数,在函数内部需要判断最后一条消息也就是AIMessage的tool_calls属性是否存在,如果存在则返回tool表示走到工具节点,否则直接走到结束节点,图的执行流程结束。
# 7.条件边路由函数
def llm_tool_route(state: MessagesState) -> Literal["tool", END]:
"""工具调用和LLM调用的边路由"""
if state["messages"][-1].tool_calls:
return"tool"return END
复制代码
3.6 创建图、节点、边
首先,我们创建一个图,并向图中添加LLM节点和工具节点。接下来,我们创建边来连接这些节点:将图的入口设置为LLM节点,并为这个LLM节点添加条件边。这些条件边需要指定一个路由函数,以决定下一步执行哪个节点。
最后,我们添加从工具节点回到LLM节点的边,这保证了工具节点执行完成后,会再次执行LLM节点。
graph = StateGraph(MessagesState)
graph.add_node("llm", llm_node)
graph.add_node("tool", tool_node)
graph.set_entry_point("llm")
graph.add_conditional_edges("llm", llm_tool_route, ["tool", END])
graph.add_edge("tool", "llm")
复制代码
3.7 编译并运行图
接下来,对图进行编译生成Runnable可运行组件,调用该可运行组件并传入初始化的图状态数据,在消息列表中插入一条人类消息,调用图结束后,会将最终的图状态数据返回。
最终,循环打印图状态数据中的消息列表,并进行输出。
# 9.编译并运行图
agent = graph.compile()
state = agent.invoke({"messages":[HumanMessage(content="请计算1+1")]})formessagein state["messages"]:
message.pretty_print()
复制代码
执行结果如下:
================================ Human Message =================================
请计算1+1
================================== Ai Message ==================================
Tool Calls:
add_two_numbers (call_cKQBhEo7nhLHNeFca1ek6x3K)
Call ID: call_cKQBhEo7nhLHNeFca1ek6x3K
Args:
a: 1
b: 1================================= Tool Message =================================
Name: add_two_numbers
2================================== Ai Message ==================================1 + 1 的结果是 2。
复制代码
四、总结
本文系统介绍了 LangGraph 的定位、核心能力以及最基础的使用方式,并通过一个完整的示例,带大家从零构建了第一个基于图结构的 Agent 应用。
首先,我们明确了
LangGraph 与 LangChain 的关系
,接着,重点介绍了 LangGraph 的几项核心能力,这些能力决定了 LangGraph 非常适合用来构建复杂、多步骤、可恢复的 Agent 系统,而不仅仅是一次性的对话调用。
在实战部分,我们通过一个计算器Agent的示例,完整走了一遍 LangGraph 的基本开发流程,通过这个例子可以看到,
LangGraph
能够将 Agent 的执行流程清晰地描述出来。每个节点做什么、什么时候走哪条分支、是否需要循环执行,整个执行Agent业务逻辑一目了然,这也是 LangGraph 相比传统 Agent 封装方式的最大优势。
最后
对于正在迷茫择业、想转行提升,或是刚入门的程序员、编程小白来说,有一个问题几乎人人都在问:未来10年,什么领域的职业发展潜力最大?
答案只有一个:人工智能(尤其是大模型方向)
当下,人工智能行业正处于爆发式增长期,其中大模型相关岗位更是供不应求,薪资待遇直接拉满——字节跳动作为AI领域的头部玩家,给硕士毕业的优质AI人才(含大模型相关方向)开出的月基础工资
高达5万—6万元
;即便是非“人才计划”的普通应聘者,月基础工资也能
稳定在4万元左右
。
再看阿里、腾讯两大互联网大厂,非“人才计划”的AI相关岗位应聘者,月基础工资也
约有3万元
,远超其他行业同资历岗位的薪资水平,对于程序员、小白来说,无疑是绝佳的转型和提升赛道。
(, 下载次数: 0)
上传
点击文件名下载附件
(, 下载次数: 0)
上传
点击文件名下载附件
对于想入局大模型、抢占未来10年行业红利的程序员和小白来说,现在正是最好的学习时机
:行业缺口大、大厂需求旺、薪资天花板高,只要找准学习方向,稳步提升技能,就能轻松摆脱“低薪困境”,抓住AI时代的职业机遇。
如果你还不知道从何开始,我自己整理一套
全网最全最细的大模型零基础教程
,我也是一路自学走过来的,很清楚小白前期学习的痛楚,你要是没有方向还没有好的资源,根本学不到东西!
下面是我整理的大模型学习资源,希望能帮到你。
(, 下载次数: 0)
上传
点击文件名下载附件
欢迎光临 AI创想 (http://llms-ai.com/)
Powered by Discuz! X3.4