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

LangChain 中间件实战:HumanInTheLoopMiddleware 实现高危操作人工审核

1. 引言

在构建基于大语言模型(LLM)的智能体(Agent)时,我们常常需要让 Agent 执行一些具有潜在风险的操作,例如直接操作数据库、调用外部 API 或执行系统命令。为了确保安全性和可控性,引入人工审核环节至关重要。LangChain 提供了强大的中间件(Middleware)机制,其中HumanInTheLoopMiddleware便是实现“人在回路”(Human-in-the-loop)审核的利器。

本文将深入解析HumanInTheLoopMiddleware的工作原理,并通过一个完整的代码示例,演示如何拦截 Agent 对数据库的高危写操作(如INSERTUPDATEDELETE),在人工确认、拒绝或修改后才继续执行。

2. 核心概念与依赖

2.1 什么是中间件(Middleware)?

在 LangChain 的 Agent 执行流程中,中间件是一种可插拔的组件,它能够在 Agent 调用工具(Tool)之前之后介入,实现诸如日志记录、权限检查、结果修改或(本文重点)人工中断等功能。

2.2 HumanInTheLoopMiddleware

HumanInTheLoopMiddlewarelangchain.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# 获取模型实例model=get_deepseek_model()

3.2 定义高危工具

我们定义一个模拟的数据库写操作工具。在实际应用中,这里应连接真实的数据库。

@tooldefdangerous_write(sql)->str:"""对数据库执行风险操作(插入/更新/删除)。当请求涉及数据库写操作或出现以‘SQL’开头的指令时,必须调用本工具"""returnf'[模拟执行]{sql}'

关键点:工具的description非常重要,它引导 LLM 在何时调用此工具。这里明确要求“当请求涉及数据库写操作或出现以‘SQL’开头的指令时,必须调用本工具”。

3.3 配置人工审核中间件

hitl=HumanInTheLoopMiddleware(interrupt_on={'dangerous_write':InterruptOnConfig(allowed_decisions=['approve','reject','edit'],description='请确认是否执行此高危操作')})
  • interrupt_on: 一个字典,指定哪些工具的调用需要中断。键是工具名('dangerous_write'),值是InterruptOnConfig配置对象。
  • allowed_decisions: 定义人工可以做出的决策类型。通常包括:
    • 'approve': 批准执行。
    • 'reject': 拒绝执行。
    • 'edit': 修改工具调用的参数后再执行。
  • description: 中断时显示给人工审核者的提示信息。

3.4 创建带中间件的 Agent

agent=create_agent(model=model,middleware=[hitl],# 将中间件加入执行链tools=[dangerous_write],system_prompt=""" 只用一句极短中文回答(≤20字)。 凡是涉及数据库写操作,或消息以“SQL”开头时,必须调用工具dangerous_write,不得直接回答 """,checkpointer=InMemorySaver()# 用于保存中断状态,便于恢复)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=...)恢复。"""interrupt=result.get("__interrupt__")print(interrupt)print('开始人工干预')decision=input("请输入决策:'approve','reject','edit'\n").strip().lower()ifdecision=='approve':returnagent.invoke(Command(resume={'decisions':[{'type':'approve'}]}),config=CFG)elifdecision=='reject':returnagent.invoke(Command(resume={"decisions":[{"type":"reject","override":{"content":"[操作已被人工拒绝]"}}]}),config=CFG)elifdecision=='edit':new_sql=input("请输入您的新sql语句:")returnagent.invoke(Command(resume={"decisions":[{"type":"edit","edited_action":{"name":"dangerous_write","args":{"sql":new_sql}}}]}),config=CFG)else:print("输入的指令有问题,采用reject方案")returnagent.invoke(Command(resume={"decisions":[{"type":"reject","override":{"content":"[操作已被人工拒绝]"}}]}),config=CFG)

决策恢复机制

  • approve: 决策类型为approve,Agent 将使用原参数继续调用工具。
  • 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,start=1):print(f"\n第{i}轮")print(f"Q:{question}")humanMessage=HumanMessage(content=f"{question}")state=agent.invoke({"messages":[humanMessage]},config=CFG)# 检查是否被中间件中断ifstate.get("__interrupt__"):state=handle_interrupt(state)print(type(state).__name__)print(state)answer=state['messages'][-1].contentprint(f"A:{answer}")

4. 执行流程与输出分析

运行上述代码,你将看到类似以下的交互过程:

第1轮(普通问答):

Q: 你是谁? A: [LLM的简短自我介绍,例如:“我是AI助手。”]

说明:第一轮不涉及 SQL,LLM 直接根据系统提示简短回答。

第2轮(触发中断):

Q: SQL: INSERT INTO logs(content) VALUES ('hello');

此时,LLM 识别到“SQL:”开头,决定调用dangerous_write工具。中间件检测到对该工具的调用,触发中断。控制台打印中断信息并等待输入:

