LangChain 中间件实战:HumanInTheLoopMiddleware 实现高危操作人工审核
1. 引言在构建基于大语言模型LLM的智能体Agent时我们常常需要让 Agent 执行一些具有潜在风险的操作例如直接操作数据库、调用外部 API 或执行系统命令。为了确保安全性和可控性引入人工审核环节至关重要。LangChain 提供了强大的中间件Middleware机制其中HumanInTheLoopMiddleware便是实现“人在回路”Human-in-the-loop审核的利器。本文将深入解析HumanInTheLoopMiddleware的工作原理并通过一个完整的代码示例演示如何拦截 Agent 对数据库的高危写操作如INSERT、UPDATE、DELETE在人工确认、拒绝或修改后才继续执行。2. 核心概念与依赖2.1 什么是中间件Middleware在 LangChain 的 Agent 执行流程中中间件是一种可插拔的组件它能够在 Agent 调用工具Tool之前或之后介入实现诸如日志记录、权限检查、结果修改或本文重点人工中断等功能。2.2 HumanInTheLoopMiddlewareHumanInTheLoopMiddleware是langchain.agents.middleware模块提供的一个中间件。它的核心功能是根据预定义的规则interrupt_on在特定工具被调用时暂停 Agent 执行等待外部例如用户、审批系统输入决策然后根据决策结果恢复执行。2.3 关键依赖安装确保已安装以下库pipinstalllangchain langchain-core langgraph本文示例还假设你有一个可用的 LLM 模型。示例中使用了一个名为get_deepseek_model的工厂函数来获取模型你可以替换为 OpenAI、Azure OpenAI 或本地模型。3. 代码实现详解3.1 导入与初始化fromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportHumanInTheLoopMiddleware,InterruptOnConfigfromlangchain_core.messagesimportHumanMessagefromlangchain_core.toolsimporttoolfromlanggraph.checkpoint.memoryimportInMemorySaverfromlanggraph.typesimportCommandfrommethod.model_factoryimportget_deepseek_model# 获取模型实例modelget_deepseek_model()3.2 定义高危工具我们定义一个模拟的数据库写操作工具。在实际应用中这里应连接真实的数据库。tooldefdangerous_write(sql)-str:对数据库执行风险操作插入/更新/删除。当请求涉及数据库写操作或出现以‘SQL’开头的指令时必须调用本工具returnf[模拟执行]{sql}关键点工具的description非常重要它引导 LLM 在何时调用此工具。这里明确要求“当请求涉及数据库写操作或出现以‘SQL’开头的指令时必须调用本工具”。3.3 配置人工审核中间件hitlHumanInTheLoopMiddleware(interrupt_on{dangerous_write:InterruptOnConfig(allowed_decisions[approve,reject,edit],description请确认是否执行此高危操作)})interrupt_on: 一个字典指定哪些工具的调用需要中断。键是工具名dangerous_write值是InterruptOnConfig配置对象。allowed_decisions: 定义人工可以做出的决策类型。通常包括approve: 批准执行。reject: 拒绝执行。edit: 修改工具调用的参数后再执行。description: 中断时显示给人工审核者的提示信息。3.4 创建带中间件的 Agentagentcreate_agent(modelmodel,middleware[hitl],# 将中间件加入执行链tools[dangerous_write],system_prompt 只用一句极短中文回答≤20字。 凡是涉及数据库写操作或消息以“SQL”开头时必须调用工具dangerous_write不得直接回答 ,checkpointerInMemorySaver()# 用于保存中断状态便于恢复)CFG{configurable:{thread_id:test-hitl}}# 会话配置system_prompt进一步强化了 LLM 的行为约束确保其严格遵守工具调用规则。3.5 实现中断处理逻辑当中间件触发中断后Agent 的invoke方法会返回一个包含__interrupt__键的状态。我们需要编写处理函数来获取人工决策并使用Command(resume...)来恢复 Agent 执行。state{messages:[]}defhandle_interrupt(result):处理HITL中断从命令行读取决策并用Command(resume...)恢复。interruptresult.get(__interrupt__)print(interrupt)print(开始人工干预)decisioninput(请输入决策approve,reject,edit\n).strip().lower()ifdecisionapprove:returnagent.invoke(Command(resume{decisions:[{type:approve}]}),configCFG)elifdecisionreject:returnagent.invoke(Command(resume{decisions:[{type:reject,override:{content:[操作已被人工拒绝]}}]}),configCFG)elifdecisionedit:new_sqlinput(请输入您的新sql语句)returnagent.invoke(Command(resume{decisions:[{type:edit,edited_action:{name:dangerous_write,args:{sql:new_sql}}}]}),configCFG)else:print(输入的指令有问题采用reject方案)returnagent.invoke(Command(resume{decisions:[{type:reject,override:{content:[操作已被人工拒绝]}}]}),configCFG)决策恢复机制approve: 决策类型为approveAgent 将使用原参数继续调用工具。reject: 决策类型为reject并提供一个override内容。Agent 不会调用工具而是直接将此内容作为工具调用的结果返回给 LLM。edit: 决策类型为edit并提供edited_action指定新的工具名和参数。Agent 将使用新参数调用工具。3.6 模拟多轮对话conversation[你是谁,SQL: INSERT INTO logs(content) VALUES (hello);,继续,SQL: DELETE FROM orders WHERE created_at date(now,-7 days);]fori,questioninenumerate(conversation,start1):print(f\n第{i}轮)print(fQ:{question})humanMessageHumanMessage(contentf{question})stateagent.invoke({messages:[humanMessage]},configCFG)# 检查是否被中间件中断ifstate.get(__interrupt__):statehandle_interrupt(state)print(type(state).__name__)print(state)answerstate[messages][-1].contentprint(fA:{answer})4. 执行流程与输出分析运行上述代码你将看到类似以下的交互过程第1轮普通问答:Q: 你是谁 A: [LLM的简短自我介绍例如“我是AI助手。”]说明第一轮不涉及 SQLLLM 直接根据系统提示简短回答。第2轮触发中断:Q: SQL: INSERT INTO logs(content) VALUES (hello);此时LLM 识别到“SQL:”开头决定调用dangerous_write工具。中间件检测到对该工具的调用触发中断。控制台打印中断信息并等待输入开始人工干预 请输入决策approve,reject,edit假设用户输入approveAgent 恢复执行工具被调用返回[模拟执行]INSERT INTO logs(content) VALUES (hello);LLM 最终输出该结果。第3轮不触发:Q: 继续 A: [LLM的简短回答]第4轮再次触发中断:Q: SQL: DELETE FROM orders WHERE created_at date(now,-7 days);再次触发中断。此时用户可以尝试reject或edit决策。如果输入reject最终回答将是[操作已被人工拒绝]。如果输入edit程序会提示输入新的 SQL例如改为SELECT * FROM orders WHERE ...然后 Agent 会用新 SQL 调用工具。5. 总结与扩展5.1 核心价值HumanInTheLoopMiddleware为 AI Agent 系统提供了关键的安全护栏。它将自动化流程与人类判断相结合特别适用于数据库写操作防止误删、误更新。金融交易支付、转账前的二次确认。内容发布敏感信息发布前的审核。系统控制重启服务器、修改配置等危险命令。5.2 扩展思路图形化界面将命令行输入替换为 Web 界面或聊天机器人按钮提升用户体验。多级审批根据操作风险等级设计串联多个审批节点的中间件。超时与默认策略为中断设置超时超时后自动执行预设策略如拒绝。审计日志在中间件中记录所有中断事件、决策人、决策结果和时间戳便于追溯。通过本文的示例你应该已经掌握了使用HumanInTheLoopMiddleware为你的 LangChain Agent 添加人工审核能力的基本方法。合理利用此机制可以极大增强 AI 应用在真实生产环境中的安全性与可靠性。

