当前位置: 首页 > article >正文

基于 LangChain 1.0 的 LangGraph 高级应用

基于 LangChain 1.0 的 LangGraph 高级应用文章目录基于 LangChain 1.0 的 LangGraph 高级应用1. 深度对比Workflow vs Agent1.1 Workflow 实现示例内容审核1.2 Agent 实现示例内容审核2. 高级状态管理Annotated 与 Reducer3. 人机协作循环 (Human-in-the-Loop) 新规范3.1 核心代码剖析3.2 外部客户端如何挂起与唤醒4. 多智能体协作 (Multi-Agent) 架构模式 查看完整专栏LangChain 1.0 与 LangGraph 学习笔记特别说明本文为个人学习笔记内容仅供学习与交流使用禁止转载或用于商业用途。笔记为个人理解与总结可能存在疏漏或偏差欢迎读者参考并自行甄别。在掌握了 LangGraph 的基本图结构Node、Edge、Conditional Edge之后本篇笔记将深入探讨 LangGraph 的高级应用。我们将对比 Workflow 和 Agent 的不同流转实现深挖底层的状态聚合机制Reducer解析最新版本的精准中断与人工干预Human-in-the-loop。1. 深度对比Workflow vs Agent在业务落地中我们常常面临一个选择是写死规则Workflow还是让 AI 自己做主AgentWorkflow工作流基于硬编码规则驱动。执行顺序固定状态确定极度稳定可控但缺乏灵活性。Agent智能体基于大模型 (LLM)驱动。模型根据上下文自行决定下一步去哪灵活智能但有一定的不可控性和耗时。1.1 Workflow 实现示例内容审核以一个内容审核系统为例。如果是 Workflow我们会把它拆分为多个硬编码的规则节点按顺序流水线执行importrefromtypingimportTypedDictfromlanggraph.graphimportStateGraph,START,ENDclassContentModerationState(TypedDict):content:strhas_spam_pattern:booldecision:strreason:strdefcheck_spam(state:ContentModerationState)-dict:[Process] 基于正则规则检查垃圾信息contentstate[content]# 规则重复字符超过5次has_spambool(re.search(r(.)\1{5,},content))return{has_spam_pattern:has_spam}defmake_decision(state:ContentModerationState)-dict:[Process] 综合判定ifstate.get(has_spam_pattern,False):return{decision:rejected,reason:触发垃圾信息正则}return{decision:approved,reason:规则校验通过}workflow_graphStateGraph(ContentModerationState)workflow_graph.add_node(check_spam,check_spam)workflow_graph.add_node(decide,make_decision)# 固定的线性执行顺序workflow_graph.add_edge(START,check_spam)workflow_graph.add_edge(check_spam,decide)workflow_graph.add_edge(decide,END)workflow_appworkflow_graph.compile()1.2 Agent 实现示例内容审核同样的任务如果交给 Agent节点会变得非常精简所有的判断逻辑都交由 LLM 的invoke结果来动态路由importjsonfromtypingimportTypedDict,Literalfromlanggraph.graphimportStateGraph,START,ENDfromlangchain.chat_modelsimportinit_chat_modelfromlangchain.messagesimportSystemMessage,HumanMessageclassAgentModerationState(TypedDict):content:stranalysis:strdecision:strmodelinit_chat_model(modelyour-model-name,model_provideropenai,...)defanalyze_content(state:AgentModerationState)-dict:[Process] 使用 LLM 进行语义级审核分析system_prompt你是一个内容审核员。请分析内容并返回 JSON {decision: approved 或 rejected 或 needs_review, reason: ...}responsemodel.invoke([SystemMessage(contentsystem_prompt),HumanMessage(contentf待审核内容{state[content]})])# 实际应用中建议使用 with_structured_output此处为简化演示resultjson.loads(response.content)return{decision:result.get(decision),analysis:result.get(reason)}defshould_auto_decide(state:AgentModerationState)-Literal[end,human_review]:[Route] 根据 LLM 的判定动态路由ifstate[decision]needs_review:returnhuman_reviewreturnenddefhuman_review_node(state:AgentModerationState)-dict:[System] 人工审核节点占位returnstate agent_graphStateGraph(AgentModerationState)agent_graph.add_node(analyze,analyze_content)agent_graph.add_node(human_review,human_review_node)agent_graph.add_edge(START,analyze)agent_graph.add_conditional_edges(analyze,should_auto_decide,{end:END,human_review:human_review})agent_graph.add_edge(human_review,END)agent_appagent_graph.compile()特性WorkflowAgent决策方式基于硬编码规则 (if-else/正则)基于 LLM 对上下文的语义理解灵活性固定流程极难处理边界情况动态路由灵活判断边缘 Case性能/成本毫秒级0 Token 成本较慢需网络请求有消耗适用场景规则明确的结构化数据处理规则模糊、需要理解语义的复杂场景2. 高级状态管理Annotated 与 ReducerState是 LangGraph 的灵魂。如果多个节点同时向状态中写入数据旧数据会被覆盖吗为了解决这个问题我们需要引入 Python 的Annotated机制和自定义的Reducer聚合器。Annotated允许我们为类型标注附加元数据LangGraph 正是通过这些元数据来判断状态合并逻辑的。fromtypingimportTypedDict,Annotatedfromoperatorimportaddfromlanggraph.graph.messageimportadd_messages# 1. 自定义一个去重的 Reducer 函数defmerge_unique(old:list,new:list)-list:合并两个列表并自动去重returnlist(set(oldnew))defmerge_dicts_deep(old:dict,new:dict)-dict:递归深度合并字典resultold.copy()forkey,valueinnew.items():ifisinstance(result.get(key),dict)andisinstance(value,dict):result[key]merge_dicts_deep(result[key],value)else:result[key]valuereturnresult# 2. 定义高级复合状态classAdvancedState(TypedDict):# 普通字段新值会直接【覆盖】旧值user_name:str# 累加字段利用 operator.add新值会与旧值【相加】total_tokens:Annotated[int,add]# 消息列表官方提供的专门针对大模型消息的合并去重器messages:Annotated[list,add_messages]# 标签列表使用我们自己手写的 merge_unique 去重合并tags:Annotated[list[str],merge_unique]# 元数据使用我们手写的字典深层合并器metadata:Annotated[dict,merge_dicts_deep]通过这种极其细粒度的状态合并控制我们能在非常复杂的并发工作流中确保每一个节点产出的数据都能安全、正确地汇总到全局 State 中。3. 人机协作循环 (Human-in-the-Loop) 新规范在实际业务中当 AI 准备执行敏感操作如付款、发送全员邮件时系统必须暂停并等待人类操作。在 LangGraph 最新版本中推荐使用interrupt()函数触发中断并通过Command(resume...)恢复流转。这一切的前提是必须挂载持久化存储Checkpointer。3.1 核心代码剖析importuuidfromtypingimportOptionalfromtyping_extensionsimportTypedDictfromlanggraph.checkpoint.memoryimportMemorySaverfromlanggraph.constantsimportSTART,ENDfromlanggraph.graphimportStateGraphfromlanggraph.typesimportinterrupt,CommandclassState(TypedDict):messages:listlast_answer:Optional[str]human_feedback:Optional[str]# --- 1. Agent 思考节点 ---defagent_node(state:State):print([Process] Agent 正在生成回答...)# ... 省略大模型调用代码 ...mock_answer我已经起草好了邮件准备发送。return{last_answer:mock_answer,human_feedback:None}# --- 2. 核心人工审核节点 ---defreview_node(state:State):answerstate[last_answer]# 重点调用 interrupt 会立刻阻断程序的继续执行并将参数抛给外部。# 它的返回值 feedback 就是未来外部唤醒它时传入的值。feedbackinterrupt(f[Interrupt] AI准备执行\n{answer}\n请输入修改意见输入 ok 批准)feedbackfeedback.strip()iffeedback.lower()ok:print([Success] 人类审核通过流程结束。)returnCommand(gotoEND)print([Action] 人类要求修改打回 Agent 重做。)# 重点使用 Command 动态决定下一个节点并携带更新后的状态returnCommand(gotoagent,update{human_feedback:feedback})# --- 3. 编译图必须挂载 Checkpoint ---builderStateGraph(State)builder.add_node(agent,agent_node)builder.add_node(review,review_node)builder.add_edge(START,agent)builder.add_edge(agent,review)# 此处使用 MemorySaver 用于本地演示生产环境应使用 SqliteSaver/PostgresSavergraphbuilder.compile(checkpointerMemorySaver())3.2 外部客户端如何挂起与唤醒由于加入了interrupt()当我们调用stream()或invoke()时程序会在中途停住。外部驱动代码必须这么写if__name____main__:# 配置唯一的会话 ID保证中断恢复时能找到上下文config{configurable:{thread_id:str(uuid.uuid4())}}# 1. 初始运行current_input{messages:[帮我写一封感谢信]}whileTrue:interrupt_promptNoneinterruptedFalse# 迭代获取图的执行流forchunkingraph.stream(current_input,config):if__interrupt__inchunk:interruptedTrue# 获取在 interrupt(...) 函数里传入的提示信息interrupt_promptchunk[__interrupt__][0].value# 如果没有触发中断说明图已经跑到 END 了跳出大循环ifnotinterrupted:break# 2. 模拟前端弹窗获取人类真实反馈user_feedbackinput(interrupt_prompt\n)# 3. 核心机制唤醒图# 用 Command(resume...) 重新发起请求LangGraph 会自动从刚才中断的节点继续往下跑current_inputCommand(resumeuser_feedback)这种设计非常优雅地剥离了“业务流”和“前端交互流”是真正生产可用的 HIL (Human-in-the-Loop) 方案。4. 多智能体协作 (Multi-Agent) 架构模式单体 Agent 能力再强也无法搞定错综复杂的巨型项目。多智能体协作是通往更高智能的必经之路。常见的多智能体组织架构有以下几种顺序协作 (Sequential)Agent A 查资料 → Agent B 写初稿 → Agent C 润色。线性传递。并行协作 (Parallel)面对一个大问题拆分为多个子问题交由不同领域的 Agent 并发处理最后由一个统一节点汇总。主控专家模式 (Supervisor-Expert)也就是我们常说的“包工头与打工人”。主控 Agent 负责任务拆解和路由将特定任务分发给特定的专家 Agent 子图。协商模式 (Consensus)多个智能体通过相互对话、辩论达成一致后再输出。

