LangGraph真能提效吗?先看流程里最慢的那一步

一步步实现自己的智能体:基于 LangGraph 快速构建 《基于LangGraph快速构建智能体系统指南》 本文详细介绍了如何使用LangGraph框架构建一个"日报生成助手"智能体。LangGraph结合了LangChain和状态图思想,将Agent执行过程分解为可管理的节点状态和转换规则。文章通过实战演示,从安装依赖到定义状态结构、创建功能节点、构建流程图,最终运行获得日报结果。该框架支持可视化逻辑流、清晰状态传递、灵活工具链组合和多路径决策,比纯prompt更可靠,比Auto-GPT更工程化,特别适合需要流程清晰、控制精准的Agent构建 阅读详情

聊《LangGraph真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。

摘要

摘要:业务方一句"加个审批流程",Demo 级别的 Agent 瞬间崩盘。这篇文章复盘我从脚本式 Agent 转向 LangGraph 图工作流的过程,核心观点是:大模型应用真正难的不是调用模型,而是把权限、日志、人工审批这些工程要素嵌进工作流里。通过一个报销审批系统的实战案例,展示 State、Node、Conditional Edge 的设计思路,以及为什么图结构比链式调用更适合生产环境。

---

目录

  • 业务方一句话,Demo 就崩了
  • 为什么脚本式 Agent 扛不住生产需求
  • State 设计:先画地图再走路
  • Node 与 Conditional Edge:用图表达业务逻辑
  • 人工审批节点:Agent 里最难的那一步
  • 工程化落地:权限、日志、可观测
  • 总结

---

业务方一句话,Demo 就崩了

文章插图 1

上个月接到一个内部需求:给客服团队做一个"工单分类助手"。业务方原话是"帮客服把工单自动分类,不用他们手动选类别"。

我花了两个晚上搭了个 Demo:用户输入工单内容,Agent 调用大模型判断类别,返回结果。代码不到 100 行,跑起来丝滑得很。业务方看完点点头,说"挺好的,上线吧"。

一周后,业务方又来了:

> "分类错了要能手动修正,修正后要有日志记录。另外,涉及客户隐私的工单,只有组长才能看详情。还有,分类结果超过 3 秒没响应要超时降级。"

我盯着屏幕,沉默了三分钟。

这还只是需求清单的前三条。

Demo 能跑,是因为我只考虑了" happy path "。真正上线需要的权限校验、日志追踪、超时处理、人工干预,在脚本式架构里完全是另一套代码。而且这几套逻辑互相嵌套,改一处崩一处。

我当时的判断是:这个需求用 LangChain 的 Chain 或者简单的 Agent 循环已经搞不定了,得换个思路。

---

为什么脚本式 Agent 扛不住生产需求

文章插图 2

先说结论:脚本式 Agent 的问题不在于模型,而在于控制流。

在 Demo 阶段,我们的工作流是线性的:输入 → 模型调用 → 输出。这个过程看起来简单,但一旦业务需求增加分支、循环、人工介入、权限校验,线性结构就开始失控。

举个反例。之前看过一个团队做的"合同审核 Agent",用 LangChain 搭了一个 Pipeline:上传合同 → LLM 提取条款 → LLM 判断风险 → 生成报告。Demo 跑通了,上线后业务方要求"高风险合同必须人工复核"。

他们的做法是在 Pipeline 里加一个 if 判断:风险分数超过阈值就跳过自动输出,等待人工确认。看起来没问题,但实际运行中出现了几个 bug:

  • 人工复核期间,系统不知道这个合同处于"等待复核"状态,下次请求进来又触发了一次审核
  • 日志里没有记录"这个合同为什么被拦截",排查问题只能靠翻代码
  • 权限控制是后加的,不同角色的查看范围没有在工作流层面体现

这些问题本质上都是控制流不清晰导致的。脚本式架构把业务逻辑散落在代码各处,没有统一的"状态"概念,一旦需求变化,修改就像拆东墙补西墙。

