LangGraph工作流很香,为什么一上线还是失控?

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

聊《LangGraph跑通那天,我才发现前面的学习顺序反了》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。

摘要

Demo跑通Agent和真正把它送上生产,中间隔着一道叫"工程化"的坎。最近帮团队review了几个LangGraph项目,发现一个现象:大家都会写节点、会连边,但一碰到权限校验、日志追踪、异常兜底,就开始手忙脚乱。本文从一次真实需求评审切入,讲清楚LangGraph工作流到底解决了什么、没解决什么,以及真正上线前必须明确的三笔账。

---

目录

  • 为什么需要图工作流
  • State与Node:别只盯着模型调用
  • Edge与条件分支:边界比功能更重要
  • 人工审批节点:权限是硬需求不是软建议
  • 工程化落地:日志、可观测和验收标准
  • 总结

---

为什么需要图工作流

文章插图 1

上周组内评审一个Agent项目,业务方提的需求听起来很简单:用户提交一个工单,系统自动判断类型、分配处理人、必要时调外部API查询数据、最后给出处理建议。

Demo阶段,团队用LangChain搞了个链式调用,跑通之后业务方很满意。结果一联调生产环境,三个问题同时爆出来:

第一,权限校验散落在各个节点里,有人漏写,有人写得不对;第二,日志看不到完整链路,出问题只能猜;第三,流程一旦要加一个人工审批环节,整个架构得重写。

这时候才意识到,用脚本思维写Agent,边界感是零。LangGraph的价值不是"让Agent更智能",而是让流程变得可描述、可控制、可追溯。

图结构的核心优势在于:你把整个工作流当成一个有向图来设计,每个节点做什么、节点之间怎么走,都是显式的。这听起来像废话,但实际写代码时会发现,显式和隐式的差别,决定了系统是可控的还是玄学的。

---

State与Node:别只盯着模型调用

文章插图 2

很多初学者写LangGraph,第一反应是"怎么让模型更聪明",实际上应该先想清楚"状态怎么流转"。

State是整个工作流的记忆载体。节点本身不存储状态,它们只接收State、处理、返回更新。这种设计看起来多此一举,但生产环境里特别有用——你想加一个日志节点、想插一个人工审批、想临时断点调试,只要State结构清晰,改起来不伤筋动骨。

我见过的一个反面案例:某个项目的State里塞了二十多个字段,节点之间互相引用,改一个字段影响一片。后来重构时,把State拆成了三层——用户输入层、处理过程层、输出结果层,每个节点只关注自己需要的部分,复杂度直接降了一半。

Node的设计也要克制。一个节点最好只做一件事,不要在一个节点里既调模型又查数据库又写日志。拆分之后虽然节点多了,但每个节点的可测试性和可替换性都强了很多。

from langgraph.graph import StateGraph, START, END
from typing import TypedDict, Annotated, Literal
import operator

class WorkflowState(TypedDict):
    # 输入层
    user_input: str
    ticket_type: str

    # 处理层
    assigned_handler: str
    external_data: dict
    needs_approval: bool

    # 输出层
    suggestion: str
    log_trace: list

def classify_node(state: WorkflowState) -> WorkflowState:
    """分类节点:只负责判断工单类型"""
    # 实际项目中这里会调模型
    ticket_type = "technical" if "bug" in state["user_input"].lower() else "general"
    return {"ticket_type": ticket_type}

def assign_node(state: Workflow_state) -> WorkflowState:
    """分配节点:根据类型分配处理人"""
    handler = "tech_team" if state["ticket_type"] == "technical" else "support_team"
    return {"assigned_handler": handler}

注意State里那个log_trace字段——这是专门为可观测性预留的。很多项目上线后才发现日志不够用,这时候再回头加就晚了。

---

优快云资料领取方式

Edge与条件分支:边界比功能更重要

边和条件分支是工作流的"交通规则"。Demo阶段大家热衷于让Agent"自主决策",但生产环境里,边界清晰比自主性强更重要。

条件边(Conditional Edge)是LangGraph里最容易用错也最有价值的功能。一个典型的场景是:根据分类结果走不同分支,其中某个分支需要人工介入。

