[转]LangGraph完整指南
AI 大模型开发

[转]LangGraph完整指南

JACIN11 分钟阅读

本文全文在微信公众号,链接如下:https://mp.weixin.qq.com/s/Vso7pBHS3SpQ-TMPgp3aBg

image

概述#

LangGraph 提供了一个基于图(Graph)的框架,使得开发者能够创建具有循环工作流和状态管理能力的 LLM 应用程序。它的设计理念是将复杂的 AI 应用拆分为相互连接的节点,通过边(Edges)进行通信,并在整个执行过程中维护统一的状态(State),从而实现更可控、更可靠的 Agent 行为。

与传统的线性工作流不同,LangGraph 允许开发者定义循环和分支逻辑,这使得 Agent 能够根据上下文动态调整执行路径。例如,一个智能客服 Agent 可以在无法回答用户问题时选择搜索网络,或者在需要时请求人工干预。

LangGraph 是 LangChain 生态系统的一部分,但它专注于解决特定类型的问题。LangChain 提供了构建 LLM 应用的基础组件,如模型调用、提示模板、工具集成等;而 LangGraph 则专注于如何将这些组件组织成复杂的工作流。可以将 LangChain 视为「零件库」,而 LangGraph 则是「组装蓝图」,两者相辅相成,共同帮助开发者构建强大的 AI 应用。LangGraph 可以使用 LangChain 的所有组件,同时增加了状态管理和流程控制的能力。


python
pip install langgraph langchain langchain-openai

核心#

LangGraph 的架构建立在四个核心概念之上:图(Graph)、节点(Nodes)、边(Edges)和状态(State)。这四个组件协同工作,共同定义了 Agent 的行为和执行流程。

状态(state)#

状态是 LangGraph 中最重要的概念之一,它是一个共享的数据结构,保存了应用程序在执行过程中的所有相关信息。状态可以包含对话历史、用户输入、中间结果、决策记录等任何需要在节点之间传递的数据。每个节点都可以读取和修改状态,而状态的更新会触发图的下一次执行。状态的定义通常使用 Python 的 TypedDict 或 Pydantic 模型,以确保类型安全和代码可读性。

节点(node)#

节点是图中的计算单元,每个节点代表一个具体的操作或功能。节点可以是一个简单的函数,调用 LLM 生成回复;也可以是一个复杂的模块,执行网络搜索、数据库查询或调用外部 API。节点的输入是当前状态,输出是状态的更新。LangGraph 中的节点设计遵循单一职责原则,每个节点应该只做一件事,这使得图的逻辑更加清晰,也更易于调试和维护。

常见的节点类型包括:Agent 节点(负责决策和生成回复)、工具节点(执行具体操作)、路由节点(决定下一步执行哪个节点)、条件节点(根据条件执行不同逻辑)等。节点的粒度可以根据需求灵活调整,可以是一个完整的功能模块,也可以是模块内的一个步骤。关键是要确保每个节点的职责清晰,输入输出明确。

边(edges)#

边定义了节点之间的连接关系,决定了执行流程如何从一个节点流向另一个节点。LangGraph 支持两种类型的边:普通边(Normal Edges)和条件边(Conditional Edges)。普通边表示无条件的执行流程,从节点 A 完成后必然执行节点 B;条件边则允许根据状态中的信息动态选择下一个执行节点,这是实现复杂控制流的关键。条件边使 Agent 能够根据上下文做出决策,例如在需要时调用搜索工具,或在任务完成后终止执行。

图(graph)#

图是 LangGraph 的顶层抽象,它将节点和边组合成一个完整的工作流。LangGraph 提供了 StateGraph 类来构建图,开发者需要先定义状态结构,然后添加节点和边,最后编译图以生成可执行的应用程序。图的编译过程会验证图的完整性,确保所有节点都正确连接,没有孤立节点或死循环。编译后的图可以重复执行,每次执行都会从初始状态开始,经过一系列节点,最终到达结束状态。

示例#

python
from typing import TypedDict
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI

# 定义状态结构
class AgentState(TypedDict):
    messages: list
    user_input: str

# 定义节点函数
def chat_node(state: AgentState):
    llm = ChatOpenAI(model="gpt-4")
    response = llm.invoke(state["messages"])
    return {"messages": [response]}

# 构建图
# 建了一个 StateGraph 实例,添加了节点和边,设置了入口点,然后调用 compile() 方法编译图。
**workflow = StateGraph(AgentState)
workflow.add_node("chat", chat_node)
workflow.set_entry_point("chat")
workflow.add_edge("chat", END)

# 编译并运行
app = workflow.compile()
result = app.invoke({"messages": [("user", "你好!")]})

常见工作流程#

1. 链式工作流(Chain):#