LangGraph 的核心价值,是把工作流显式地建模成一张图。节点代表处理逻辑,边代表流转条件,状态贯穿始终。这样权限、日志、人工审批都可以作为图的一部分来设计,而不是事后打补丁。

---

State 设计:先画地图再走路

写 LangGraph 工作流,第一步永远是定义 State。

State 不是随便一个 dict,它是整个工作流的"单点真相"。每个 Node 读什么、写什么,必须在 State 里说清楚。我之前踩过的坑是:State 定义得太松,Node 之间互相依赖隐含信息,最后调试的时候根本不知道数据从哪来的。

以报销审批系统为例,State 应该包含这些字段:

from typing import TypedDict, Annotated, Optional
import operator

class ApprovalState(TypedDict):
    # 报销基本信息
    claim_id: str
    amount: float
    description: str

    # 权限相关
    requester_role: str  # employee / manager / finance
    has_permission: bool

    # 审批流程状态
    approval_status: str  # pending / approved / rejected / needs_review
    approval_history: Annotated[list, operator.add]

    # 人工审批节点等待信号
    waiting_for_approval: bool
    manual_decision: Optional[str]

    # 日志与可观测
    trace_id: str
    log_entries: Annotated[list, operator.add]

    # 最终输出
    result: Optional[str]

这里有几个设计细节值得注意:

第一,用 Annotated 和 operator.add 处理列表累加。approval_history 和 log_entries 用这个模式,每个 Node 往里面追加记录,State 会自动合并,不用手动管理。

第二,权限字段放在 State 里,而不是在 Node 内部判断。这样权限校验逻辑可以封装成一个独立的 Node,其他 Node 不关心权限,只看 has_permission 这个字段。职责分离,改权限规则只改一个地方。

第三,waiting_for_approval 是人工审批节点的关键信号。这个字段告诉图:"当前流程暂停了,等外部信号恢复"。没有这个状态标记,图无法表达"等待人工介入"这个语义。

---

优快云资料领取方式

Node 与 Conditional Edge:用图表达业务逻辑

State 定好后,开始设计 Node 和 Edge。

Node 就是普通的 Python 函数,接收 State,返回更新后的 State。关键是要让每个 Node 只做一件事。

from langgraph.graph import StateGraph, START, END

def check_permission(state: ApprovalState) -> ApprovalState:
    """权限校验节点"""
    role = state["requester_role"]
    amount = state["amount"]

    # 权限规则:金额超过 5000 需要 manager 以上角色
    if amount > 5000 and role == "employee":
        state["has_permission"] = False
        state["log_entries"].append({
            "step": "permission_check",
            "action": "denied",
            "reason": "amount_exceeds_role_limit"
        })
    else:
        state["has_permission"] = True
        state["log_entries"].append({
            "step": "permission_check",
            "action": "allowed"
        })

    return state

def classify_claim(state: ApprovalState) -> ApprovalState:
    """分类节点 - 调用大模型"""
    if not state["has_permission"]:
        state["result"] = "permission_denied"
        return state

    # 调用 LLM 进行分类
    # ... 模型调用逻辑 ...
    state["approval_status"] = "pending"
    return state

Node 之间用 Edge 连接。普通 Edge 是无条件跳转,Conditional Edge 根据 State 决定走哪条路:

def route_approval(state: ApprovalState) -> str:
    """条件路由:根据金额和角色决定流程"""
    if not state["has_permission"]:
        return "denied"

    if state["amount"] > 10000:
        return "manual_review"  # 大额需要人工审批

    return "auto_approve"  # 小额自动通过

graph = StateGraph(ApprovalState)

# 添加节点
graph.add_node("check_permission", check_permission)
graph.add_node("classify_claim", classify_claim)
graph.add_node("manual_review", manual_review_node)
graph.add_node("finalize", finalize_node)

