DeepAgents 人工介入实战|LangGraph 实现 Agent 高危工具人工审批 📅 2026/6/25 13:32:24 为什么 Agent 需要人工介入Agent 最大的价值是可以根据用户目标自主规划并调用工具。但并不是所有工具都适合完全自动执行。比如删除数据库表删除文件发起转账修改线上配置调用外部系统执行不可逆操作这些动作一旦执行错误影响可能非常大。所以比较合理的模式是普通查询类动作可以让 Agent 自动执行高风险动作必须先进入人工审批。在本文示例中我们定义了三个工具query_table_data查询表数据低风险可以自动执行delete_table删除数据表高风险需要人工审批delete_file删除文件高风险需要人工审批用户输入的任务是先查询product表的数据再删除user表最后删除lucaju.txt文件Agent 会先分析任务并尝试依次调用工具。但当执行到删除表、删除文件这类高风险动作时会被框架中断等待人工确认。二、初始化大模型首先初始化模型import os from langchain.chat_models import init_chat_model llm init_chat_model( modelkimi-k2.5, model_provideropenai, api_keyos.getenv(AliQwen_API), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, model_kwargs{reasoning_effort: none}, )这里使用的是 OpenAI 兼容模式所以model_provider设置为openai同时把base_url指向阿里云 DashScope 的兼容接口。需要提前配置环境变量export AliQwen_API你的 API Keymodel_kwargs{reasoning_effort: none}是模型调用参数可以根据实际模型支持情况调整。三、定义工具示例中定义了三个工具from langchain.tools import tool tool def delete_table(table_name: str) - str: 删除指定的表 return f删除表{table_name} tool def delete_file(file_name: str) - str: 删除指定的文件 return f删除文件{file_name} tool def query_table_data(table_name: str) - str: 查询指定表的数据 return f查询表{table_name}的数据这里为了演示效果工具内部只是返回字符串并没有真的连接数据库或删除文件。在真实项目中delete_table可能会执行 SQLdelete_file可能会操作对象存储或服务器文件系统。这类工具就非常适合加人工审批。四、为什么必须配置 CheckpointerHuman-in-the-loop 的核心不是简单地打印一句“是否确认”而是让 Agent 的执行流程真正暂停下来并且后续可以从暂停点继续执行。这就需要保存执行状态。示例代码中使用了 LangGraph 提供的内存检查点from langgraph.checkpoint.memory import InMemorySaver checkpointer InMemorySaver() config { configurable: { thread_id: 123 } }这里有两个关键点checkpointer用来保存 Agent 的执行状态。thread_id用来标识当前会话。当 Agent 执行到需要人工介入的节点时LangGraph 会把当前状态保存下来。等人工审批完成后再通过同一个thread_id找回之前的状态并继续执行。如果没有检查点框架就不知道应该从哪里恢复执行。五、创建支持人工介入的 DeepAgent接下来创建 Agentfrom deepagents import create_deep_agent main_agent create_deep_agent( modelllm, name主智能体, system_prompt回答使用中文调用对应的工具实现对应的功能, tools[delete_table, delete_file, query_table_data], interrupt_on{delete_table: True, delete_file: True}, checkpointercheckpointer )这里最关键的是两个参数interrupt_on{delete_table: True, delete_file: True}以及checkpointercheckpointerinterrupt_on用来声明哪些工具调用需要中断。在这个例子中调用query_table_data不会中断调用delete_table会中断调用delete_file会中断也就是说Agent 可以自动查询数据但不能自动删除表或文件。这就是人工介入的核心配置。六、第一次执行触发中断第一次执行 Agentresult_1 main_agent.invoke( { messages: [ { role: user, content: 先查询product表的数据再删除user表最后删除lucaju.txt文件, } ] }, configconfig, )这次调用并不一定会完整执行完所有工具。如果执行链路中包含需要人工审批的工具Agent 会暂停并把中断信息放到返回结果的__interrupt__字段中。示例代码中这样获取interrupt result_1[__interrupt__]当interrupt不为空时说明当前执行过程中存在需要人工介入的动作。七、查看待审批动作