def route_by_type(state: WorkflowState) -> Literal["assign_node", "approval_node"]:
    if state["ticket_type"] == "urgent":
        return "approval_node"
    return "assign_node"

workflow = StateGraph(WorkflowState)
workflow.add_node("classify", classify_node)
workflow.add_node("assign", assign_node)
workflow.add_node("approval", approval_node)

workflow.add_edge(START, "classify")
workflow.add_conditional_edges(
    "classify",
    route_by_type,
    {"assign": "assign", "approval": "approval"}
)

这里的关键判断是:什么时候该用条件边,什么时候该用普通边?

我的经验是,凡是流程中有"可能中断"或"需要外部输入"的环节,必须用条件边显式表达。不要指望模型在节点内部自己处理这些分支,那会让流程变成黑盒。

另一个常见错误是把所有判断逻辑都塞进一个节点里。比如上面那个例子,有人会把分类、分配、审批判断全部写在一个节点里,这样节点越来越胖,流程越来越乱。记住:节点是处理器,不是决策中心。

---

人工审批节点:权限是硬需求不是软建议

这是本文最想强调的一点。

很多团队做Agent项目,一开始觉得"人工审批"是锦上添花的功能,等真正上线了才发现,没有审批节点的流程在生产环境根本跑不通。

权限问题不是技术问题,是合规问题。涉及资金、数据变更、用户信息修改的操作,必须有审计痕迹。LangGraph的Node机制天然支持这一点——你可以把一个节点设计成"等待人类输入"的状态,流程在这里暂停,直到审批通过或拒绝。

from langgraph.types import interrupt

def approval_node(state: WorkflowState) -> WorkflowState:
    """人工审批节点"""
    # 流程在这里暂停,等待人工输入
    approval_result = interrupt({
        "message": f"请审批工单:{state['user_input']}",
        "ticket_id": state.get("ticket_id", "unknown"),
        "handler": state["assigned_handler"]
    })

    if approval_result.get("action") == "approve":
        return {"needs_approval": False, "log_trace": state["log_trace"] + ["approved"]}
    else:
        return {"needs_approval": False, "log_trace": state["log_trace"] + ["rejected"]}

这个interrupt调用是整个工作流的断点。生产环境里,你需要配套的东西包括:

1. 审批队列管理:多个工单同时等待审批时怎么排序
2. 超时处理:审批超过多久自动拒绝或升级
3. 审计日志:谁在什么时候审批了什么,必须可追溯

这三样东西,Demo阶段基本不会做,但上线前必须想清楚。我见过最惨的案例是,项目跑了一个月,审批记录全丢了,出了事故连追责都找不到人。

---

工程化落地:日志、可观测和验收标准

前面讲了架构设计,现在说落地。

很多团队把"跑通Demo"当成项目结束,但实际上那只是开始。从Demo到生产,真正的工作量在以下三个方面:

日志体系

不要等到出问题才想加日志。State里的log_trace字段只是一个开始,完整的日志应该包括:

  • 每个节点的输入输出(脱敏后)
  • 节点执行耗时
  • 异常堆栈和上下文
  • 人工审批的操作记录

可观测性

LangGraph本身不内置监控,你需要自己接。建议至少覆盖:

  • 工作流实例的创建、完成、失败状态
  • 每个节点的成功率和耗时分布
  • 条件分支的走向统计(哪些分支走得多,哪些几乎不走)

验收标准

这是最容易被忽略的。Demo阶段看的是"能不能跑",生产阶段看的是"能不能扛"。建议的验收维度:

| 维度 | Demo标准 | 生产标准 |
|------|----------|----------|
| 功能正确性 | 能跑通主流程 | 边界case全覆盖 |
| 异常处理 | 不崩就行 | 有降级方案 |
| 性能 | 单次延迟可接受 | 并发下稳定 |
| 可追溯 | 有日志 | 日志可查询可分析 |
| 权限 | 不考虑 | 有审计痕迹 |

---

总结

LangGraph工作流解决的核心问题是可控性,不是智能性。