# 添加边
graph.add_edge(START, "check_permission")
graph.add_edge("check_permission", "classify_claim")
graph.add_conditional_edges(
    "classify_claim",
    route_approval,
    {
        "denied": "finalize",
        "manual_review": "manual_review",
        "auto_approve": "finalize"
    }
)
graph.add_edge("manual_review", "finalize")
graph.add_edge("finalize", END)

app = graph.compile()

这个设计的关键在于:业务规则被显式地表达在图的结构里,而不是隐藏在 Node 的内部逻辑中。route_approval 函数就是一个清晰的条件分支,改规则只改这个函数,不影响其他节点。

---

人工审批节点:Agent 里最难的那一步

人工审批是 Demo 和生产的分水岭。

在 Demo 里,"人工审批"通常是一个占位符:打印一句"请人工审批",然后假设审批通过了继续跑。在生产环境里,这个假设是危险的。

真实场景中,人工审批节点需要解决三个问题:

第一,流程暂停机制。图执行到人工审批节点时,应该停下来等待,而不是继续跑。LangGraph 支持通过 interrupt 机制实现:

def manual_review_node(state: ApprovalState) -> ApprovalState:
    """人工审批节点"""
    # 记录等待状态
    state["waiting_for_approval"] = True
    state["log_entries"].append({
        "step": "manual_review",
        "action": "waiting_for_human"
    })

    # 中断执行,等待外部信号
    return state

编译图时,通过 interrupt 配置,这个节点执行后会暂停,返回当前 State,等外部调用 update_state 恢复:


# 执行到人工审批节点时暂停
result = app.invoke(initial_state)

# 此时 result 包含 waiting_for_approval=True

# 等待人工审批...

# 模拟审批通过
app.update_state(result["config"], {"manual_decision": "approved"})

# 恢复执行
result = app.invoke(None, config=result["config"])

第二,审批权限校验。不是谁都能审批。在 manual_review_node 里应该校验审批人的角色权限,而不是假设调用方已经做过校验。权限校验应该贯穿整个工作流,而不是只在入口做一次。

第三,审批日志。每次人工操作都要记录:谁、什么时候、审批了什么、理由是什么。这些日志不是事后补的,而是工作流的一部分。

我之前见过一个反例:某个团队的"人工审核节点"只是简单地把数据存到数据库,没有记录操作人、没有时间戳、没有审计日志。上线后业务方要查"谁审批的这笔报销",翻代码翻了两小时。

---

工程化落地:权限、日志、可观测

把 Agent 从 Demo 推到生产,真正卡住的往往不是模型调用,而是这三个工程要素。

权限控制。权限不应该是一个单独的模块,而应该渗透进工作流的每一个节点。我的做法是:每个 Node 在执行前先检查当前用户的角色和 State 中的权限字段,不符合就直接返回错误状态,不继续执行后续逻辑。

def require_permission(state: ApprovalState, required_role: str):
    """权限校验装饰器"""
    if not state["has_permission"]:
        return {"result": "permission_denied"}

    # 检查角色是否满足要求
    role_hierarchy = {"employee": 1, "manager": 2, "finance": 3}
    if role_hierarchy.get(state["requester_role"], 0) < role_hierarchy.get(required_role, 0):
        return {"result": "insufficient_role"}

    return {}

日志追踪。每个 Node 执行前后记录日志,日志里包含 trace_id、节点名称、输入输出摘要、执行时间。日志不是打到控制台就完事,要持久化到数据库,方便事后排查。

import time
from uuid import uuid4

def with_logging(node_func):
    """日志装饰器"""
    def wrapper(state: ApprovalState) -> ApprovalState:
        start = time.time()
        trace_id = state.get("trace_id", str(uuid4()))

        state["log_entries"].append({
            "trace_id": trace_id,
            "node": node_func.__name__,
            "action": "start",
            "timestamp": time.time()
        })

        result = node_func(state)

        duration = time.time() - start
        result["log_entries"].append({
            "trace_id": trace_id,
            "node": node_func.__name__,
            "action": "complete",
            "duration_sec": duration
        })

        return result
    return wrapper

