LangGraph人机协同实战:用interrupt实现Agent暂停与人类审批

为什么Agent需要"人类在环"
随着AI Agent能力的增强,它们已经不再局限于回答问题,而是开始执行真实世界的操作:发送邮件、修改数据库、部署代码,甚至处理金融交易。AI Agent(智能代理)是一种能够感知环境、自主做出决策并执行行动的AI系统,与传统的聊天机器人不同,它不仅能生成文本回复,还能通过工具调用(Tool Use)与外部系统交互。近年来,随着大语言模型推理能力的增强以及函数调用(Function Calling)机制的成熟,Agent已经能够编排多步骤的复杂任务链。这种从"对话"到"行动"的跨越,带来了巨大的生产力提升,但同时也引入了全新的风险维度——当一个Agent可以直接操作生产数据库或发起资金转账时,一个幻觉(Hallucination)或推理错误就可能造成不可逆的损失。
正因为这些操作具有不可逆的后果,我们不能让Agent在没有任何监督的情况下自主行动。这就是**Human-in-the-Loop(HITL,人机协同)**模式的价值所在。HITL是AI安全与治理(AI Safety & Governance)领域的核心概念之一。根据自动化程度的不同,人机协同通常被分为三个层次:Human-in-the-Loop(人类参与每个决策循环)、Human-on-the-Loop(人类监督整体流程,仅在异常时介入)、Human-out-of-the-Loop(完全自主,人类不参与)。在实际的AI系统设计中,这三种模式往往共存——同一个Agent的不同操作,根据风险等级采用不同的人类参与程度。欧盟AI法案(EU AI Act)和美国的AI行政命令等监管框架,也明确要求高风险AI系统必须保留人类监督机制。HITL因此不仅是技术选择,更是合规要求。
最近一位开发者在Reddit上分享了他学习LangGraph的实践经验。LangGraph是由LangChain团队开发的一个用于构建有状态、多步骤AI Agent应用的框架。与LangChain的线性链式调用不同,LangGraph基于有向图(Directed Graph)的理念,将Agent的工作流建模为节点(Node)和边(Edge)组成的图结构。每个节点代表一个处理步骤(如调用LLM、执行工具、检查条件),边则定义了步骤之间的流转逻辑。这种图结构的核心优势在于支持循环、分支和条件跳转,使得开发者能够表达复杂的Agent决策逻辑,包括重试、多轮推理和人工干预等场景。LangGraph还内置了状态管理机制,每次节点执行后的状态变更都会被追踪,为持久化和恢复执行提供了基础。
这位开发者没有停留在阅读文档的层面,而是构建了一个极简但完整的示例,来真正理解当一个LangGraph执行流程"暂停"和"恢复"时,底层究竟发生了什么。这个案例虽小,却精准地揭示了HITL的核心机制。

