什么是 LangGraph?
LangGraph 让我们尽可能轻松地创建使用 LLM 的有状态、多参与者应用。它扩展了 LangChain 的能力,引入了创建和管理循环图的功能,这对于构建复杂的代理运行时至关重要。LangGraph 的核心概念包括:图结构、状态管理和协调。
图结构
将您的应用想象为一个有向图。在 LangGraph 中,每个节点代表一个 LLM 代理,边则是这些代理之间的通信通道。这种结构有助于建立清晰、可管理的工作流,每个代理执行特定任务,并在需要时将信息传递给其他代理。
状态管理
LangGraph 的一大亮点是其自动状态管理。该功能使我们能够在多次交互中跟踪并持久化信息。随着代理执行任务,状态会动态更新,确保系统保持上下文,并能对新的输入做出恰当响应。
协调
LangGraph 确保代理以正确的顺序执行,并无缝交换必要信息。对于需要多个代理协同达成共同目标的复杂应用,这种协调至关重要。通过管理数据流和操作顺序,LangGraph 让开发者能专注于应用的高层逻辑,而不是代理协调的细枝末节。
为什么选择 LangGraph?
如上所述,LangGraph 为处理复杂 LLM 应用的开发者带来了多项重要优势。以下是 LangGraph 在真实场景中的一些收益。
简化开发
LangGraph 屏蔽了与状态管理和代理协调相关的复杂性。这意味着开发者可以定义工作流和逻辑,而无需担心确保数据一致性和正确执行顺序的底层机制。这种简化加速了开发过程,并降低了出错的可能性。的确是“改写规则”的工具!
灵活性
借助 LangGraph,开发者可以灵活定义自己的代理逻辑和通信协议,从而打造高度定制、贴合具体用例的应用。无论您需要一个能处理多种用户请求的聊天机器人,还是一个执行复杂任务的多代理系统,LangGraph 都提供了构建所需的一切工具。其核心就是赋予您创造的力量。
可扩展性
LangGraph 专为支持大规模多代理应用的执行而构建。其健壮的架构能够应对大量交互和复杂工作流,助您开发可随需求增长而扩展的系统。这使其适用于对性能和可靠性要求严苛的企业级应用和场景。
容错性
可靠性是 LangGraph 设计中的核心考量。该库包含优雅处理错误的机制,即使某些代理出现问题,应用也能继续运行。这种容错性对于保持复杂多代理系统的稳定性和健壮性至关重要。安心感,只差一个特性。
开始使用 LangGraph
下面我们来看看如何设置 LangGraph 以及它的基本概念。
安装
要安装 LangGraph,您可以使用 pip:
pip install -U langgraph
基本概念
节点(Nodes):节点表示 LangGraph 中的工作单元。它们通常是执行特定任务的 Python 函数,例如:
- 与 LLM 交互
- 调用工具或 API
- 进行数据处理
- 接收用户输入
- 执行业务逻辑
在 LangGraph 中,您可以使用 graph.add_node(name, value) 语法添加节点。
边(Edges):边是节点之间的通信通道。它们定义了信息流向和执行顺序。您可以使用 graph.add_edge(node1, node2) 语法添加边。
状态(State):状态是一个随时间由图中节点更新的中心对象。它管理应用的内部状态,并可根据应用需求进行覆盖或扩展。状态可以包含如下内容:
- 对话历史:代理与用户之间的消息列表。
- 上下文数据:与当前任务或交互相关的信息。
- 内部变量:用于跟踪代理进度和行为的标志、计数器或其他变量。
构建一个简单的 LangGraph 应用
下面通过一个分步示例,创建一个使用 LangGraph 的基础聊天机器人应用。
步骤 1:定义 StateGraph
定义一个 StateGraph 对象,将聊天机器人构造成状态机。State 是一个类对象,仅包含一个键 messages,类型为 List,并使用 add_messages() 函数来追加新消息,而不是覆盖。
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
class State(TypedDict):
# messages have the type "list".
# The add_messages function appends messages to the list, rather than overwriting them
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
步骤 2:初始化一个 LLM 并将其添加为 Chatbot 节点
这里我们初始化 AzureChatOpenAI 模型,并创建一个简单的聊天机器人函数,该函数将状态中的消息作为输入并生成一条回复(随后会被追加到状态中)。
这个聊天机器人函数作为名为“chatbot”的节点被添加到图中。
from langchain_openai import AzureChatOpenAI
llm = AzureChatOpenAI(
openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"],
azure_deployment=os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"],
)
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
‘’’The first argument is the unique node name
# The second argument is the function or object that will be called whenever the node is used.’’’
graph_builder.add_node("chatbot", chatbot)
步骤 3:设置边
因为我们要构建一个简单的聊天机器人,所以将 chatbot 节点同时设置为图的入口和结束点,以指示流程的开始与结束。
# Set entry and finish points
graph_builder.set_entry_point("chatbot")
graph_builder.set_finish_point("chatbot")
步骤 4:编译并可视化图
编译该图以创建一个 CompiledGraph 对象,并且我们可以选择使用下面的代码来可视化图结构:
graph = graph_builder.compile()
from IPython.display import Image, display
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
pass

