最近在面试和实际项目落地中,我发现 LangGraph 的热度正在飞速上升。为什么?因为以前我们用 LangChain 的链只能做"直线"逻辑,一旦遇到复杂的流程(比如:写代码 -> 测Bug -> 有Bug回去改 -> 没Bug结束),LangChain 就显得很别扭。
而 LangGraph 就是为了解决"循环 "和"状态管理"而生的。
今天我不讲枯燥的源码,直接带你用一个真实的**"代码生成与自愈 Agent"**案例,30分钟上手 LangGraph。
LangGraph 实战指南:从"直线思维"到"闭环思维"
1. 为什么我们需要 LangGraph?(市场痛点)
在真实的开发工作中,老板和客户的要求往往不是线性的。
- 传统 LangChain (Chain): 就像一条流水线。A -> B -> C -> 结束。如果 C 步骤发现问题,想回到 A 重做,非常困难。
- LangGraph (Graph): 就像一个状态机。你可以定义节点和连线,允许流程在节点之间跳转、循环。
场景举例:
你要做一个"自动写代码助手"。
- LLM 生成代码。
- 执行代码。
- 如果报错 -> 把错误信息喂回给 LLM,让它修改代码(回到步骤1)。
- 如果成功 -> 结束。
这种"测Bug -> 改Bug"的闭环,才是真实工作流的常态,也是 LangGraph 在简历上值钱的地方。
2. 核心概念:也就是三个圈圈几条线
别被文档吓到,LangGraph 就是在画图。
- State (状态): 也就是"白板"。所有节点都能看到这块白板,也能在上面修改内容(比如:代码内容、报错信息、重试次数)。
- Node (节点): 也就是"干活的工人"。比如"写代码的工人"、"执行代码的工人"。
- Edge (边): 也就是"指挥官"。决定下一步去哪个节点。如果是条件边,它就是红绿灯(报错走左边,成功走右边)。
3. 动手实战:构建一个"代码自愈 Agent"
我们要构建一个能自己写 Python 代码、自己运行、错了自己改的 Agent。
第一步:准备工作
你需要安装 LangGraph 和 LangChain 的 OpenAI 适配包。
pip install langgraph langchain_openai
第二步:定义"白板"
我们需要让节点之间共享信息。最简单的状态就是一个字典。
from typing import TypedDict, Annotated
import operator
# 定义状态结构
class AgentState(TypedDict):
messages: list # 所有的对话历史
code: str # 生成的代码
output: str # 代码执行结果
error: str # 错误信息
attempts: int # 当前重试次数
第三步:定义"节点工人"
我们需要两个工人:
-
coder_node: 负责写/改代码。 -
executor_node: 负责执行代码并记录结果。from langchain_openai import ChatOpenAI
初始化模型
llm = ChatOpenAI(model="gpt-4o", temperature=0)
def coder_node(state: AgentState):
"""根据当前状态生成或修复代码"""# 如果是第一次尝试 if state['attempts'] == 0: prompt = f"请写一段Python代码实现:{state['messages'][-1]}" else: # 如果是重试,把错误信息告诉它 prompt = f""" 上一次的代码出错了,请修复。 错误代码:{state['code']} 错误信息:{state['error']} 请只返回修正后的代码。 """ response = llm.invoke(prompt) # 更新状态 return {"code": response.content, "attempts": state['attempts'] + 1}def executor_node(state: AgentState):
"""执行代码"""
try:
# 实际工作中这里要用沙箱环境!这里为了演示直接用 exec
local_vars = {}
exec(state['code'], {}, local_vars)
return {"output": "执行成功!", "error": ""}
except Exception as e:
return {"output": "", "error": str(e)}
第四步:定义"红绿灯"
这是最关键的一步。如果没报错,就结束;如果报错,就回 coder 节点。
def should_continue(state: AgentState):
"""决策函数:根据执行结果决定下一步"""
if state['error']:
return "retry" # 还有错误,回去重写
return "end" # 成功了,结束
第五步:组装流水线
现在我们用 Graph 把这些串起来。
from langgraph.graph import StateGraph, END
# 1. 创建图
workflow = StateGraph(AgentState)
# 2. 添加节点
workflow.add_node("coder", coder_node)
workflow.add_node("executor", executor_node)
# 3. 设置入口
workflow.set_entry_point("coder")
# 4. 添加连线(正常的直线流程)
workflow.add_edge("coder", "executor")
# 5. 添加条件边(循环的核心)
workflow.add_conditional_edges(
"executor", # 从哪个节点出来
should_continue, # 决策函数
{
"retry": "coder", # 如果返回 retry,回到 coder
"end": END # 如果返回 end,结束
}
)
# 6. 编译图
app = workflow.compile()
第六步:运行测试
# 初始状态
initial_state = {
"messages": ["写一个计算斐波那契数列第10项的函数"],
"code": "",
"output": "",
"error": "",
"attempts": 0
}
# 运行
result = app.invoke(initial_state)
print("最终生成的代码:")
print(result['code'])
print("执行结果:", result['output'])
print("尝试次数:", result['attempts'])
4. 工作市场视角:面试怎么吹?
当你理解了上面的代码,你在面试或简历中可以这样描述:
"我基于 LangGraph 架构重构了公司的 RAG/Agent 流程。相比于传统的 LangChain Chain 模式,我引入了 StateGraph 状态管理机制,实现了类似'代码自愈'的闭环反馈系统。这让我们的任务成功率从 60% 提升到了 95%,因为它能自动处理执行过程中的异常并进行重试,大大减少了人工干预的成本。"
关键点总结:
- 状态持久化: LangGraph 原生支持 checkpoint,你可以随时暂停、恢复任务(比如人工介入审批,这也是个高级用法)。
- 减少 Token 消耗: 相比于把整个对话历史塞给 LLM,状态机可以只保留关键信息(比如只保留最新的错误信息),省钱。
- 可观测性: Graph 的可视化做得很好,方便 Debug。
5. 总结
LangGraph 其实不难,它就是把线性代码变成了有循环的流程图。
- State: 大家共用的黑板。
- Node: 读写黑板的工人。
- Conditional Edge: 判断黑板内容,决定下一个工人是谁。
作为 AI 应用工程师,掌握 LangGraph 意味着你能处理更复杂的业务逻辑,而不仅仅是简单的"一问一答"。赶紧动手试试吧,把上面的代码跑通,你就入门了!