开始人工干预 请输入决策:'approve','reject','edit'

假设用户输入approve,Agent 恢复执行,工具被调用,返回[模拟执行]INSERT INTO logs(content) VALUES ('hello');,LLM 最终输出该结果。

第3轮(不触发):

Q: 继续 A: [LLM的简短回答]

第4轮(再次触发中断):

Q: SQL: DELETE FROM orders WHERE created_at >= date('now','-7 days');

再次触发中断。此时用户可以尝试rejectedit决策。

  • 如果输入reject,最终回答将是[操作已被人工拒绝]
  • 如果输入edit,程序会提示输入新的 SQL,例如改为SELECT * FROM orders WHERE ...,然后 Agent 会用新 SQL 调用工具。

5. 总结与扩展

5.1 核心价值

HumanInTheLoopMiddleware为 AI Agent 系统提供了关键的安全护栏。它将自动化流程与人类判断相结合,特别适用于:

  • 数据库写操作:防止误删、误更新。
  • 金融交易:支付、转账前的二次确认。
  • 内容发布:敏感信息发布前的审核。
  • 系统控制:重启服务器、修改配置等危险命令。

5.2 扩展思路

  1. 图形化界面:将命令行输入替换为 Web 界面或聊天机器人按钮,提升用户体验。
  2. 多级审批:根据操作风险等级,设计串联多个审批节点的中间件。
  3. 超时与默认策略:为中断设置超时,超时后自动执行预设策略(如拒绝)。
  4. 审计日志:在中间件中记录所有中断事件、决策人、决策结果和时间戳,便于追溯。

通过本文的示例,你应该已经掌握了使用HumanInTheLoopMiddleware为你的 LangChain Agent 添加人工审核能力的基本方法。合理利用此机制,可以极大增强 AI 应用在真实生产环境中的安全性与可靠性。

http://www.jsqmd.com/news/1298381/

相关文章:

  • 基于CH552的USB CDC设备开发:从协议解析到工程实践
  • 2026年值得信赖的侵权纠纷律师事务所推荐,服务品质之选口碑力荐 - 工业品牌热点
  • Linux下CH34X-MPHSI硬件I2C主控与i2c-tools调试实战指南
  • 2026 年新发布:昌平知名的玻璃纤维喷涂施工公司有哪些,花200块竟解决了困扰我半年的保温难题?-翰欧无机纤维喷涂 - 企业推荐官【认证】
  • 智能水表CJ/T 188协议深度解析与Java实现:从帧结构到数据净荷的完整解码实战
  • C++跨平台云备份工具开发实战:文件监控、压缩加密与S3上传
  • 百度网盘提取码智能获取工具:告别繁琐搜索,5秒高效解锁资源
  • 《从零吃透集成电路 IC 设计全流程|学科体系 + EDA 软件实操 + 工程案例连载 第二篇》
  • Product Hunt 每日热榜 | 2026-07-30
  • 港交所行情协议MMDP/OMP解析:从二进制流到低延迟订单簿实战
  • 从 curl 到工程封装:实时公交到站接口集成实践
  • 2026年标准模胚工厂:高精度与稳定性的源头企业选择 - 优企名品
  • 演唱会应援棒厂家口碑排行 2026年新发布 定制服务与实力解析 - 工业品牌热点
  • STM32调试器无法识别芯片:从SWD通信到RDP保护的全面排查指南
  • Windows后渗透实战:从Meterpreter会话到系统权限的完整提权路径
  • Unity移动端TMP_InputField onSelect事件不触发的原理与解决方案
  • Java线程池实战:核心原理与配置优化指南
  • 汽车漆面车漆缺陷数据集 深度学习框架目标检测算法 Yolov8训练道路 建立基于YOLOv8道路汽车漆面缺陷(划痕)检测系统
  • 新能源汽车推荐系统:Python+Django+Vue.js全栈开发实践
  • 抖音批量下载工具终极指南:如何一键保存无水印视频与完整内容管理
  • C语言中二维整形数组和二维字符型数组
  • 深度解析palworld-save-tools:帕鲁世界存档编辑的专业技术方案
  • 2026年AI论文生成工具测评与使用指南
  • 2026盘扣厂家十大热门品牌真实横评,选定再买不交智商税 - 工业推荐榜
  • Android车载开发核心技术解析与智能座舱实践
  • TVS管选型与应用实战:从核心原理到电路防护设计避坑指南
  • gdbserver远程调试实战:嵌入式与物联网开发调试利器
  • STM32 GPIO模拟串口:超简单可变波特率实现方案
  • 数字逻辑电路设计:从布尔代数到组合逻辑与时序逻辑构建
  • 谁说想看电脑网速和硬件状态,非得打开任务管理器那么麻烦?今天这个宝贝直接让你的任务栏活过来。