手记

LangGraph对象:图(节点、边、状态)的定义与使用全解析

在AI Agent开发中,LangGraph凭借其状态机驱动的流程控制能力,成为构建复杂工作流的核心工具。本文将通过深度解析图对象的三大核心要素(状态、节点、边),结合代码案例,带你掌握LangGraph的底层设计逻辑与实战技巧。

LangGraph图对象的哲学内核

LangGraph的图结构本质上是对现实业务流程的抽象建模:

状态(State):存储工作流全生命周期的数据,如同快递单贯穿所有中转站

节点(Node):执行具体操作的函数,对应流程中的决策点或动作点

边(Edge):定义节点间的流转规则,包含固定路径与条件分支

⚠️ 关键特性:支持循环执行(如机器人避障导航)、条件分支(如审批流金额判断)、状态持久化(中途暂停/恢复)

核心组件定义与代码实现

1. 状态定义:结构化数据容器

from typing import TypedDict, Annotated, Sequence
​from langgraph.graph import MessagesState
​class OrderProcessingState(TypedDict):    
​# 用户原始请求    
​user_request: str    
​# 库存查询结果    
​inventory_check: Annotated[dict, "库存系统返回数据"]   
# 支付状态    
​payment_status: Annotated[bool, "支付是否成功"]    
​# 最终订单号    
​order_id: Annotated[str, "生成的唯一订单ID"]        
​# 继承MessagesState支持对话历史    
​messages: Annotated[Sequence, MessagesState]

✅ 最佳实践:使用TypedDict+Annotated明确字段语义,继承MessagesState可兼容对话类场景

2. 节点定义:执行单元设计

from langgraph.graph import StateGraph
from langchain_openai import ChatOpenAI

# 初始化LLM
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

def inventory_check_node(state: OrderProcessingState) -> dict:
    """模拟库存查询节点"""
    # 实际场景应调用真实库存API
    mock_response = {"product_id": "P12345", "stock": 10}
    return {"inventory_check": mock_response}

def payment_process_node(state: OrderProcessingState) -> dict:
    """模拟支付处理节点"""
    # 根据库存判断支付是否成功
    if state["inventory_check"]["stock"] > 0:
        return {"payment_status": True, "order_id": "O987654321"}
    return {"payment_status": False}

🔍 节点设计原则:

  • 输入参数始终是完整状态对象
  • 返回值仅需包含需要更新的字段(自动合并到全局状态)
  • 可混合使用LLM调用与业务逻辑

3. 边定义:流程控制逻辑

# 创建状态图
workflow = StateGraph(OrderProcessingState)

# 添加节点
workflow.add_node("check_inventory", inventory_check_node)
workflow.add_node("process_payment", payment_process_node)

# 添加边
workflow.add_edge(START, "check_inventory")
workflow.add_edge("check_inventory", "process_payment")

# 添加条件边
workflow.add_conditional_edges(
    "process_payment",
    lambda state: "success" if state["payment_status"] else "failure",
    {
        "success": END,
        "failure": "check_inventory"  # 支付失败则重新查询库存
    }
)

# 编译图
app = workflow.compile()

🔄 条件边高级用法:

  • 使用lambda表达式动态判断分支
  • 可实现多层嵌套条件(如审批流中的金额分级)
  • 支持循环边(如机器人导航中的避障重试)

可视化工作流与执行效果

1. 工作流拓扑图(文字描述)

[START] 
  ↓
[库存检查] → [支付处理] → [成功结束]
  ↑__________ [支付失败后重新检查库存]

2. 代码执行示例

# 初始状态

initial_state = {
    "user_request": "购买商品P12345",
    "messages": [{"role": "user", "content": "我要下单"}]
}

# 执行工作流
result = app.invoke(initial_state)

# 输出结果
print("最终订单状态:", result)
"""
{
  'user_request': '购买商品P12345',
  'inventory_check': {'product_id': 'P12345', 'stock': 10},
  'payment_status': True,
  'order_id': 'O987654321',
  'messages': [...]
}
"""

进阶技巧与行业实践

1. 状态持久化实现

from langgraph.checkpoint.memory import MemorySaver

# 创建带持久化的图实例
app = workflow.compile(checkpointer=MemorySaver())

# 恢复中断的流程
thread_config = {"configurable": {"thread_id": "user_123"}}
result = app.invoke(initial_state, thread_config)

2. 多智能体协作场景

# 定义客服与质检两个角色
workflow.add_node("customer_service", cs_agent_node)
workflow.add_node("quality_check", qc_agent_node)

# 设置角色间对话边
workflow.add_edge("customer_service", "quality_check")
workflow.add_conditional_edges(
    "quality_check",
    lambda s: "escalate" if s["needs_human"] else "auto_resolve"
)

典型应用场景对比

场景类型 传统实现痛点 LangGraph解决方案
审批流程 状态同步困难,分支逻辑复杂 条件边+状态持久化,支持任意跳转
电商订单履约 多系统对接时数据一致性难保障 全局状态容器,确保数据可见性
机器人导航 动态环境需实时决策 循环边+感知节点,实现闭环控制

从流程思维到智能体思维

LangGraph通过显式定义状态流转,将复杂的AI工作流转化为可组合、可调试的图结构。掌握其核心组件的定义与使用,是构建高可用AI Agent系统的关键。建议开发者从简单场景切入,逐步探索多智能体协作、动态流程优化等高级模式。

0人推荐
随时随地看视频
慕课网APP