LangGraph入门指南:构建长期运行的有状态AI代理
摘要
LangGraph是LangChain Inc.推出的低级别 orchestration 框架,专注于解决长期运行、有状态AI代理的核心痛点。它提供持久化执行、人机协作、全面内存管理、LangSmith调试和生产级部署等核心优势,帮助开发者构建可靠、可扩展的AI代理系统。本文将带你快速入门LangGraph,了解其核心概念、快速上手例子,并探索其生态整合。
一、为什么需要LangGraph?
传统AI代理往往面临以下问题:
- 无状态性:无法保存跨 session 的状态,比如用户之前的对话历史或任务进度。
- 难以调试:复杂的执行流程难以追踪,问题排查困难。
- 无法持久化:任务中断后需要重新开始,效率低下。
- 缺乏人机协作:无法在关键步骤引入人类监督,比如内容审核或复杂决策。
LangGraph的出现正是为了解决这些问题,它提供了一套低级别基础设施,让开发者可以构建有状态、长期运行、可调试的AI代理。
二、LangGraph的核心优势
1. 持久化执行(Durable Execution)
LangGraph支持检查点(Checkpoint)机制,将代理的状态定期保存。当任务中断(比如服务器崩溃、网络故障),代理可以从最近的检查点恢复,继续执行,不会丢失进度。这对生产环境中的长期任务(比如数据处理、持续对话)非常重要。
2. 人机协作(Human-in-the-Loop)
LangGraph允许人类在任何步骤介入代理的执行。比如,当代理需要做一个重要决策时,可以暂停执行,等待人类审核;或者当代理的状态出现错误时,人类可以修改状态,让代理继续正确执行。这种机制提高了代理的可靠性,适合需要人类监督的场景。
3. 全面内存管理(Comprehensive Memory)
LangGraph将内存分为短期工作内存和长期持久内存:
- 短期内存:用于保存当前推理过程中的上下文,比如用户的最新问题、代理的思考过程。
- 长期内存:用于保存跨 session 的信息,比如用户的偏好、历史对话记录。 这种内存管理方式让代理可以像人类一样,既有“短期记忆”处理当前任务,又有“长期记忆”记住过去的信息。
4. 调试与 observability(Debugging with LangSmith)
LangGraph与LangSmith深度整合,提供了可视化的执行轨迹调试工具。开发者可以查看代理的执行路径、状态转移、工具调用记录,甚至可以回放执行过程,快速定位问题。这对复杂代理的调试非常有帮助。
5. 生产级部署(Production-ready Deployment)
LangGraph提供了LangGraph Platform,用于部署和缩放代理。它支持自动缩放、负载均衡、故障转移等特性,让开发者可以轻松将代理部署到生产环境,处理高并发的任务。
三、快速入门:构建第一个LangGraph代理
接下来,我们用一个简单的例子,带你快速上手LangGraph。我们将构建一个可以调用工具(获取天气)的代理。
1. 安装依赖
首先,安装LangGraph和所需的模型依赖:
pip install -U langgraph
pip install -qU "langchain[anthropic]" # 用于调用Anthropic模型
2. 定义工具函数
我们需要定义一个工具函数,用于获取天气。这里我们用一个模拟函数:
def get_weather(city: str) -> str:
"""获取给定城市的天气"""
return f"It's always sunny in {city}!" # 模拟返回天气
3. 创建代理
使用LangGraph的create_react_agent
函数创建代理。这个函数会自动处理工具调用的逻辑(ReAct架构):
from langgraph.prebuilt import create_react_agent
# 初始化代理
agent = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest", # 使用Anthropic的Claude 3模型
tools=[get_weather], # 传入工具函数
prompt="你是一个 helpful 的助理,会使用工具解决问题。" # 提示词
)
4. 运行代理
调用代理的invoke
方法,传入用户的问题:
# 运行代理,处理用户问题
response = agent.invoke({
"messages": [{"role": "user", "content": "旧金山的天气怎么样?"}]
})
# 打印结果
print(response["messages"][-1]["content"])
输出结果:
It's always sunny in 旧金山!
这个例子展示了LangGraph的基本用法:创建代理、调用工具、处理用户问题。你可以尝试修改工具函数(比如调用真实的天气API),或者调整提示词,看看代理的表现如何。
四、LangGraph的核心概念
要深入理解LangGraph,需要掌握以下核心概念:
1. 图(Graph)
LangGraph用图结构来表示代理的工作流程。图由节点(Node)和边(Edge)组成:
- 节点:处理具体的逻辑,比如调用模型、调用工具、保存状态。
- 边:定义节点之间的转移逻辑,比如根据节点的输出决定下一步到哪个节点。
2. 状态(State)
状态是代理的“记忆”,保存了代理执行过程中的所有信息,比如用户的对话历史、工具调用的结果、当前的思考过程。状态是可序列化的,可以保存到检查点(Checkpoint)中。
3. 检查点(Checkpoint)
检查点是状态的快照,用于持久化代理的状态。当代理执行到某个节点时,会自动保存检查点。如果任务中断,代理可以从最近的检查点恢复。
4. 子图(Subgraph)
子图是图的子集,用于表示复杂的流程模块。比如,你可以将“处理用户问题”的流程拆分成一个子图,然后在主图中引用它,提高代码的复用性。
五、LangGraph的生态整合
LangGraph可以与LangChain的其他产品整合,形成完整的AI代理开发流程:
- LangSmith:用于调试和评估代理。你可以用LangSmith查看代理的执行轨迹、评估代理的性能(比如准确性、速度)。
- LangGraph Platform:用于部署和缩放代理。它提供了可视化的管理界面,让你可以轻松部署代理、监控代理的运行状态。
- LangChain:用于获取模型、工具和组件。比如,你可以用LangChain的
ChatOpenAI
类调用OpenAI的模型,或者用SerpAPIWrapper
调用搜索引擎工具。
六、最佳实践
1. 设计清晰的状态结构
状态是LangGraph的核心,需要设计清晰的状态结构。比如,将状态分为messages
(对话历史)、tools
(工具调用结果)、memory
(长期记忆)等部分,便于管理和修改。
2. 使用检查点
为了确保持久化执行,建议在关键节点保存检查点。比如,在调用工具之前、之后保存检查点,这样即使工具调用失败,也可以恢复到之前的状态。
3. 利用LangSmith调试
LangSmith是调试LangGraph代理的重要工具。你可以用LangSmith查看代理的执行轨迹、状态转移、工具调用记录,快速定位问题。
4. 合理使用内存
区分短期内存和长期内存:短期内存用于当前推理,长期内存用于跨 session 保存信息。比如,将用户的偏好保存到长期内存,这样下次用户访问时,代理可以记住用户的偏好。
七、资源推荐
- 官方文档:https://langgraph.ai/docs/ (最权威的参考资料)
- Quickstart教程:https://langgraph.ai/docs/quickstart (快速上手LangGraph)
- LangChain Academy:https://academy.langchain.com/ (免费的LangGraph课程)
- 例子仓库:https://github.com/langchain-ai/langgraph/tree/main/examples (各种LangGraph的例子)
- LangChain论坛:https://forum.langchain.com/ (社区讨论,解决问题)
总结
LangGraph是一个强大的低级别 orchestration 框架,用于构建长期运行、有状态的AI代理。它的核心优势是持久化执行、人机协作、全面内存管理和可调试性。通过本文的介绍,你应该对LangGraph有了基本的了解,能够快速上手构建简单的代理。
如果你想深入学习LangGraph,建议阅读官方文档,尝试更多的例子,比如构建带有长期记忆的代理、使用子图的代理,或者整合LangSmith进行调试。相信你会发现LangGraph的强大之处,用它构建出更复杂、更可靠的AI代理系统。