Demo阶段,大家追求的是Agent"看起来聪明";生产阶段,你真正需要的是流程"看起来清楚"。State的边界、Node的拆分、Edge的条件判断、人工审批的断点设计,这些不是锦上添花,是上线前的硬门槛。

我的建议是:学习LangGraph的时候,不要一上来就研究怎么让模型更聪明,先花时间把State设计清楚、把节点拆分到位、把边界条件写明白。这些工作看起来枯燥,但真正上线的时候,你会感谢现在的自己。

最后说一句可能不太好听的话:如果你现在写的Agent工作流,换个负责人接手之后看不懂流程走向,那它就不是一个生产级系统,只是一个会跑的脚本。

资料展示

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

AI大模型资料展示 1

AI大模型资料展示 2

AI大模型资料展示 3

AI大模型资料展示 4

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

优快云官方大礼包

液滴碰撞壁面的过程背景论文——bouncing反弹,spreading扩展,splashing飞溅。铺展过程介绍。还存在很多未解之谜。 【1993-德国-Phenomena of liquid drop impact on solid and liquid surfaces】液滴碰撞壁面的过程背景——bouncing反弹,spreading扩展,splashing飞溅。还存在很多未解之谜。还存在很多未解之谜。不同液滴形状碰撞过程。 阅读详情

相关推荐

在摩尔线程 MTT S80 上使用 Ollama 进行 DeepSeek R1 蒸馏版模型推理

本文主要介绍了如何在摩尔线程 MTT S80 上通过 Ollama 快速完成DeepSeek R1 蒸馏系列模型的推理。

摩尔线程blog中心 3601

LangGraph实战:构建可上线的金融文档审计智能体

AI智能体(Agent)是具备感知、决策与行动能力的自主系统,其核心挑战在于状态一致性、流程可控性、调试可观测性与架构可扩展性。LangGraph作为面向生产环境的图状工作流框架,通过显式状态Schema、条件边路由、持久化检查点和节点解耦四大机制,系统性解决LLM输出不可控、流程僵化、故障难定位及功能耦合等工程痛点。它特别适用于金融合规、合同审查、知识工作流等需高可靠性、强审计性与人工协同的场景。本文以真实金融文档自动核验项目为蓝本,详解如何用LangGraph落地一个支持断点恢复、熔断降级与人工接管的工

chuange6363的博客 382

ios生成海报使用dom-to-image中toPng报错isTrusted:true

主要是ios中safari浏览器解析错误,引起的报错,主要引起原因toPng会调用toSvg,toSvg直接将html标签内容通过svg中foreignObject标签直接包裹,然后转base64, 通过data:image/svg+xml;解决办法:二次生成(调用两次),判断ios or 安卓,生成第一次生成,不用参数,例如:scale: 3,在第二次生成再进行清晰度操作,避免多次生成,引起性能消耗。以上种种很多案例,使用canvase进行转换的,标签丢失,直接toPng版本的,兼容性问题。

weixin_44601570的博客 2106

LangGraph看起来很香,为什么项目一上线就翻车?

上周做需求评审,一个刚转大模型的兄弟提了个方案:用 LangGraph 重构现有的 Agent 工作流,把之前散落在各个函数里的调用逻辑整理成图结构。产品经理问"能上线吗",他说是的,Demo 跑得很顺。我问他"日志怎么接"、"权限校验在哪"、"出错了怎么回滚",他沉默了三秒,说"还没考虑这些"。这个场景我太熟悉了。去年带团队做内部工具链时,也是同样的节奏:Demo 阶段欢天喜地,一碰生产环境就炸。LangGraph 本身没问题,问题是我们对"工作流"的理解还停留在脚本阶段。

2601_96120158的博客 408

Web前端开发技术:实验14-16

实验14 1. 编写JavaScript程序实现“九九乘法口诀”表,如图14-40所示。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>九九乘法表</title> </head> <body> <h1>九九乘法表</h1> </body> <scri

KslgmrDry的博客 1万+

通过TMS320F28335学习DSP的开发流程——28335的基础知识(1)

