1. 从“凭感觉写代码”说起Vibe Coding 到底在解决什么问题第一次听到 Vibe Coding 这个词我的反应是这不就是很多老手一直在干的事吗只不过以前没人给它起个正经名字。所谓 Vibe Coding说白了就是把“写代码”这件事的重心从逐行敲语法转移到用自然语言描述意图、让 AI 帮你把意图翻译成可运行代码。你负责“想要什么”AI 负责“怎么实现”中间那种靠直觉、靠对话、靠快速试错推进的节奏就是所谓的“vibe”。我拿一个真实场景举例。以前我要做一个“读取本地 CSV按城市分组统计销售额输出柱状图”的小工具流程是打开编辑器、想清楚用 pandas 还是 csv 模块、写读取逻辑、处理编码问题、写分组聚合、调 matplotlib 的中文字体、跑一遍报错、改、再跑。整个过程快的话二十分钟慢的话一个小时就耗在字体和编码这种破事上。用 Vibe Coding 的方式我直接对着 AI 说“帮我写个 Python 脚本读 sales.csv按 city 列分组求 amount 列的和画柱状图中文别乱码。”几秒钟出代码我复制粘贴跑一下大概率能直接work剩下的小问题再对话微调。这就是 Vibe Coding 的核心价值它把编程的门槛从“会语法”降到了“会描述”。对于做数据分析、写脚本、搭原型、做小工具的人来说效率提升是肉眼可见的。但这里有个关键前提——你得能判断 AI 给的代码对不对。我见过太多新手AI 给什么就信什么结果跑出来数据是错的还不知道。所以 Vibe Coding 不是“不用懂编程”而是“懂编程的人用它来加速”。那它和后面要讲的 LangGraph 有什么关系关系在于Vibe Coding 解决的是“单次生成”的问题而 LangGraph 解决的是“多步骤、有状态、可循环”的复杂流程编排问题。当你用 Vibe Coding 快速搭出一个能跑的 AI 功能后你会发现真正难的不是“让 AI 生成一段代码”而是“让 AI 按照一套复杂的业务逻辑一步步把事做完中间还能记住上下文、能回退、能人工介入”。这时候LangGraph 就登场了。2. LangGraph 是什么把 AI 应用从“一问一答”变成“有状态的工作流”2.1 从 LangChain 到 LangGraph 的演进逻辑要理解 LangGraph得先理解它和 LangChain 的关系。LangChain 火起来的时候核心卖点是“把大模型和外部工具、记忆、检索串起来”。你写一条 Chain输入进来经过 prompt 模板、经过模型、经过输出解析出去。这条链是线性的、单向的。对于“问答”“摘要”“翻译”这类任务够用。但真实业务里很多流程不是线性的。比如一个客服 Agent用户提问 → 判断问题类型 → 如果是退款就走退款流程 → 退款流程里要查订单 → 查完订单要判断是否符合条件 → 符合就执行退款 → 不符合就转人工。这里面有分支、有循环、有状态传递、有中断点。用 LangChain 的 Chain 去硬写代码会变得非常拧巴状态管理全靠自己维护调试起来想死。LangGraph 就是冲着这个痛点来的。它把整个 AI 应用抽象成一张图Graph节点Node代表一个处理步骤边Edge代表步骤之间的流转关系。你可以定义条件边让流程根据当前状态决定下一步走哪。更重要的是它内置了状态State管理每个节点读写同一份状态流程走到哪、状态是什么清清楚楚。我个人的理解是LangChain 是“链”LangGraph 是“图”链是图的特例图是链的超集。LangChain 适合快速搭线性流程LangGraph 适合搭有状态、有分支、有循环的复杂 Agent。两者不是替代关系LangGraph 底层其实还在用 LangChain 的很多组件比如模型调用、工具定义。2.2 LangGraph 的核心概念拆解刚接触 LangGraph 的时候官方文档里那几个概念容易让人懵。我用大白话翻译一下State状态整个流程共享的一份数据。你可以把它理解成一个“全局字典”每个节点都能读它、改它。比如一个客服流程的 State 里可能有user_query、order_info、refund_status这些字段。Node节点一个处理函数。输入是当前 State输出是对 State 的更新。比如“查询订单”是一个节点“判断退款条件”是另一个节点。Edge边节点之间的连接。普通边是“A 执行完直接去 B”条件边是“A 执行完根据 State 里的某个值决定去 B 还是去 C”。Graph图把节点和边组装起来编译成一个可执行的对象。编译之后你可以invoke它传入初始 State它就会按照你定义的流程跑完。Checkpoint检查点这是 LangGraph 很香的一个特性。它可以把每一步的 State 存下来支持“中断后恢复”“人工介入”“时间旅行调试”。比如流程跑到“执行退款”前你想让人类确认一下就可以在这里中断等人确认后再继续。我用一个生活化的类比LangGraph 就像一张地铁线路图。State 是你随身带的包Node 是各个站点Edge 是轨道条件边是“到岔路口看指示牌决定走哪条线”Checkpoint 是“每站都给你拍张照随时可以回到某一站重新走”。2.3 为什么现在值得学 LangGraph热搜词里有个问题很扎眼“langchain 过时了吗”我的判断是LangChain 没过时但单纯用 Chain 写复杂 Agent 的写法确实过时了。现在做 AI 应用开发尤其是 Agent 方向LangGraph 基本是绕不开的。原因有三第一Agent 的本质是“循环 决策”。大模型需要反复思考、调用工具、观察结果、再思考这个循环用图来表达最自然。第二生产环境需要可控性。你不能让 AI 自己乱跑得有中断、有审核、有回退LangGraph 的 Checkpoint 机制正好解决这个。第三生态在往这边靠。很多做工业智能体的团队底层编排都在往 LangGraph 迁移招人时也开始问“会不会 LangGraph”。3. 实操用 LangGraph 搭一个带人工审核的退款 Agent光讲概念没意思我直接带你搭一个能跑的东西。这个例子来自我实际做过的一个小项目一个电商退款 Agent自动判断订单是否符合退款条件符合就执行不符合就转人工执行前需要人工确认。这个场景覆盖了 LangGraph 的几个核心能力状态管理、条件分支、人工介入Human-in-the-loop。3.1 环境准备与依赖安装我习惯用 conda 管理环境因为 AI 相关的包依赖比较杂用 conda 隔离干净。热搜词里也有人问“langchain conda 选择”我的建议是Python 3.10 或 3.11别用 3.12部分包还没完全适配。conda create -n langgraph-demo python3.11 conda activate langgraph-demo pip install langgraph langchain langchain-openai如果你用的是其他模型把langchain-openai换成对应的包就行。这里我用 OpenAI 的接口做演示实际项目里你可以换成任何兼容的模型。提示LangGraph 的版本更新比较快建议锁定版本比如pip install langgraph0.2.x避免 API 变动导致代码跑不起来。我踩过这个坑某次升级后StateGraph的初始化参数变了排查了半天。3.2 定义 State整个流程的“共享背包”State 是 LangGraph 的起点。我用TypedDict来定义清晰直观from typing import TypedDict, Literal class RefundState(TypedDict): user_query: str # 用户的问题 order_id: str # 订单号 order_info: dict # 订单详情 refund_eligible: bool # 是否符合退款条件 human_approved: bool # 人工是否批准 final_result: str # 最终结果这里有个细节State 里的字段不是每个节点都必须写。LangGraph 支持部分更新节点返回什么就更新什么没返回的字段保持原值。这个设计很实用避免每个节点都要把整个 State 复制一遍。3.3 编写各个节点每个节点只干一件事节点就是普通函数输入 State返回要更新的字段。我把它拆成五个节点def parse_query(state: RefundState): # 从用户问题里提取订单号实际项目里可以用 LLM 做 return {order_id: ORD-2024-001} def fetch_order(state: RefundState): # 模拟查订单实际项目里查数据库 return {order_info: {amount: 299, status: paid, days_since_purchase: 5}} def check_eligibility(state: RefundState): info state[order_info] eligible info[days_since_purchase] 7 and info[status] paid return {refund_eligible: eligible} def execute_refund(state: RefundState): return {final_result: f订单 {state[order_id]} 已退款 {state[order_info][amount]} 元} def transfer_to_human(state: RefundState): return {final_result: f订单 {state[order_id]} 不符合自动退款条件已转人工处理}每个节点都很简单只做一件事。这是 LangGraph 的一个设计哲学节点要小、要单一职责。我见过有人把所有逻辑塞一个节点里那还不如不用 LangGraph。3.4 组装图把节点用边连起来这是最关键的一步。我用StateGraph来组装from langgraph.graph import StateGraph, END from langgraph.checkpoint.memory import MemorySaver workflow StateGraph(RefundState) # 添加节点 workflow.add_node(parse_query, parse_query) workflow.add_node(fetch_order, fetch_order) workflow.add_node(check_eligibility, check_eligibility) workflow.add_node(execute_refund, execute_refund) workflow.add_node(transfer_to_human, transfer_to_human) # 设置入口 workflow.set_entry_point(parse_query) # 添加普通边 workflow.add_edge(parse_query, fetch_order) workflow.add_edge(fetch_order, check_eligibility) # 添加条件边根据 refund_eligible 决定走哪条路 def route_after_check(state: RefundState) - Literal[execute_refund, transfer_to_human]: if state[refund_eligible]: return execute_refund return transfer_to_human workflow.add_conditional_edges( check_eligibility, route_after_check, { execute_refund: execute_refund, transfer_to_human: transfer_to_human } ) workflow.add_edge(execute_refund, END) workflow.add_edge(transfer_to_human, END) # 编译带检查点 memory MemorySaver() app workflow.compile(checkpointermemory, interrupt_before[execute_refund])注意最后那行interrupt_before[execute_refund]这就是人工介入的关键。它表示流程走到execute_refund之前先停下来等人确认。3.5 运行与人工介入让流程“暂停”和“继续”运行的时候需要传一个thread_id这是 Checkpoint 的标识同一个 thread 的流程状态会被保存config {configurable: {thread_id: refund-001}} # 第一次运行会在 execute_refund 前停下 result app.invoke({user_query: 我要退款订单号 ORD-2024-001}, config) print(result) # 此时 final_result 还没生成流程停在 execute_refund 前 # 人工确认后继续执行 app.update_state(config, {human_approved: True}) final app.invoke(None, config) print(final[final_result])实测下来这个机制非常稳。你可以把thread_id存到数据库用户下次回来还能接着走。工业场景里这个特性用来做“审批流”简直完美。4. 踩坑记录LangGraph 实操中最容易翻车的几个点4.1 状态更新是“合并”不是“替换”这是新手最容易搞错的地方。LangGraph 的 State 更新默认是浅合并节点返回{a: 1}只会更新a字段其他字段不动。但如果你返回的是一个列表它默认是替换而不是追加。如果你想让多个节点往同一个列表里加东西需要用Annotated配合 reducerfrom typing import Annotated from operator import add class State(TypedDict): messages: Annotated[list, add]这样每个节点返回的列表会被追加进去而不是覆盖。我一开始不知道这个做多轮对话时消息总是丢排查了好久。4.2 条件边的返回值必须和映射表对上add_conditional_edges的第三个参数是一个字典键是路由函数的返回值值是目标节点名。路由函数返回的字符串必须和字典的键完全一致否则会报错。我见过有人返回refund但字典里写的是execute_refund跑起来直接崩。4.3 中断后恢复要用invoke(None, config)流程中断后继续执行要传None作为输入而不是重新传初始 State。因为 State 已经存在 Checkpoint 里了重新传会覆盖掉。这个细节官方文档写得比较隐晦我第一次用的时候试了好几次才搞对。4.4 常见问题速查表问题现象可能原因解决方法流程跑完但 State 没更新节点没返回字典确保每个节点 return 一个 dict条件边报 KeyError路由返回值与映射表不匹配检查字符串是否完全一致中断后无法恢复没传 thread_id 或 config 不对确保 invoke 时传了相同的 config列表字段被覆盖没用 Annotated reducer用Annotated[list, add]编译报错说节点不存在add_node 名字和 add_edge 名字不一致统一命名建议用常量5. Vibe Coding 与 LangGraph 的协同AI 时代编程范式的真正重构5.1 两者不是替代而是分层很多人把 Vibe Coding 和 LangGraph 放在一起比较其实它们解决的是不同层次的问题。Vibe Coding 是“怎么写代码”的范式LangGraph 是“怎么编排 AI 流程”的框架。你可以用 Vibe Coding 的方式快速写出 LangGraph 的节点函数也可以用 LangGraph 把 Vibe Coding 生成的零散代码组织成有状态的系统。我实际的工作流是这样的先用 Vibe Coding 快速生成各个节点的实现比如“帮我写个函数输入订单信息判断是否符合退款条件”AI 几秒钟给我代码我 review 一下改改就能用。然后我用 LangGraph 把这些节点组装起来定义状态和流转逻辑。前者负责“快”后者负责“稳”。5.2 AI 编程提示词的一些实战心得热搜词里有人问“ai 编程提示词”我分享几条自己总结的第一描述意图而不是描述实现。别说“用 for 循环遍历列表”说“把列表里所有大于 10 的数加起来”。让 AI 自己选实现方式。第二给上下文和约束。比如“用 Python不要用第三方库处理中文编码”这些约束能大幅减少返工。第三要求 AI 解释关键逻辑。我习惯让 AI 在代码后附一段“这段代码的核心逻辑是……”这样我能快速判断它有没有理解错。第四迭代式对话。别指望一次生成完美代码先让它出个能跑的版本再逐步加需求。这比一次性描述一大堆需求效果好得多。5.3 从“写代码”到“设计流程”的思维转变用了 LangGraph 之后我最大的感受是编程的重心从“写函数”变成了“设计流程”。以前我关心的是“这个函数怎么写”现在我关心的是“这个流程有几个步骤、状态怎么流转、哪里需要人工介入、哪里可能出错要回退”。这种思维转变其实才是 AI 时代编程范式重构的核心。代码本身越来越不值钱因为 AI 能生成值钱的是你对业务的理解、对流程的设计、对边界的判断。Vibe Coding 让你快速把想法变成代码LangGraph 让你把代码组织成可靠系统两者结合才是完整的 AI 应用开发能力。6. 这套东西还能怎么扩展搭完退款 Agent 之后我顺手做了几个扩展都挺有意思。一个是多轮对话版把 State 里加个messages列表用Annotated[list, add]做追加每个节点都能看到历史对话这样 Agent 就能记住上下文。另一个是并行分支LangGraph 支持一个节点同时触发多个下游节点比如“查订单”和“查用户信用”可以并行跑最后再汇总速度能快不少。还有一个我觉得特别实用的扩展是时间旅行调试。因为每一步 State 都存了 Checkpoint你可以回到任意一步改一下 State重新往下跑。调试复杂 Agent 的时候这个功能能省大量时间。我试过在一个十步的流程里回到第五步改个参数看后面会怎么走比从头跑一遍高效多了。最后分享一个小技巧LangGraph 的图可以用app.get_graph().draw_mermaid()导出成文本格式的流程图虽然不能直接渲染但贴到支持 Mermaid 的工具里就能看。我习惯在写复杂流程前先画个草图理清楚节点和边再动手写代码能少走很多弯路。
企业数字化 ERP 产品动态
相关推荐
老电脑续命指南:5款硬核软件让低配Windows重获流畅 老旧电脑不是电子垃圾,而是被低估的生产力工具。我手头这台2012年出厂的ThinkPad X220,i5-2520M 4GB DDR3 机械硬盘,至今仍在跑文档编辑、Python轻量开发、本地笔记同步和双屏会议——它没换过主板,没加过SSD,连散热… · 2026/9/24 22:07:31
零基础一个月用AI编程做四个项目:agent开发纪律系统实战 1. 一个月从零到四个项目,我到底经历了什么先把结论摆出来:一个月时间,零编程基础,靠 AI 编程工具做了四个能跑起来的项目,最后把反复踩坑的经验固化成了一个 agent 项目纪律系统。这不是标题党,是我自己一… · 2026/9/24 22:07:31
金融AI落地如何通过审计?数据血缘、模型版本与决策留痕实战指南 1. “能跑”和“经得起审计”,从来是两码事做了几年金融AI落地,又被拉去复盘过几次审计整改,我越来越确认一个事:在金融这种行业里,一个模型上线跑出指标,只算完成了30%,剩下70%都在“怎么证明它… · 2026/9/24 22:07:31
文件整理自动化实战:规则引擎、内容指纹去重与目录监控方案 你有多久没认真看过自己电脑里的“下载”文件夹了?我帮同事清理过一次,下载文件夹里堆了4600多个文件,最早的能追溯到六年前,里面的安装包、截图、临时文档混成一团,光是滚动列表就花了两分钟。从那天起我就明白&#… · 2026/9/24 22:40:55
昇腾960超节点与灵衢互联:架构原理、部署调优及性能翻倍实践 1. 昇腾960超节点到底是个什么东西先把话说在前头,这篇不是新闻通稿,也不是什么官方解读。我就是一个常年泡在算力集群和网络设备堆里的老运维,看到昇腾960超节点提前登场的消息,第一反应不是"哇性能翻倍",而… · 2026/9/24 22:40:49
基于Codex的模型创新与消融实验全流程实践指南 上个月我做了一个图像分类模型的创新实验,idea在论文里只占半页纸,但为了验证它我改了整整三天代码:先搭基线,再插模块,接着调loss,最后还要写一套消融实验的脚本把每个组件挨个拆掉跑对比。那三天里真正花… · 2026/9/24 22:40:49
智能文件整理工具实战:从自动分类到安全归档的完整设计 我办公桌正对面那台电脑,桌面图标多到能叠三层,下载文件夹里从去年的合同到上个月的安装包混成一锅粥。每次要找一份文件,都得按修改时间倒序硬翻,运气好三分钟,运气不好半小时。后来实在忍不了,花了几个周… · 2026/9/24 22:40:49
fetch和axios别只背区别:从设计哲学到实战踩坑的深度对比 前端面试里有一道出现频率极高的题:fetch 和 axios 有什么区别?多数人背完几个关键词就觉得自己会了,可真到项目里要定请求方案,或者要把老项目里的请求层重构一遍时,该纠结还是纠结。我接过一次大规模重构,… · 2026/9/24 22:40:49
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44