相关文章:

基于 LangChain 1.0 的 LangGraph 高级应用

基于 LangChain 1.0 的 LangGraph 高级应用 文章目录基于 LangChain 1.0 的 LangGraph 高级应用1. 深度对比:Workflow vs Agent1.1 Workflow 实现示例(内容审核)1.2 Agent 实现示例(内容审核)2. 高级状态管理&#xff…...

反激变换器磁学分析

一、反激变换器变压器功能及其占空比图1如图1所示,为反激变换器拓扑,变压器一次绕组匝数和变压器二次绕组匝数之比为;反激变换器变压器功能:由图1中正负号所示,一次绕组和二次绕组的感应电压方向相反,当开关…...

3大核心功能彻底解决环世界MOD管理难题:RimSort完整指南

3大核心功能彻底解决环世界MOD管理难题:RimSort完整指南 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a reliable, community-ma…...

Claude Computer Use:AI 操控电脑的革命性突破详解

Claude Computer Use:AI 操控电脑的革命性突破详解 引言 2024 年,Anthropic 公司推出了 Claude 3.5 Sonnet 模型,并首次引入了Computer Use(电脑使用)功能。这项技术标志着 AI 从单纯的对话助手向能够实际操作电脑的自主代理迈出了重要一步。本文将深入解析 Claude Comp…...

