普通视图

Received yesterday — 2026年6月14日技术博客

LangGraph开篇

2026年3月24日 00:00

持续更新中

1.概述

LangChain就像一条流水线,对于一步接着一步的任务,用LangChain链式调用可以完美实现,但是很多任务很复杂,并不是一条直线完成的,需要根据各种条件走各种分支,这种复杂任务如果使用LangChain来编程实现,步骤就会很复杂,需要很多的if else判断。

当然解决这个问题还可以通过将任务做成多Agent,让Agent多次推理和决策并执行某个分支,但是这样消耗时间和token都很多,而且这个过程中智能体就是一个黑盒,不可控,不知道得推理多少次,也不知道内部是怎么执行的,过程难以监控和干预,这样一来这种复杂任务LangChain就不适用了,就可以使用LangGraph来实现。

LangGraph是基于LangChain构建的,面向智能体的可实现多轮交互、状态持久化和分支并行执行的图结构工作流框架,是LangChain的高级编排工具,LangGraph中,无论图结构有多复杂,单个任务的执行仍然是线性的,单个任务背后依然是依靠LangChain的链式执行实现的。

LangGraph(图) = 状态(State) + 节点(Node) + 边(Edge)

LangGraph将工作流程抽象为一种的有向图结构,LangGraph的图结构比LangChain的链结构,更加适合这种多分支复杂任务,具体表现为:

  1. LangGraph提供了强大的状态管理控制,允许Agent在不同节点之间传递和维护信息,实现长期记忆和多轮对话能力,通过定义节点和边,可以精确控制Agent执行逻辑,包括条件分支,循环等。

  2. LangGraph能够无缝集成各种外部工具(搜索引擎,数据库,API等),让Agent能够实时获取信息,执行特定操作,拓展了LLM的能力边界。

  3. LangGraph使得Agent的运行路径清晰可见,便于理解Agent的决策过程,出现问题易于定位和调试

  4. LangGraph使得模块具有可复用性,各个节点都是独立的,可复用的组件,维护性高,易于拓展,还能通过子图机制将复杂的工作流拆解为多个可独立开发和测试的模块,提高开发测试效率。

2.快速开始

基于Python 3.12.x

pip install -U  langgraph

基于Graph API定义一个流程

from typing import TypedDictfrom langgraph.constants import STARTfrom langgraph.constants import ENDfrom langgraph.graph import StateGraph# 状态类class DemoState(TypedDict):    name: str    greeting: str# 节点def name(state: DemoState) -> dict:    new_name = f"Hello, { state['name'] }"    state['name'] = new_name    print(new_name)    return state# 节点def greeting(state: DemoState) -> dict:    new_greeting = f" Hi { state['greeting'] }"    state['greeting'] = new_greeting    print(new_greeting)    return stateif __name__ == "__main__":    graph = StateGraph(DemoState)    graph.add_node('name', name)    graph.add_node('greeting', greeting)    graph.add_edge(START, 'name')    graph.add_edge('name', 'greeting')    graph.add_edge('greeting', END)    app = graph.compile()    res = app.invoke({'name':'lzj', 'greeting':'hello'})    print(res)
Hello, lzj Hi hello{'name': 'Hello, lzj', 'greeting': ' Hi hello'}

LangGraph可以通过实现可视化

pip install grandalf
#... ...app = graph.compile()app.get_graph().print_ascii()
+-----------+  | __start__ |  +-----------+        *              *              *          +------+       | name |       +------+           *              *              *        +----------+   | greeting |   +----------+         *              *              *         +---------+    | __end__ |    +---------+ 
❌