可观测性。除了日志,还要有 metrics:每个节点的执行次数、平均耗时、错误率。这些指标可以帮助定位瓶颈。比如某次上线后发现"classify_claim"节点的 P99 延迟从 2 秒涨到 8 秒,通过追踪发现是某个 LLM API 的限流导致的,及时调整了降级策略。

---

总结

从脚本式 Agent 到 LangGraph 图工作流,本质上是把隐式的控制流显式化。

Demo 阶段的 Agent 追求的是"能跑",生产阶段的 Agent 追求的是"可控"。可控意味着:流程清晰、状态可追踪、权限有校验、失败有兜底、人工可介入。

LangGraph 提供的图结构、State 管理、Conditional Edge、中断机制,正好对应了这些需求。但它不是银弹——用不好一样会写出难以维护的代码。关键是要先想清楚业务逻辑,再把逻辑映射到图的结构上,而不是先写代码再想办法加权限和日志。

我的建议是:如果你的 Agent 工作流还只有"输入 → 模型 → 输出"这一条路径,先用 LangChain 或者脚本搭 Demo 没问题。但一旦需求开始涉及分支判断、人工介入、权限控制,就该认真考虑图工作了。这时候改架构的成本,远低于上线后打补丁的成本。

最后说一句实在的:面试的时候,"我用 LangGraph 搭了一个报销审批系统"比"我用 LangChain 调了个 Agent"更有说服力。前者说明你考虑过生产环境的问题,后者只能证明你跑通了教程。

资料展示

下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。

AI大模型资料展示 1

AI大模型资料展示 2

AI大模型资料展示 3

如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。

优快云官方大礼包

LangGraph人机交互 在一些程序中,可能需要用户的状态才能使程序继续执行。例如,假如我们部署了一个web页面,在前端的输入框中得到了用户输入,接着后端接收该信息并注入到任务中,使程序根据用户的输入执行。这需要借助LangGraph的中断机制来实现,下面让我们看看怎么做!人机交互是实现应用程序的关键点,这涉及到了中断、状态保存等。通过该机制,我们可以基于langgraph搭建web界面、对话系统、自动化工作流等。下一章我们会讲解,如何使用langgraph操作sql数据库,我们会基于sqlite3实现一个简易的数据库交互程序。 阅读详情

相关推荐

LangGraph介绍

找一个LangGraph的标准实例、结合代码可以有更好的掌握比较复杂的Agent流程、最好是多循环模式。敬请期待。

谁怕平生太急 4041

Agent真能提效吗?先看流程里最慢的那一步

先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做,以及从哪里动手。摘要:很多团队在引入 AI 编程工具时,往往沉迷于“工具调用”和“记忆增强”的炫技,却忽视了最基础的权限管控和日志追踪。本文结合近期 AI 编程从个人试用走向团队协作的真实踩坑经历,复盘为何具备完整核心原理的 Agent 在生产环境中依然容易“翻车”,并给出基于安全边界和可观测性的实战建议。---为什么你的 Agent 上线就崩?因为它没有“后悔药”。在个人 Demo 中,报错了就重启,或者手动修正 Prompt。

资料免费分享,点击名片 353

langgraph对流程进行中断

langgraph对流程进行中断

luohualiushui1的专栏 887

LangGraph 工作流:从工具接入到项目提效

本文概述文章目标、核心观点和实践价值。上周深夜,生产环境的一个客服 Agent 突然发疯。原本只需要调用一次的逻辑,因为 LLM 的幻觉,在“查询订单”和“投诉工单”两个节点间无限循环了四十秒,直到触发超时被熔断。监控报警群炸了,日志里全是相同的 token 消耗。这件事让我意识到,很多开发者还在用 LangChain 的或者简单的if-else拼接 Prompt 来构建 Agent。这在 Demo 阶段很爽,但在工程上极度脆弱。当业务逻辑变得复杂,我们需要的是确定性,而不是概率。