跨场景事件:没人聊但人人踩的持久化问题

目录根本矛盾静态事件:幽灵订阅问题实例事件:随场景消亡DontDestroyOnLoad 创可贴Bootstrap 场景模式多场景编辑让情况更糟生命周期问题GES 如何解决这个问题ScriptableObject 事件存在于场景之外Behavior Window:自动生命周期管理Persistent…...

论文写作“神器大比拼”:好写作AI凭实力“出圈”

在学术的漫漫征途中,论文写作就像是一场艰难的马拉松,从构思选题到组织内容,再到打磨润色,每一步都充满挑战。而如今,AI写作软件如雨后春笋般涌现,为论文写作者们带来了新的希望和助力。但面对琳琅满目的选…...

学Simulink——基于Simulink的单位功率因数(UPF)整流控制策略

目录 手把手教你学Simulink ——基于Simulink的单位功率因数(UPF)整流控制策略 一、问题背景 二、UPF 控制原理 1. 功率因数定义 2. dq 坐标系下的解耦控制 三、系统架构 四、Simulink 建模步骤 第一步:搭建主电路 第二步:实现锁相环(PLL) 第三步:坐标变换 第…...

告别‘电音’:用WaveRNN和FFTNet给你的AI语音合成项目选个又快又好的声码器