步骤 5:运行聊天机器人
最后,我们实现一个循环,持续提示用户输入,通过图进行处理,并打印助手的回复。当用户输入 "quit"、"exit" 或 "q" 时,循环退出。
# Run the chatbot
while True:
user_input = input("User: ")
if user_input.lower() in ["quit", "exit", "q"]:
print("Goodbye!")
break
for event in graph.stream({"messages": [("user", user_input)]}):
for value in event.values():
print("Assistant:", value["messages"][-1].content)
LangGraph 的高级功能
现在我们已经介绍了基础知识,来看看一些高级功能。
自定义节点类型
LangGraph 允许您创建自定义节点类型以实现复杂的代理逻辑。这为您提供了对应用行为的灵活性和控制力。
from typing import Annotated
from langchain_anthropic import ChatAnthropic
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
class MyCustomNode:
def __init__(self, llm):
self.llm = llm
def __call__(self, state):
# Implement your custom logic here
# Access the state and perform actions
messages = state["messages"]
response = self.llm.invoke(messages)
return {"messages": [response]}
graph_builder = StateGraph(State)
llm = ChatAnthropic(model="claude-3-haiku-20240307")
custom_node = MyCustomNode(llm)
graph_builder.add_node("custom_node", custom_node)
在这里,我们定义了一个类 MyCustomNode,用于封装自定义逻辑并与 LLM 交互。这为实现复杂的节点行为提供了更结构化、可维护的方式。
边的类型
LangGraph 支持不同类型的边,以处理节点之间的各种通信模式。其中一个有用的类型是条件边,它允许基于节点输出进行决策。
要创建条件边,您需要三个组件:
- 上游节点:其输出决定下一步。
- 一个函数:该函数评估上游节点的输出并确定下一个要执行的节点,返回一个表示决策的字符串。
- 一个映射:该映射将函数的可能结果与对应要执行的节点关联起来。
下面是一个伪代码示例:
graph.add_conditional_edge(
"model",
should_continue,
{
"end": END,
"continue": "tools"
}
)
在这里,调用 “model” 节点之后,我们可以选择退出图(“end”)并返回给用户,或者继续(“continue”)调用某个工具——取决于用户的决策!
状态管理
LangGraph 提供强大的状态管理技术,包括使用 SQLite、PostgreSQL、MongoDB 等外部数据库,或 Amazon S3、Google Cloud Storage、Azure Blob Storage 等云存储来存储和检索代理的状态,从而实现可靠性与可扩展性。
以下是使用 SQLite 数据库进行状态管理的示例:
from langgraph.checkpoint.sqlite import SqliteSaver
# Connect to the SQLite database
memory = SqliteSaver.from_conn_string(":memory:")
# Compile the graph with the checkpointer
graph = graph_builder.compile(checkpointer=memory)
错误处理
LangGraph 还提供了错误处理机制:
- 异常:节点函数可以抛出异常,以指示执行期间发生的错误。您可以捕获并处理这些异常,防止图崩溃。
- 重试机制:您可以在节点中实现重试逻辑,以处理临时性错误,例如网络问题或 API 超时。
- 日志记录:使用日志记录错误并跟踪图的执行。
LangGraph 的真实应用场景
LangGraph 可用于构建多种类型的应用。
聊天机器人
LangGraph 非常适合开发能够处理广泛用户请求的高级聊天机器人。通过利用多个 LLM 代理,这些机器人可以处理自然语言查询、提供准确回复,并在不同话题间无缝切换。状态管理与交互协调能力确保聊天机器人保持上下文,提供连贯的用户体验。
自主代理
对于需要自主决策的应用,LangGraph 能够创建基于用户输入和预定义逻辑独立执行任务的代理。
这些代理可以执行复杂工作流、与其他系统交互,并动态适应新信息。LangGraph 的结构化框架确保每个代理都高效、有效地运行,适用于自动化客户支持、数据处理和系统监控等任务。
多代理系统
在多个代理协作以实现共同目标的应用中,LangGraph 表现出色。例如,在供应链管理系统中,不同代理可以管理库存、处理订单并协调配送。LangGraph 的协调能力确保各代理高效通信、共享信息,并以同步方式做出决策,从而提升运营效率和整体系统性能。
工作流自动化工具
借助 LangGraph,业务流程与工作流的自动化变得简单。可以设计智能代理来处理文档处理、审批流转和数据分析等任务。通过定义清晰的工作流并利用 LangGraph 的状态管理,这些工具无需人工干预即可执行复杂的操作序列,减少错误并提升生产力。
推荐系统
个性化推荐系统可以充分受益于 LangGraph 的能力。通过使用多个代理分析用户行为、偏好和上下文数据,这些系统能够为产品、内容或服务提供量身定制的建议。LangGraph 的灵活性支持整合多种数据源和算法,从而提升推荐的准确性与相关性。
个性化学习环境
在教育平台中,LangGraph 可用于创建适应性学习环境,以满足个体化的学习风格和需求。多个代理可以评估学生的进度、提供定制化练习,并提供实时反馈。LangGraph 的有状态特性确保系统保留每位学习者的表现与偏好信息,从而带来更个性化且更有效的学习体验。
结语
LangGraph 通过提供一个用于管理状态和协调代理交互的结构化框架,大幅简化了复杂 LLM 应用的开发。
LangGraph 的潜在发展方向包括与其他 LangChain 组件的集成、对新 LLM 模型的支持,以及引入来自学术界的更先进代理运行时。
如果您想进一步了解在 LangChain 生态内开发应用,推荐这门课程:使用 LangChain 开发 LLM 应用。
Ryan 是一名首席数据科学家,专注于使用大型语言模型构建 AI 应用。他是伦敦帝国理工学院自然语言处理与知识图谱方向的博士候选人,并在该校获得了计算机科学硕士学位。除数据科学之外,他还撰写每周的 Substack 时事通讯 The Limitless Playbook,分享来自全球顶尖思想家的一个可操作理念,并不时撰写关于核心 AI 概念的文章。

想象一下,您正在构建一个复杂的、多代理的大型语言模型(LLM)应用。这很令人兴奋,但也伴随着挑战:管理各个代理的状态、协调它们的交互,以及有效地处理错误。这正是 LangGraph 大显身手的地方。
LangGraph 是 LangChain 生态中的一个库,旨在直面这些挑战。它提供了一个框架,用于以结构化的方式定义、协调和执行多个 LLM 代理(或链)。
它通过支持创建循环图,简化了开发过程,而循环图是开发代理运行时所必需的。借助 LangGraph,我们可以轻松构建健壮、可扩展且灵活的多代理系统。
如果您想进一步了解 LangChain 生态,推荐阅读这篇LangChain 入门介绍。您还可以查看下方我们的LangGraph 视频教程。