2601_96285276的博客 321

TVS 和压敏电阻联合使用进行浪涌保护时,压敏电阻的压敏电压要低于TVS 的钳位电压 VC。

通过先让MOV接管,可以确保在大多数情况下,电压不会迅速上升到TVS二极管的钳位电压,从而保护TVS二极管免受持续高能量冲击的损害。总结来说,将MOV的压敏电压设置得低于TVS二极管的钳位电压,可以提供一种分级的保护机制,优化浪涌保护性能,同时保护敏感的TVS二极管不被过度的能量冲击损坏,并延长其使用寿命。MOV吸收的能量(Wmov):假设浪涌电流为10kA,MOV导通后将电压限制在300V,那么Wmov = Ipp * Vmov = 10kA * 300V = 3MW。例如,Vmov可以设定为275V。

weixin_66642980的博客 2248

5090D显卡安装LLaMA-Factory避坑指南:PyTorch与CUDA版本兼容性问题解决

本文是针对5090D显卡安装LLaMA-Factory时遇到的PyTorch与CUDA版本兼容性问题的详细解决指南。文章深入剖析了因GPU架构代际差异导致的“no kernel image”报错根源,并提供了从环境诊断、安装匹配的PyTorch Nightly版本,到最终集成验证的完整路径,帮助用户确保LLaMA-Factory在5090D上稳定运行。

Apple的专栏 871

一步步教你LangGraph Studio:可视化调试基于LangGraph构建的AI智能体

之前我们在第一时间介绍过使用LangChain的LangGraph开发复杂的RAG或者Agent应用,随着版本的迭代,LangGraph已经成为可以独立于LangChain核心,用于开发多步骤、面向复杂任务、支持循环的AI智能体的强大框架。近期LangGraph推出了一个使得复杂AI智能体开发更加高效的工具:LangGraph Studio,一个为可视化测试与调试基于LangGraph构建的AI智能体而设计的集成环境。本文将带领大家初步探索这个新的工具。1. 回顾LangGraph并创建测试智能体LangG

m0_63171455的博客 1万+

Cluster Computing投稿

在overleaf中新建picins.sty文件,该文件是导入的包在.tex文件中添加以下内容\usepackage{picins}%实现作者简介%下边这块有几个人复制几段\vspace{0\baselineskip} %这一行控制作者间隔,可视情况改数字!!!!!!!!

这里是萤石ym的学习路途,努力搬砖! 5536

LangGraph中如何接入大模型做问答流程

LangGraph具备强大的模型兼容性,对主流的在线和开源模型均提供接入支持。借助LangChain框架,开发者能够便捷地集成各类模型。本次以OpenAI的GPT模型为例,使用ChatOpenAI方法进行演示。若需接入其他模型,可查阅LangChain官方文档获取详细接入方式。节点函数支持灵活定义,开发者可根据实际需求定制功能。在模型接入方面,既可以借助LangChain集成模型,也能够运用原生API或本地开源模型权重,即便脱离LangChain框架,依然能够独立构建AI Agent程序。

qq_43588095的博客 1578

LIGGGHTS颗粒模拟入门:从DEM原理到工程实践

离散元法(DEM)是一种用于模拟颗粒物质行为的数值方法,其核心原理是通过计算每个颗粒的运动和相互作用来预测颗粒系统的宏观行为。该方法基于牛顿第二定律和接触力学模型,能够精确描述颗粒间的碰撞、摩擦和粘结等微观机制。在工程实践中,DEM技术为优化工业设备设计、预测材料流动和减少实验成本提供了重要价值。它广泛应用于制药造粒、矿石破碎、粉体输送和农业加工等领域,帮助工程师和研究人员深入理解颗粒系统的复杂动力学。LIGGGHTS作为一款基于LAMMPS的开源DEM软件,继承了其高效的并行计算架构,并针对颗粒模拟进行了