神经声码器选型实战:从WaveRNN到FFTNet的高效语音合成方案 语音合成技术正在经历一场由深度学习驱动的革命,而声码器(Vocoder)作为将频谱特征转换为自然波形的关键组件,其性能直接影响着合成语音的质量和效率。面对市…...

学Simulink——基于Simulink的固定频率滞环电流控制Boost变换器

目录 手把手教你学Simulink——基于Simulink的固定频率滞环电流控制Boost变换器​ 摘要​ 一、背景与挑战​ 1.1 Boost变换器电流控制的痛点与传统方法局限​ 1.1.1 应用场景与核心指标​ 1.1.2 传统控制的缺陷​ 1.2 固定频率滞环电流控制的核心优势​ 1.3 设计目标​ …...

B站成分检测器深度解析:5大革新特性重塑评论区交互体验

B站成分检测器深度解析:5大革新特性重塑评论区交互体验 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分油猴脚本,主要为原神玩家识别 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-comment-checker 在B站的海量评论互…...

力扣第97题:多数元素

第一部分:问题描述 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums = [3,2,3] 输出:3 示例 2: 输入:nums = [2,2,1,1,1…...

高效挖掘论文开源项目的五大实战平台

1. 科研必备:五大开源代码平台全景解析 刚入行AI那会儿,最头疼的就是复现论文。明明算法原理都看懂了,可一动手就发现作者留了"课后习题"——关键实现细节全在"详见代码"四个字里。后来我摸索出一套方法论:与…...

计算机应届生:简历好看≠能过面试

文章目录 前言一、简历"P图":美颜开过头,见面就翻车二、面试的"黑盒":你以为在考八股文,其实在考思维模型三、项目经历的"坑":你的秒杀系统,可能只是个Hello World四、技术深…...

1520上市公司企业短期并购绩效和长期并购绩效数据+dofile(2008-2022)

数据来源参考《管理世界》陈仕华老师的做法,详情点击查看更多详情信息时间跨度2008-2022区域跨度企业数据格式dta/excel数据简介今天数据皮皮侠团队为大家分享一份最新的上市公司企业短期并购绩效和长期并购绩效数据,供大家研究使用。数据指标上市公司企…...

实战指南:基于快马平台生成vscode电商后台管理项目脚手架

最近在做一个电商后台管理系统的前端项目,正好尝试了用InsCode(快马)平台来生成项目脚手架,整个过程比我预想的要顺畅很多。作为一个经常用VSCode开发的前端工程师,这次体验让我发现原来项目初始化可以这么高效。下面分享下具体实现过程和几点…...

5分钟快速搭建PUBG实时雷达:掌握战场信息的终极指南

5分钟快速搭建PUBG实时雷达:掌握战场信息的终极指南 【免费下载链接】PUBG-maphack-map this is a working copy online-map from jussihi/PUBG-map-hack, use nodejs webserver instead of firebase. 项目地址: https://gitcode.com/gh_mirrors/pu/PUBG-maphack-…...

3分钟快速上手WindowResizer:终极窗口强制调整工具

3分钟快速上手WindowResizer:终极窗口强制调整工具 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽大小的应用程序窗口而烦恼吗?WindowR…...

鸿蒙物联网开发教程-第八章 网络请求1

第八章 网络请求 8.1 网络请求概述 鸿蒙应用中的网络请求主要使用fetch API或@ohos.net.http模块进行网络通信。网络请求用于: 获取远程数据 上传数据到服务器 与物联网平台通信 调用第三方API 8.2 HTTP请求 8.2.1 使用fetch API // 发送GET请求fetch(‘https://api.e…...

Qwen3-VL:30B部署实操:Clawdbot配置文件详解、飞书Bot权限申请与事件订阅最佳实践

Qwen3-VL:30B部署实操:Clawdbot配置文件详解、飞书Bot权限申请与事件订阅最佳实践 1. 项目概述与准备工作 1.1 项目介绍 本项目将带你从零开始,在CSDN星图AI云平台上私有化部署最强的多模态大模型Qwen3-VL:30B,并通过Clawdbot搭建一个既能…...

QT——计算器核心算法

1.中缀表达式转后缀表达式(1)分离算法(数字和符号分离)中缀表达式中包含:数字和小数点、符号位(或-)、运算符(-*/)、括号思想:以符号作为标志对表达式中的字符逐个访问当前字符exp[i…...

深入Anomalib:如何用Padim、PatchCore等算法为你的自定义数据集做异常定位?

深入Anomalib:如何用Padim、PatchCore等算法为你的自定义数据集做异常定位? 在工业质检和医疗影像领域,异常检测正从"有没有问题"的定性判断,升级到"问题在哪里"的精准定位。当你的数据集充满特殊纹理的PCB板…...

Face3D.ai Pro在动画制作中的应用:快速生成角色面部绑定基础模型

Face3D.ai Pro在动画制作中的应用:快速生成角色面部绑定基础模型 1. 动画制作中的面部绑定挑战 在传统动画制作流程中,角色面部绑定是最耗时且技术要求最高的环节之一。一个标准的面部绑定流程通常包括: 3D扫描或手动建模(2-3天…...

告别过曝欠曝!手把手教你用FPGA实现加权灰度均值自动曝光(附Verilog思路)

FPGA图像处理实战:基于加权灰度均值的自动曝光算法实现 在工业检测、安防监控和医疗影像等领域,CMOS传感器采集的图像质量直接影响后续分析和决策。但环境光照变化常导致图像过曝或欠曝,传统固定曝光方案难以应对复杂场景。本文将深入探讨如何…...

500元预算搞定无人机高清图传?手把手教你用OpenIPC+SSC338Q+IMX415攒一套(附硬件清单与避坑指南)

500元预算打造无人机高清图传:OpenIPCSSC338QIMX415实战手册 当大多数无人机爱好者还在为动辄上千元的专业图传设备犹豫时,一群极客已经用开源方案将成本压缩到惊人的500元区间。这不仅是预算的胜利,更代表着硬件DIY文化的精髓——用智慧填补…...

【AI智能体】Claude Code 核心记忆文件 CLAUDE.md实战操作详解

目录 一、前言 二、Claude Code 介绍 2.1 Claude Code 是什么 2.2 Claude Code 核心特点 2.3 与其他AI编程工具对比 三、CLAUDE.md 项目记忆文件介绍 3.1 CLAUDE.md 文件概述 3.1.1 CLAUDE.md 是什么? 3.1.2 CLAUDE.md 核心特点 3.1.3 CLAUDE.md 核心价值 …...

跨平台办公利器:OpenOffice在Linux与Windows系统的高效部署指南

1. 为什么选择OpenOffice作为跨平台办公方案 作为一个在多个操作系统环境下折腾过办公软件的老手,我强烈推荐OpenOffice作为跨平台办公的首选工具。它最大的优势就是完全免费开源,而且对Linux和Windows系统都有完美支持。我最早接触OpenOffice是在2013年…...

DETR:当Transformer重塑目标检测,我们告别了锚框与NMS

1. DETR如何颠覆传统目标检测 第一次看到DETR的论文时,我正被传统目标检测模型中的各种手工组件折磨得够呛。作为在计算机视觉领域摸爬滚打多年的从业者,我太熟悉那些繁琐的流程了:先要设计各种尺寸和比例的锚框,然后调整NMS的iou…...

深入解析gbplanner_ros:基于图的自主探索路径规划算法在复杂地下环境中的应用

1. 什么是gbplanner_ros? 如果你正在研究机器人自主探索技术,特别是针对地下矿洞这类复杂环境,那么gbplanner_ros这个基于图的路径规划算法可能会引起你的兴趣。我第一次接触这个算法是在一个地下管道巡检机器人项目中,当时我们尝…...

NLP实战指南:从基础到进阶的文本相似度计算全解析

1. 文本相似度计算入门:为什么它如此重要? 想象一下这样的场景:你在电商平台搜索"苹果手机充电器",结果系统不仅展示了充电器商品,还推荐了"iPhone电源适配器"、"MacBook充电线"等相关产…...

Mel滤波器在语音识别中的关键作用与实现细节

1. 为什么语音识别需要Mel滤波器? 第一次接触语音识别时,我对着频谱图发愁——那些密密麻麻的频率分量看起来毫无规律。直到发现Mel滤波器这个"翻译官",才明白它能把机器看不懂的频谱,转换成人耳熟悉的"语言"…...