Skip to content

第一章LangGraph ​

什么是LangGraph ​

节点:代表计算单元,可以是LLM调用、工具执行或任何自定义逻辑
边:定义节点之间的转换逻辑,决定执行流程
状态:节点的属性(节点可以携带的信息)-->节点可以想象成节点对象
代码中节点就是函数 LangGraph 提供了构建生产级智能体应用的核心能力


补充整理:下面是课后补充的代码示例与对比说明,用于复习时对照。

三个概念一张图 ​

text
        ┌─────────┐         ┌─────────┐
        │  node_a │────────▶│  node_b │
        └─────────┘   edge  └─────────┘
              │                  │
              └────────┬─────────┘
                       ▼
                  State(共享数据)
  • State:一张所有节点都能读写的「公共白板」。
  • Node:一个函数,签名固定为 (state) -> 新状态片段。
  • Edge:从一个节点到下一个节点的跳转规则。

理解 State 是关键——节点之间不直接传参,都通过 State 中转,这让每个节点可以独立测试、独立替换。

最小可运行图 ​

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

# 1. 定义 State:一张白板的结构
class State(TypedDict):
    messages: list[str]
    count: int

# 2. 定义节点:函数进出都是 State
def node_a(state: State) -> dict:
    print("进入节点 A")
    return {"count": state["count"] + 1, "messages": state["messages"] + ["A 处理过"]}

def node_b(state: State) -> dict:
    print("进入节点 B")
    return {"messages": state["messages"] + ["B 处理过"]}

# 3. 组装图
graph = StateGraph(State)
graph.add_node("a", node_a)
graph.add_node("b", node_b)

graph.set_entry_point("a")          # 从哪个节点开始
graph.add_edge("a", "b")            # a 执行完去 b
graph.add_edge("b", END)            # b 执行完结束

# 4. 编译并执行
app = graph.compile()

result = app.invoke({"messages": [], "count": 0})
print(result)
# {'messages': ['A 处理过', 'B 处理过'], 'count': 1}

注意节点返回值是状态片段而不是完整 State,LangGraph 负责合并回去。这也是为什么函数里写 {"count": ...} 就够了。

条件边:让流程会拐弯 ​

普通边是「必定走」,条件边是「看情况走」——这才是智能体的灵魂:

python
from langgraph.graph import StateGraph, END

class State(TypedDict):
    score: int
    retry: int

def check(state: State) -> str:
    """返回下一个要去的节点名"""
    if state["score"] >= 60:
        return "pass"
    return "retry_node"

graph = StateGraph(State)
graph.add_node("check", lambda s: s)
graph.add_node("pass", lambda s: {"score": s["score"]})
graph.add_node("retry_node", lambda s: {"retry": s["retry"] + 1})

graph.set_entry_point("check")
graph.add_conditional_edges(
    "check",
    check,
    {"pass": "pass", "retry_node": "retry_node"}
)
graph.add_edge("pass", END)
graph.add_edge("retry_node", "check")   # 回到检查点,形成循环

app = graph.compile()

能形成循环是 LangGraph 相对普通链式编排最大的优势——重试、反思、多轮规划都靠它。

和 LangChain Agent 怎么选 ​

LangChain Agent / LCELLangGraph
结构链式,一步接一步图,可分支可循环
适合流程固定的 RAG、简单工具调用需要循环、回退、人工介入、多智能体协作
状态管理隐式,靠内存里的列表显式 State,可持久化
复杂度低,上手快略高,但可控性强

经验法则:流程是直线就用 LCEL,流程要拐弯或回头就上 LangGraph。

什么时候该用它 ​

别为了用而用。下面这些场景才真正需要图:

  • 需要重试/自我修正:生成结果不达标就回退重来。
  • 需要循环:多轮检索,直到信息足够。
  • 需要持久化与断点续跑:长时间任务中途挂了能从断点恢复。
  • 需要人在回路:执行到敏感步骤时暂停等人确认。
  • 需要多智能体协作:多个角色各自负责一段子图。