1、TMS320F28335内核的主要特点 ①F28335 DSP集成了DSP和微控制器的长处,如DSP的主要特征、单周期乘法运算,F28335能够在一个周期内完成32x32位的乘法累加运算,或者两个16x16位乘法累加运算,而同样32位的普通单片机则需要4个周期以上才能完成 ②快速的中断响应 ③可在任何内存位置进行单周期读、修改、写操作 ④可采用C/C++编程软件,效率非常高 2、处理器的主要资源 ①32位浮点DSP,主频是150MHz,方便电机控制、电力设备控制及工业控制等。 ②片上存储器:FLASH–

Kayboy的博客 2万+

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 474

生信物种注释软件Kraken2+Bracken的安装与使用

一、软件安装与数据库下载 1.Kraken2安装 Kraken2是一个基于k-mer算法的高精度宏基因组序列分类软件,能够快速的将测序reads进行物种分类。 使用conda一键安装,要先安装好anaconda或者miniconda conda install -y kraken2 输入krakek2 --help 出现如下所示帮助文档,则表示安装成功。 2.Bracken安装 bracken是一种从宏基因组数据中高度准确的计算物种丰度的统计方法。 同样使用conda一键安装 conda install -

jileiqwd的博客 1万+

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 425

Uni-App 使用极光推送完整指南

Uni-App集成极光推送的完整指南:从注册极光账号到代码实现。包含前期准备(获取AppKey、注册厂商账号)、Uni-App配置(插件导入、初始化代码)、高级功能(角标设置、Java后台接口)及常见问题排查。详细说明了推送监听、registrationID获取、消息接收处理等核心功能实现步骤,并提供两种推送接口示例(按平台推送和统一推送)。适合需要在Uni-App项目中实现推送功能的开发者参考。

cyj0919的博客 430

Kubernetes(K8s)从入门到精通系列之一:一篇文章了解K8s全部核心知识点

Kubernetes(K8s)从入门到精通系列之一:一篇文章了解K8s全部核心知识点

zhengzaifeidelushang的博客 850

【基于 WebSocket 的多用户网页五子棋】—— 数据管理模块

但行好事,莫问前程

qq_42996461的博客 243

DeepSeek Harness 工程实践与高级特性:从测试到安全的完整指南

AI Agent 能执行命令、读写文件、自主决策,能力越强风险越大——删文件、泄密钥、死循环、竞态条件随时可能发生。本文是 DeepSeek Harness 系列第三篇,深入剖析其工程实践与高级特性:从单元测试到真实 API 冒烟测试的分层策略,拒绝 Mock 依赖、坚持"验证世界而非自我报告";从正交结果、规范化契约到 Dispose 静止的防御式编程铁律;以及跨平台多层进程沙箱、文件系统版本守卫、fail-closed 审批机制、模型编写的工作流引擎与上下文压缩等高级能力。

program哲学 207

C++算法(七)

C++ stack算法题和一些客观题

2503_94479566的博客 378

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OpenClaw 深度调查:把 AI 助手做成你自己的控制平面

对 openclaw/openclaw 的完整技术尽调:Gateway 架构、Agent 运行时、工具与沙箱、30 个消息通道、181 个插件、安全信任边界、工程代价与采用建议。17 章 / 10 张图,全部数字标注口径,数据截至 2026-10-31。

厚积薄发 262

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

不用再为文本搜索单独维护一套系统!全文检索深度解析

为了给商品、客服工单或者企业知识库增加一个搜索框,企业往往需要在业务数据库之外,再部署一套Elasticsearch。数据库保存商品、订单和用户等真实业务数据,搜索引擎保存另一份文本索引;两套系统之间,还需要通过CDC、消息队列或者同步程序持续传输数据。一个看似简单的搜索需求,最后可能变成两套集群、两份数据和一条必须保持稳定的数据链路。由此产生的问题并不少:数据库已经完成更新,搜索结果却可能尚未同步;业务查询同时涉及文本、库存、权限和订单状态时,应用需要在两个系统之间来回组合结果;

TiDB 社区干货传送门 308

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 174

TransactionInactiveError:await 之后事务已经不活跃了