最简单的模式,节点按顺序依次执行。适用于任务可以明确分解为一系列步骤的场景,例如文档摘要生成(读取文档 → 分析结构 → 提取要点 → 生成摘要)。链式工作流的优点是逻辑清晰、易于理解和调试;缺点是缺乏灵活性,无法根据中间结果调整执行路径。

2. 路由工作流(Router):#

根据输入或中间结果选择不同的执行路径。通过条件边实现动态路由,适用于需要根据情况采取不同处理方式的场景。例如,一个客服系统可以根据问题类型路由到不同的专业团队:技术问题路由到技术支持,订单问题路由到客服团队,投诉问题路由到投诉处理部门。

3. 循环工作流(Loop):#

允许重复执行某些节点,直到满足退出条件。这是 LangGraph 区别于传统工作流引擎的重要特性,对于需要迭代优化或持续监控的场景非常有用。例如,一个代码审查 Agent 可以循环检查代码问题,每次修复后重新检查,直到没有问题为止;或者一个研究 Agent 可以持续搜索和整理信息,直到收集到足够的内容。

4. 协作工作流(Collaborator):#

多个 Agent 协同工作,共同完成复杂任务。每个 Agent 负责特定的领域或功能,通过共享状态进行协作。例如,一个内容创作系统可以包含研究 Agent、写作 Agent、编辑 Agent 和审核 Agent,它们分工协作完成从选题到发布的整个流程。协作工作流的挑战在于协调多个 Agent 的执行顺序和结果合并。

进阶应用#

持久化与状态管理#

在实际应用中,Agent 的状态持久化是一个关键问题。用户可能需要暂停对话,稍后继续;或者需要回溯到之前的某个状态重新执行。LangGraph 提供了完善的持久化机制,支持多种存储后端,包括内存存储、SQLite、PostgreSQL 等。通过配置 checkpointer,可以自动保存 Agent 的执行状态,实现暂停、恢复和回溯功能。状态持久化的另一个重要应用是「时间旅行」(Time Travel)。

LangGraph 记录了每次状态变更的检查点(Checkpoint),开发者可以查看完整的执行历史,甚至可以从任意检查点重新开始执行。这对于调试复杂 Agent、分析 Agent 行为、以及实现撤销操作等功能非常有帮助。在生产环境中,合理配置持久化策略对于保证服务可靠性和用户体验至关重要。

人机协作(Human-in-the-Loop)#

在许多场景下,完全自动化的 Agent 并不能满足需求,需要引入人工干预来提高可靠性或处理特殊情况。LangGraph 的 Human-in-the-Loop 机制允许在特定节点暂停执行,等待人工审核或输入后再继续。这对于需要审批的业务流程、高风险操作的确认、以及 Agent 能力边界的处理都非常重要。

实现 Human-in-the-Loop 的关键是使用 interrupt_before 或 interrupt_after 参数。当执行到指定节点时,图会自动暂停并返回当前状态,等待外部输入。人工审核完成后,可以使用 update_state 方法更新状态,然后继续执行。这种机制使得 Agent 能够在保持自动化效率的同时,获得必要的人工监督和干预。

多 Agent 系统#

随着任务复杂度的增加,单一 Agent 可能难以满足需求。多 Agent 系统通过让多个专业化的 Agent 协作,能够处理更加复杂的任务。LangGraph 提供了构建多 Agent 系统的完整支持,包括 Agent 之间的通信、协调和结果合并。常见的多 Agent 架构包括:主从架构(一个协调器 Agent 分发任务给多个工作 Agent)、团队架构(多个平等 Agent 协作讨论)、层次架构(多层 Agent 组织结构)。

构建多 Agent 系统的关键挑战在于协调和通信。LangGraph 通过共享状态机制简化了 Agent 之间的数据交换,每个 Agent 都可以读取和更新共享状态。对于更复杂的协调需求,可以使用专门的协调节点来管理 Agent 之间的交互。多 Agent 系统的设计需要考虑 Agent 的分工、通信协议、冲突解决机制等因素,良好的架构设计是成功的关键。

流式输出与实时交互#

对于需要实时反馈的应用,LangGraph 支持流式输出(Streaming)。通过 astream 或 stream 方法,可以实时获取节点执行的中间结果,而不需要等待整个图执行完成。这对于聊天应用尤为重要,用户可以看到 LLM 的回复逐步生成,而不是等待很长时间后才看到完整结果。

流式输出不仅改善了用户体验,也使得监控和调试更加方便。LangGraph 支持多个层面的流式输出:可以流式输出单个节点的结果、流式输出 token(需要 LLM 支持)、以及流式输出状态更新。开发者可以根据应用需求选择合适的流式模式。在实现流式输出时,需要注意处理异步逻辑和并发问题,确保数据的一致性和正确性。

评论

还没有评论,来发第一个吧