相关新闻

超辐射发光二极管(SLD)原理、应用与选型全解析

超辐射发光二极管(SLD)原理、应用与选型全解析

1. 项目概述:从“配角”到“主角”的超辐射光源在光电子领域,提到光源,大家首先想到的往往是激光器(LD)和发光二极管(LED)。前者方向性好、亮度高,后者成本低、寿命长。但你是否遇到…

2026/7/31 5:11:34 阅读更多 →
JavaScript:ES6 + 高级语法、模块化、元编程

JavaScript:ES6 + 高级语法、模块化、元编程

第十一阶段:ES6 高级语法、模块化、元编程 11.1模块化系统「ES6」 ES Module 模块标准 import /export 默认导出 export default、具名导出 export 默认导出:一个模块只能有一个默认导出,使用 export default 关键字。例如,在 ma…

2026/7/31 5:11:34 阅读更多 →
STM32内部FLASH存储与显示图片:资源优化与RGB565转换实战

STM32内部FLASH存储与显示图片:资源优化与RGB565转换实战

1. 项目缘起:为什么要在STM32内部FLASH里存图片?最近在做一个基于STM32F103的便携式设备,需要显示一个公司的Logo和一些简单的状态图标。一开始,我理所当然地想到了用SD卡或者外置SPI FLASH来存储这些图片资源,毕竟现在…

