人机交互

构建可控的 AI:在工作流中插入人工审批和干预

📚 学习目标

学完这篇文章后,你将能够:

  • 使用 interrupt 函数暂停图的执行
  • 在暂停期间获取上下文信息
  • 使用 Command 恢复(Resume)图的执行
  • 实现一个“敏感操作需人工审批”的工作流

前置知识

在开始学习之前,建议先阅读:


1️⃣ 什么是 Human-in-the-loop?

全自动的 AI Agent 效率很高,但在某些场景下(如转账、发送邮件、发布代码),我们希望有人类介入把关。

LangGraph 允许我们在图的任意位置暂停(Interrupt),等待人类用户的输入(如“批准”或“拒绝”),然后再恢复(Resume)执行。

2️⃣ 实现暂停 (Interrupt)

我们使用 interrupt 函数来触发暂停。通常是在执行敏感操作之前的节点或条件边中调用。

import { interrupt } from '@langchain/langgraph';

const shouldContinue = (state) => {
    const lastMessage = state.messages[state.messages.length - 1];
    
    // 如果 LLM 想要调用工具
    if (lastMessage.tool_calls?.length) {
        
        // 🚨 触发中断!
        // 参数是可以传递给前端/调用者的任何数据
        const review = interrupt({
            question: "允许 AI 调用工具吗?",
            tool_call: lastMessage.tool_calls[0]
        });
        
        // ⚠️ 代码执行到这里会立即停止,状态被保存
        // 只有当图被"恢复"时,才会继续执行下面的代码
        
        // review 变量将包含人类在恢复时传入的数据
        if (review === 'approve') {
            return 'tools'; // 批准,去执行工具
        } else {
            return END;     // 拒绝,结束流程
        }
    }
    
    return END;
}

3️⃣ 恢复执行 (Resume)

当图处于中断状态时,我们需要使用 Command 对象告知 LangGraph 继续执行,并传入人类的反馈。

import { Command } from '@langchain/langgraph';

// 1. 第一次运行:触发中断
// 必须要传入 checkpointer 和 thread_id
await graph.invoke({ messages: [input] }, config);
console.log("图已暂停,等待审批...");

// ... 这里可以是等待 API 请求,或者前端用户的点击 ...

// 2. 恢复执行
// 使用相同的 input(或 null)和 config
// 传入 Command 对象,resume 字段的值会被赋给 interrupt 函数的返回值
await graph.invoke(
    new Command({ resume: 'approve' }), 
    config
);

4️⃣ 完整流程图解

5️⃣ 关键点:状态持久化

Human-in-the-loop 严重依赖 Checkpointer。因为在“暂停”和“恢复”之间,程序可能会重启,服务器可能会断开连接。只有通过 Checkpointer 将状态持久化到数据库,我们才能随时随地通过 thread_id 找回那个“暂停的瞬间”并继续执行。

💡 练习题

  1. 实操题:修改示例代码,使 Human-in-the-loop 更加智能:如果用户拒绝(resume: 'reject'),不是直接结束,而是将“用户拒绝了操作”这条消息添加进 history,并让 LLM 重新尝试生成回复(回到 agent 节点)。

📚 参考资源

官方文档

项目代码


✅ 总结

核心要点

  • interrupt 用于暂停,Command({ resume }) 用于恢复。
  • 暂停时,interrupt 的返回值尚未确定;恢复时,resume 的值成为返回值。
  • 这种机制使得我们可以构建长时间运行、可异步交互的复杂业务流程。

恭喜! 你已经完成了 LangGraph Quick Start 系列课程的学习。现在的你已经掌握了构建复杂、有状态、智能 Agent 应用的所有核心积木。去创造属于你的超级智能体吧!

登录以继续阅读

解锁完整文档、代码示例及更多高级功能。

立即登录

On this page