TransactionInactiveError 出现于 IndexedDB 事务已结束(非 active 状态)时调用 put、get 等操作。常见于 await 后或 setTimeout 中执行请求,因任务已完成,事务已提交或进入 finished 状态。请求必须在创建事务的同一任务中挂起,否则无效。解决方法:在 onsuccess 回调内同步发起后续操作,或提前将所有请求挂入事务。避免在异步上下文中使用事务操作,确保请求在事务活跃期内完成。

qq_40822000的博客 154

云计算课程小组PPT汇报任务书

36人分为6组,每组6人;形式:生活案例调研 + 理论解读;汇报时长7‑9min;PPT建议10‑14页。

Michelle8023的博客 198

市场调查与统计分析专业大学期间考证怎么安排?

市场调查与统计分析专业的考证规划,适合从一份完整的调查报告倒推:能不能设计问卷、判断样本是否合理、清洗数据,再把分析结果转化为业务建议?围绕这条能力链安排证书,比单纯按“热门程度”报名更有针对性。结合2026年的学习安排,并为2027年的实习、升学和求职预留时间,大学期间可以重点考虑六类证书:全国计算机等级考试证书、大学英语四级或六级成绩报告单、CDA数据分析师、初级统计专业技术资格证书、微软办公软件国际认证中的Excel相关证书,以及软考数据库系统工程师资格证书。

cc572502653的博客 166

软件项目交付时,源代码之外还应该交付哪些技术资料?

软件项目交付时,除可运行程序外,还应核对源代码、数据库结构、接口文档、部署运维、测试验收和账号资产。本文从实际交付环节拆解完整资料清单,并说明合同如何约定交付范围、知识产权与维护边界。

chengduyoushu的博客 298

大表 ALTER TABLE 怎么做?NineData OnlineDDL 配置与执行实践

介绍NineData OnlineDDL大表变更实践,涵盖执行策略、切表控制、拷贝批次与可视化进度追踪。

dbasenewbie的博客 292

MySQL报Too many open files?句柄耗尽的排查与参数配置

文章讲清 max_connections 与 open_files_limit 两个额度、句柄被谁占走、分区表为什么最容易踩,给出从 error log 到 /proc/pid/limits 的定位顺序与句柄预算算法。

「一个在数据库赛道上边学边分享的学妹」——聚焦国产数据库/信创方向、分享学习笔记、踩坑经验和行业观察。 323

Agent 安全实战:间接提示注入的四个攻击面与防御体系

当 Agent 从 "生成内容" 走向 "执行动作",安全边界就从内容合规变成了权限越界。本文拆解间接提示注入在网页抓取、工具返回值、MCP 连接器、长期记忆四个位置的真实攻击路径,对照 Claude、GPT、Gemini 在工具调用权限模型上的设计差异,给出可直接落地的五层防御体系。

阡陌数智,专注大模型网关与 LLM 工程落地 269

Redis 入门详解:核心特性、重要文件与全局命令实战

本文系统介绍了Redis的核心特性、重要文件及全局命令。Redis凭借内存存储、C语言实现和单线程设计,具备极高的读写性能;支持持久化(RDB/AOF)、主从复制与集群架构,适用于缓存、排行榜、计数器等场景,但不适合存储海量冷数据。文中还解析了常见面试题,如为何快速、单线程原理、持久化机制、KEYS *禁用原因及过期键处理策略,强调其在高并发场景下的优势与局限。

2303_77004089的博客 204

【FDE前沿部署工程师实战教程】第62章:Enterprise AI Developer Platform——企业级 AI 开发者平台与低代码 AI 应用工厂

企业从AI能力平台迈向AI应用生产平台,需构建统一的企业级AI开发者平台,将模型、RAG、Agent、Workflow等能力封装为可视化、可复用的开发工具。通过PromptIDE、AgentBuilder、WorkflowBuilder等模块,实现低代码与专业代码协同,降低开发门槛。平台覆盖应用全生命周期管理,集成测试评估、安全治理与CI/CD发布体系,推动AI应用规模化、标准化交付。最终形成“需求→设计→开发→测试→发布→运营”的企业AI应用工厂模式,助力制造等行业的智能化转型。

IT古董 312
上一篇: Agent真能提效吗?先看流程里最慢的那一步
下一篇: 爬虫转大模型:采集能力变成竞争力,我踩过哪些坑?
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值