weixin_33979203的博客 419

Score Matching(得分匹配)

Score Matching(得分匹配)是一种统计学习方法,用于估计概率密度函数的梯度(即得分函数),而无需知道密度函数的归一化常数。这种方法由Hyvärinen在2005年提出,主要用于无监督学习,特别是在密度估计和生成模型中。

weixin_39699362的博客 2168

LangGraph 是什么?为什么它越来越像 AI Agent 时代的“操作系统”

LangGraph 的本质,是用图组织 Agent,用状态承载上下文,用持久化和中断机制,让 AI 从“会回答”走向“会持续完成任务”。

羑悻的博客. 3万+

逆向分析TikTok的Cronet网络库:定位libsscronet.so并Hook关键SSL函数

本文深入探讨了逆向分析TikTok的Cronet网络库的技术细节,重点介绍了如何定位libsscronet.so并Hook关键SSL函数。通过Java到Native的调用链路追踪、So库定位策略和SSL验证函数的动态Hook技巧,帮助开发者突破定制化网络库的协议加密防护,实现流量解密和协议分析。

weixin_27875131的博客 972

LangGraph(流程化控制)

day37 :LangGraph(流程化控制)

qq_38895905的博客 1496

利用WI生成无线信道数据

选取DeepMIMO的一个射线追踪场景O1(Outdoor 1)Scenario,工作频率为3.5GHz。有两条街和一个十字路口的户外场景18个基站和超过一百万个用户18个基站(BSs):BS1-BS18.每个基站的高度是8米每个基站的天线阵列是isotropic天线三个统一的x-y用户网格用户的总计数量为:1184923每个用户网格中的第一个用户总是(x,y)坐标最低的用户 所有用户的高度是2m每个用户的每个天线阵列是isotropic天线定义射频追踪场景。

bingbingaidaima的博客 5609

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

statistics+insight+vista+power 635

从开发到部署:LangGraph实现高可用AI Agents完整流程

人工智能(AI)已经不再只是个时髦词,它正在改变我们解决实际问题的方式。从聊天机器人到自动化工作流,AI 智能体是这些创新的核心。但要打造一个可靠、可扩展、随时能上线的 AI 智能体可不是件容易事。

2401_84815887的博客 1383

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LangGraph中预构件,creat_react_agent的实现流程

本文档展示了LangGraph的prebuilt模块中Agent的实现流程,重点是函数构建的代理系统流程和结构。

刘培玉-大王 2092

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Langgraph开发:先有Graph还是先有State

节点之间如何传递信息?Agent 需要记住什么?LangGraph 的State是所有节点共享的上下文(Context)。这是它与普通 Chain 的最大区别。必须在写 Node 代码前定义好 State,因为 Node 的输入输出都依赖它。构思要点:是否需要标准的messages列表(User/AI/Tool Message)?是否需要存储检索到的文档 (documents)、生成的草稿 (draft)、当前的步骤计数 (steps当一个 Node 返回数据时,是覆盖旧数据,还是追加数据?

zadyd的博客 497

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Langgraph学习一:基本流程

图在激活时,需要传入初始化的状态State(input=0),这里没有对state的output进行初始化,是由于代码中node1中会对state的output进行初始化。如果要输出用于外发,个人认为输出markdown文本就行,然后用专业的工具进行展示和显示效果优化。LangGraph:多智能体和记忆管理,是对langchain的封装,避免了复杂的会话状态管理。个人认为开发时使用ASCII画图就行,配置简单,显示够用。通过add_edge绑定节点,确定了数据流转的顺序。mac电脑,安装系统级依赖包。

2501_90216642的博客 328
上一篇: Codex在团队项目里翻车后,我才意识到这3个假设全错了
下一篇: 会用Codex只是起点,能解释失败才算真正入门
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值