2026/7/31 5:11:34 阅读更多 →

最新新闻

博途V16中PLC系统时间转字符串的完整实现与优化指南

博途V16中PLC系统时间转字符串的完整实现与优化指南

1. 项目缘起:为什么要在博途中处理系统时间字符串?在工业自动化项目里,尤其是涉及到数据记录、生产报表、设备状态追溯或者配方管理的场景,时间戳是一个绕不开的核心要素。你可能需要把某个报警发生的时间、一批产品的生产开始/结…

2026/7/31 5:49:51 阅读更多 →
国产麒麟系统文件删除不要乱操作!这样还能找回数据

国产麒麟系统文件删除不要乱操作!这样还能找回数据

不少国产麒麟系统使用者,都会碰到国产麒麟系统文件删除的情况。日常手滑删除文件夹、清空回收站、rm 指令误操作、重装系统、U 盘拷贝失误,都会造成国产麒麟系统文件删除,工作文档、项目资料全部消失不见。很多人遇到国产麒麟系统文件删除之后…

2026/7/31 5:49:51 阅读更多 →
2026 基于深度学习的毕业设计(论文)选题指南 开题指导

2026 基于深度学习的毕业设计(论文)选题指南 开题指导

每年到了毕业设计选题阶段,都会有很多同学陷入同一种焦虑:想做深度学习,但不知道从哪里入手;想做 YOLO、Transformer、大模型,又担心难度太高;网上题目看起来都差不多,不知道如何体现创新&#…

2026/7/31 5:49:51 阅读更多 →
Excel数据转Word文档:Sheet-to-Doc与邮件合并对比指南

Excel数据转Word文档:Sheet-to-Doc与邮件合并对比指南

1. 文档生成工具的选择困境每次遇到批量生成文档的需求时,我都会在Sheet-to-Doc和邮件合并之间纠结。上周帮财务部做200份个性化报表时,这个选择困难症又犯了。这两种工具都能把Excel数据灌入Word模板,但实际用起来差别可大了去了。Sheet-to-…

2026/7/31 5:49:51 阅读更多 →
电赛国一报告模板解析:从PID控制到系统测试的工程实践指南

电赛国一报告模板解析:从PID控制到系统测试的工程实践指南

1. 项目概述:一份“国一”级别的报告模板意味着什么?在电子设计竞赛(电赛)的圈子里,流传着这样一句话:“三分靠做,七分靠写”。这句话虽有夸张,但道出了一个残酷的现实:一…

2026/7/31 5:49:51 阅读更多 →
C语言学习笔记(十):C语言函数进阶与预处理命令详解

C语言学习笔记(十):C语言函数进阶与预处理命令详解

一、函数递归1. 什么是递归?递归:一个函数在执行过程中调用自身。例如:void fun() {fun(); }函数:fun()调用自己。这种方式称为:函数递归。2. 递归的基本结构一个完整的递归函数通常包含两个部分:&#xff…

2026/7/31 5:48:50 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