最小可行的HITL场景:Agent发邮件前等待审批
作者选择了一个非常贴近日常的场景:Agent决定要发送一封邮件,此时图(Graph)暂停,交由人类审查这个动作,人类选择批准或拒绝,然后图继续执行。
整个流程可以拆解为清晰的几步:
用户请求
↓
Agent 决定执行某个动作
↓
interrupt() ← 在此暂停
↓
人类审查
↓
批准 / 拒绝
↓
Command({ resume: ... }) ← 携带人类决策恢复执行
↓
图继续执行
你可能没注意到,作者刻意让这个例子保持精简:没有接入真实的LLM,也没有调用真正的邮件API。这个设计选择很有意思——他的目标不是构建一个可用的产品,而是剥离掉一切干扰因素,专注理解LangGraph暂停与恢复的运行原理。这种"做减法"的学习方式,对于掌握复杂框架的核心机制往往比一上来就搭建完整应用更有效。
LangGraph HITL核心机制拆解
这个示例用到了LangGraph的几个关键组件,理解它们的配合方式是掌握Human-in-the-Loop的关键。
interrupt():暂停执行的触发点
interrupt() 是整个流程的核心。当图执行到这一步时,会停下来等待外部输入。作者提到了一个特别有启发的发现:
人类的响应会成为
interrupt()的返回值。
这是一个非常优雅的设计。interrupt() 的设计灵感可以追溯到操作系统中的中断(Interrupt)机制和编程语言中的协程(Coroutine)概念。在操作系统中,硬件中断允许CPU暂停当前任务、保存上下文、处理外部事件后再恢复执行。类似地,LangGraph的 interrupt() 让图执行流在某个节点暂停,将控制权交给外部(人类),待外部响应后再从断点处继续。这与Python中的 yield 关键字在生成器(Generator)中的行为颇为相似——函数执行到 yield 时暂停并返回一个值,外部通过 send() 方法注入新值后函数从暂停处继续。
从代码逻辑上看,interrupt() 就像一个普通的函数调用,只不过它的"返回值"不是由程序计算得出,而是由真实的人类在稍后某个时刻提供。这意味着开发者可以用近乎同步的思维方式来编写异步的、跨越人类决策的代码逻辑,极大降低了开发者的认知负担。
MemorySaver与thread_id:状态的持久化
仅仅暂停是不够的,系统还需要记住"暂停在哪里"以及"当时的所有状态"。这正是MemorySaver(检查点保存器)和thread_id发挥作用的地方。
MemorySaver是LangGraph提供的检查点保存器的一种实现,主要用于开发和测试阶段,它将状态保存在内存中。在生产环境中,LangGraph还支持基于SQLite、PostgreSQL等持久化存储的检查点保存器,确保即使服务重启,执行状态也不会丢失。检查点机制的核心是序列化(Serialization)——在每个节点执行完毕后,将当前图的完整状态(包括所有通道中的数据、当前执行位置、历史消息等)序列化并存储。恢复时,系统反序列化该快照并从断点处重新构建执行上下文。
作者指出,检查点机制加上thread_id,使得同一个图的执行可以在稍后被恢复。thread_id相当于一次对话或一个任务的唯一标识,本质上是一个命名空间隔离机制,确保不同用户的不同任务流之间互不干扰。检查点则保存了该任务在中断时刻的完整快照。当人类做出决策后,系统通过thread_id找回对应的执行上下文,从暂停处无缝继续。这种设计也天然支持了Agent执行的可审计性——每个检查点都是一个可追溯的历史快照。
这种设计让HITL不再受限于"必须立即响应",人类可以在几分钟、几小时甚至几天后再来审批。
Command与条件路由:根据人类决策分发流程
人类的决策通过 Command({ resume: ... }) 注入回图中,而**条件路由(Conditional routing)**则根据批准或拒绝的结果,决定图接下来走向哪个分支——是真正执行发邮件动作,还是终止并反馈拒绝原因。
条件路由是LangGraph中通过 add_conditional_edges 方法实现的一种边类型。与无条件边(总是流向固定的下一个节点)不同,条件边会根据一个路由函数的返回值,动态决定下一步走向哪个节点。在HITL场景中,路由函数会检查人类通过Command注入的决策值——如果是"approved"则路由到执行节点,如果是"rejected"则路由到终止节点。这种模式在工作流引擎中非常常见,类似于BPMN(业务流程模型与符号)中的排他网关(Exclusive Gateway),使得复杂的分支逻辑能够以声明式的方式表达,而非硬编码在节点内部。
HITL在真实项目中的应用场景
作者在帖子末尾抛出了一个很有价值的开放式问题:大家在实际项目中都把HITL用在哪些场景?他列举了几种常见方向:
- 审批工具调用(tool calls):在Agent调用外部工具前进行人工确认,尤其是高风险工具
- 审查生成内容:让人类把关AI生成的文案、代码或报告后再发布
- 数据库变更:任何写入或删除操作前的人工确认
- 部署操作:CI/CD流程中的人工放行环节
- 金融操作:涉及资金的交易必须经过人工核准
这些场景有一个共同点:操作不可逆或代价高昂。HITL本质上是在Agent的自主性与人类的最终控制权之间寻找平衡。对于低风险、高频次的操作,我们希望Agent全自动运行;而对于关键节点,则插入人类检查点作为安全阀。这种分级控制策略正是前文提到的Human-in-the-Loop与Human-on-the-Loop混合运用的典型体现。
超越简单的"批准/拒绝":进阶人机协同模式
作者最后还提出了一个进阶思考:除了简单的批准/拒绝流程,还有哪些有用的HITL模式?这实际上指向了人机协同设计的更深层次。
在更成熟的实践中,人机协同远不止二元选择。例如:
- 编辑式介入:人类不仅可以批准或拒绝,还可以直接修改Agent的输出(比如调整邮件措辞)后再放行。这种模式反映了人机协同从简单的"门控"(Gating)向"协作"(Collaboration)演进的趋势——Agent的输出不是最终产品,而是一个草稿或提案,人类可以在此基础上进行修改和完善,这与软件工程中的Code Review流程异曲同工。
- 补充信息:当Agent缺少关键信息时,暂停并向人类索取,而非贸然决策
- 多级审批:不同风险等级的操作触发不同层级的审批链路
- 反馈学习:将人类的修正作为训练信号,逐步减少需要介入的场景。这种模式引入了RLHF(基于人类反馈的强化学习)的思想,将人类的修正信号用于模型或策略的持续优化,形成一个正向循环:随着系统不断从人类反馈中学习,需要人类介入的频率逐渐降低,实现从Human-in-the-Loop向Human-on-the-Loop的渐进过渡。
结语
这个来自Reddit的小案例,胜在"小而精"。它没有花哨的LLM集成,也没有复杂的业务逻辑,却把LangGraph实现HITL的核心机制——interrupt()、Command、检查点持久化与条件路由——讲得清清楚楚。
对于正在构建生产级Agent应用的开发者而言,Human-in-the-Loop不是可有可无的附加功能,而是让AI系统能够被信任、能够安全落地的关键基础设施。理解暂停与恢复的底层原理,是迈向可控AI Agent的第一步。感兴趣的读者可以参考作者发布在Medium上的完整示例,动手跑一遍会有更深的体会。
核心要点
相关推荐

DeepSeek Harness五天狂揽15万星背后的三大技术亮点
DeepSeek Harness开源智能体框架5天GitHub新增15万星,本文深入分析其爆红原因:MIT许可证开源整套引擎、零门槛本地部署、一切皆插件的架构设计,以及开发者社区的真实反馈。

物理信息神经网络PINNs入门:该选数学、CS还是物理专业?
想研究物理信息神经网络(PINNs)却不知道本科选数学、计算机科学还是物理?本文从PINNs的技术本质出发,分析三大专业各自的优势与短板,并给出主修与自学的最优组合策略,帮助你规划跨学科学习路径。

零基础学AI大模型:从原理到实战的系统化学习路径
零基础如何系统学习AI大模型?本文梳理从原理理解、提示词工程、API调用到Agent智能体开发的完整学习路径,涵盖基础篇、进阶篇、实战篇三大阶段,帮你避免碎片化学习陷阱,高效掌握大模型核心技能。