文章目录前言从一条路走到黑到想怎么走就怎么走一、传统 Chain 的死板固定步数的悲哀1.1 什么是 Chain1.2 Chain 的致命缺陷二、LangGraph 的灵动让 Agent 拥有大脑2.1 LangGraph 是什么2.2 核心概念StateGraph三、实战场景OpenManus 的思考-执行-观察循环3.1 用传统 Chain 怎么实现3.2 用 LangGraph 怎么实现四、Human-in-the-loop让 Agent 在关键时刻停一下4.1 什么是 Human-in-the-loop4.2 为什么需要这个4.3 实际效果五、核心优势对比Chain vs LangGraph六、什么时候该用 LangGraph6.1 ✅ 适合使用 LangGraph 的场景6.2 ❌ 不需要 LangGraph 的场景七、进阶技巧LangGraph 的最佳实践7.1 State 设计原则7.2 节点函数设计技巧7.3 条件边函数的最佳实践八、实战案例用 LangGraph 实现一个代码审查 Agent九、总结从工具到伙伴的进化 互动时间 转载声明 参考链接前言从一条路走到黑到想怎么走就怎么走如果你正在开发 AI Agent那你一定遇到过这样的灵魂拷问“我的 Agent 为什么总是像按了固定剧本的 NPC 一样不会随机应变”别慌这不是你的 Agent 智商不够高很可能是你一开始就走错了路——你还在用传统的 Chain链式结构而高手早就开始玩转 LangGraph 了。今天我们就来深度聊聊这个话题为什么要用 LangGraph 而不是传统的 Chain一、传统 Chain 的死板固定步数的悲哀1.1 什么是 Chain在 LangChain 早期Chain 是最核心的概念。你可以把它想象成一条单向流水线输入 → 步骤1 → 步骤2 → 步骤3 → ... → 步骤N → 输出每一步都必须按顺序执行一步都不能少一步都不能多。就像你去医院挂号看病挂号分诊见医生去缴费拿药回家不管你的病有多简单流程就是流程一步都不能跳过。1.2 Chain 的致命缺陷问题来了如果你的 Agent 需要根据实际情况动态调整流程呢举个真实的例子假设你在开发一个智能代码审查 Agent它的理想流程应该是分析代码发现问题 → 返回建议没发现 → 继续分析下一个文件但在传统的 Chain 里你很难实现这种条件分支和动态循环。你只能要么写死所有可能的分支天哪组合爆炸要么让 Agent 无限循环直到资源耗尽崩溃这就是 Chain 最大的痛点它只能跑固定的步数无法根据执行结果动态调整后续步骤。二、LangGraph 的灵动让 Agent 拥有大脑2.1 LangGraph 是什么LangGraph 是 LangChain 团队推出的一个新框架专门用来解决 Agent 的复杂编排问题。简单来说LangGraph 把你的 Agent 想象成一个有向图StateGraph每个节点Node代表一个操作比如思考、执行、观察每条边Edge代表操作之间的流转关系节点可以循环、可以分支、可以并行这下明白了吧Chain 只是一条直线的特例而 LangGraph 是真正的网络世界2.2 核心概念StateGraphStateGraph 是 LangGraph 的灵魂。它有三个关键概念State状态整个流程中共享的数据Node节点处理状态的函数Edge边节点之间的流转规则让我们用一个生活案例来理解生活类比点外卖State你的订单信息食物、地址、支付状态Node选择餐厅查看菜单下单支付等待配送确认收货Edge选择餐厅 → 查看菜单查看菜单 →如果没喜欢的→ 换一家餐厅下单支付 →如果支付失败→ 重新支付看到区别了吗LangGraph 支持条件分支和循环三、实战场景OpenManus 的思考-执行-观察循环假设你想做一个类似 OpenManus 的智能编程助手它的核心逻辑是思考 → 执行 → 观察 → 思考 → 执行 → 观察 → ... 无限循环直到任务完成3.1 用传统 Chain 怎么实现痛苦面具启动你只能这样写from langchain.chains import SequentialChain ​ # 问题步数固定无法动态循环 chain SequentialChain( chains[ think_chain, # 第1次思考 act_chain, # 第1次执行 observe_chain, # 第1次观察 think_chain, # 第2次思考万一还需要第3次呢 act_chain, # 第2次执行 observe_chain, # 第2次观察 # ... 写到什么时候是个头 ] )这就是 Chain 的噩梦你不知道需要循环多少次要么写死不够灵活要么无限循环直接崩盘。3.2 用 LangGraph 怎么实现优雅太优雅了✨from langgraph.graph import StateGraph, END from typing import TypedDict, Annotated import operator ​ # 1. 定义状态 class AgentState(TypedDict): task: str thoughts: Annotated[list, operator.add] actions: Annotated[list, operator.add] observations: Annotated[list, operator.add] completed: bool ​ # 2. 定义节点函数 def think_node(state: AgentState): 思考节点分析当前情况决定下一步行动 # 这里调用 LLM 进行思考 thought f当前任务{state[task]} return {thoughts: [thought]} ​ def act_node(state: AgentState): 执行节点根据思考结果执行操作 # 这里执行实际操作如调用 API、运行代码等 action 执行某项操作 return {actions: [action]} ​ def observe_node(state: AgentState): 观察节点观察执行结果 # 这里观察执行结果 observation 操作执行成功 return {observations: [observation]} ​ # 3. 定义条件边函数 def should_continue(state: AgentState): 判断是否继续循环 if state[completed]: return END else: return think ​ # 4. 构建图 workflow StateGraph(AgentState) ​ # 添加节点 workflow.add_node(think, think_node) workflow.add_node(act, act_node) workflow.add_node(observe, observe_node) ​ # 设置入口 workflow.set_entry_point(think) ​ # 添加边 workflow.add_edge(think, act) workflow.add_edge(act, observe) ​ # 添加条件边根据观察结果决定下一步 workflow.add_conditional_edges( observe, should_continue, { think: think, # 继续循环 END: END # 结束 } ) ​ # 5. 编译图 app workflow.compile() ​ # 6. 运行 result app.invoke({ task: 帮我写一个快速排序算法, thoughts: [], actions: [], observations: [], completed: False })看到了吗动态循环根据should_continue函数的返回值决定是否继续灵活分支可以根据任意条件跳转到不同节点状态共享所有节点共享AgentState数据流转清晰这才是真正的 Agent 该有的样子四、Human-in-the-loop让 Agent 在关键时刻停一下除了动态流程LangGraph 还有一个超级实用的功能Human-in-the-loop人在回路。4.1 什么是 Human-in-the-loop简单来说就是在 Agent 执行到某个关键节点时暂停等待人类确认然后再继续执行。这就像是给 Agent 装了一个紧急刹车 4.2 为什么需要这个想象一下这个场景你的 Agent 需要帮你自动部署代码到生产环境流程是测试代码构建镜像推送到服务器删除旧容器启动新容器第 4 步删除旧容器是高风险操作万一 Agent 判断失误删错了容器怎么办生产环境直接宕机老板会把你和 Agent 一起开除这时候Human-in-the-loop 就派上用场了from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import StateGraph, END ​ # 创建 checkpointer用于保存状态 memory MemorySaver() ​ # 定义人类确认节点 def human_confirmation_node(state: AgentState): 人类确认节点暂停等待用户确认 print(\n *50) print(f⚠️ 准备执行高风险操作{state[pending_action]}) print(请确认是否继续输入 yes 确认其他任意键取消) print(*50 \n) ​ # 这里会暂停等待用户通过前端界面确认 # 注意实际使用时需要配合前端界面 return state ​ # 构建图 workflow StateGraph(AgentState) ​ # 添加节点 workflow.add_node(test, test_node) workflow.add_node(build, build_node) workflow.add_node(push, push_node) workflow.add_node(human_confirm, human_confirmation_node) # 人类确认节点 workflow.add_node(delete_old_container, delete_node) workflow.add_node(start_new_container, start_node) ​ # 添加边 workflow.add_edge(test, build) workflow.add_edge(build, push) workflow.add_edge(push, human_confirm) ​ # 添加条件边只有人类确认后才继续 workflow.add_conditional_edges( human_confirm, lambda state: confirm if state.get(human_approved) else cancel, { confirm: delete_old_container, cancel: END } ) ​ # 编译图时传入 checkpointer app workflow.compile(checkpointermemory) ​ # 运行 config {configurable: {thread_id: deployment-001}} result app.invoke(initial_state, config) ​ # 图会运行到 human_confirm 节点并暂停 # 等待用户在前端点击确认按钮后图才会继续往下跑4.3 实际效果当 Agent 运行到human_confirm节点时图会自动暂停保存当前状态前端界面弹出确认对话框用户点击确认或取消根据用户选择图继续执行或终止这个功能对于**高风险操作删除文件、部署生产、发送重要邮件**来说简直是救命神器五、核心优势对比Chain vs LangGraph让我们用一个表格来总结一下两者的核心差异维度传统 ChainLangGraph流程结构固定的线性流程灵活的有向图结构分支能力需要提前写死所有分支支持动态条件分支循环能力❌ 无法实现动态循环✅ 支持无限循环和递归状态管理每一步独立状态传递麻烦统一的 State全局共享人类介入❌ 无法中途暂停✅ 支持 Human-in-the-loop适用场景简单的线性任务复杂的 Agent 应用学习曲线简单易上手需要理解图的概念一句话总结Chain 适合流水线LangGraph 适合智能体六、什么时候该用 LangGraph不是所有场景都需要 LangGraph。作为一个务实的开发者你需要知道什么时候该用大炮打蚊子。6.1 ✅ 适合使用 LangGraph 的场景需要动态循环的 Agent如 OpenManus 这种思考-执行-观察循环多分支决策流程根据不同情况走不同路径需要人工介入的高风险操作如部署、删除、支付复杂的 Multi-Agent 协作多个 Agent 互相配合需要状态持久化和恢复如长时间运行的任务6.2 ❌ 不需要 LangGraph 的场景简单的问答机器人固定步数的线性流程如文本处理流水线不需要分支和循环的单次任务快速原型验证Chain 更快上手记住工具是为目标服务的不要为了用新技术而用新技术。七、进阶技巧LangGraph 的最佳实践7.1 State 设计原则State 是整个图的核心设计好 State 至关重要# ✅ 好的 State 设计结构清晰职责分明 class AgentState(TypedDict): # 输入信息 user_request: str context: str ​ # 中间过程用 list 记录方便追溯 thoughts: Annotated[list, operator.add] actions: Annotated[list, operator.add] results: Annotated[list, operator.add] ​ # 控制标志 completed: bool error: Optional[str] ​ # 元数据 step_count: int7.2 节点函数设计技巧每个节点函数应该是纯函数无副作用这样更容易调试和测试def node_function(state: AgentState) - dict: 节点函数的标准格式 1. 只接收 state 作为参数 2. 只返回需要更新的状态字段 3. 不要修改传入的 state返回新的字典 # 处理逻辑 result do_something(state) ​ # 只返回需要更新的字段 return { results: [result], completed: True }7.3 条件边函数的最佳实践条件边函数应该简单清晰只返回字符串def routing_function(state: AgentState) - str: 条件边函数只返回目标节点名称 if state.get(error): return error_handler elif state.get(completed): return END else: return next_step八、实战案例用 LangGraph 实现一个代码审查 Agent让我们把前面的知识整合起来实现一个完整的代码审查 Agentfrom langgraph.graph import StateGraph, END from typing import TypedDict, Annotated, Optional import operator class CodeReviewState(TypedDict): code: str issues: Annotated[list, operator.add] suggestions: Annotated[list, operator.add] approved: bool current_file: str def analyze_code(state: CodeReviewState): 分析代码找出潜在问题 code state[code] # 这里可以调用 LLM 进行代码分析 issues [] # 示例检查是否有未使用的变量 if unused_var in code: issues.append({ file: state[current_file], line: 10, type: warning, message: 变量 unused_var 已定义但未使用 }) return {issues: issues} def generate_suggestions(state: CodeReviewState): 根据问题生成改进建议 suggestions [] for issue in state[issues]: if issue[type] warning: suggestions.append( f建议删除未使用的变量 {issue[message].split(\\)[1]} ) return {suggestions: suggestions} def human_review(state: CodeReviewState): 人工审核节点 print(\n *60) print( 代码审查报告) print(*60) for issue in state[issues]: print(f\n❌ [{issue[file]}:{issue[line]}] {issue[message]}) print(\n 改进建议) for suggestion in state[suggestions]: print(f • {suggestion}) print(\n *60) print(是否批准此代码需要人工确认) print(*60 \n) # 这里会暂停等待前端确认 return state def check_approval(state: CodeReviewState): 检查是否获得批准 if state.get(approved, False): return merge else: return request_changes # 构建图 workflow StateGraph(CodeReviewState) workflow.add_node(analyze, analyze_code) workflow.add_node(suggest, generate_suggestions) workflow.add_node(human_review, human_review) workflow.add_edge(analyze, suggest) workflow.add_edge(suggest, human_review) workflow.add_conditional_edges( human_review, check_approval, { merge: END, request_changes: suggest # 返回重新生成建议 } ) workflow.set_entry_point(analyze) app workflow.compile()这个 Agent 会分析代码问题生成改进建议暂停等待人工审核根据审核结果决定是合并还是要求修改九、总结从工具到伙伴的进化回到最初的问题为什么要用 LangGraph 而不是传统的 Chain答案其实很简单Chain 是工具帮你完成固定的任务LangGraph 是伙伴和你一起思考和决策当你需要构建一个真正智能的 Agent一个能够 根据情况动态调整策略 无限循环直到任务完成 在关键时刻停下来等你确认 和其他 Agent 协作完成复杂任务这时候LangGraph 就是你的不二之选。 互动时间看完这篇文章你有什么想法你在开发 Agent 时遇到过哪些传统 Chain 搞不定的场景你觉得 LangGraph 还有哪些可以改进的地方你用 LangGraph 做过什么有趣的项目欢迎在评论区分享你的经验和想法我们一起交流进步 转载声明本文为原创技术文章欢迎转载但请注明!请保持文章完整性不得删改核心内容 参考链接LangGraph 官方文档LangChain 官方文档OpenManus GitHubStateGraph API 参考如果这篇文章对你有帮助别忘了点个赞 关注我更多 AI 开发干货持续更新中