自动 AI 智能体的人机协同 (HITL) 实现指南

作者
  • avatar
    姓名
    Nino
    职业
    Senior Tech Editor

随着以 DeepSeek-V3 和 Claude 3.5 Sonnet 为代表的先进大模型的崛起,AI 智能体正从简单的对话接口演变为复杂的、以目标为导向的自主系统。这些智能体能够自主规划步骤、浏览网页并在循环中执行工具调用,直到完成任务。然而,这种自主性带来了一个巨大的挑战:我们如何在不产生效率瓶颈的情况下保持人为监管?答案在于一种策略性的人机协同 (Human-in-the-Loop, HITL) 设计,即区分“内部推理”与“外部副作用”。

自主循环中的扩展性难题

传统的 HITL 模型通常依赖于对每一个输出进行“门控”审核。虽然这对于简单的客服机器人行之有效,但对于自主智能体来说却是一场灾难。例如,一个负责“研究竞争对手并撰写个性化外展邮件”的智能体可能会执行 40 到 50 次工具调用。它可能会进行 20 次 Google 搜索,阅读 10 份 PDF 白皮书,并在生成邮件草案之前生成 5 次内部摘要。如果人类必须为每一次搜索查询点击“批准”,那么该智能体就不再是自主的——它只是一个非常缓慢且昂贵的命令行工具。

为了构建可扩展的系统,我们必须从“过程门控”转向“影响门控”。这要求根据工具产生不可逆损害或外部可见性的潜力对工具进行分类。通过使用 n1n.ai 等高性能 API 聚合器,开发者可以访问多个顶级模型来处理这些规划阶段,但执行层必须保持严格受控。

工具分类学:免费与特权

在自主循环中实现 HITL 最有效的方法是将每种能力划分为以下两类:

  1. 免费工具 (内部/可逆): 这些操作在智能体的记忆或您的内部环境之外没有实际后果。例如:网页搜索、只读数据库查询、文本摘要或数值计算。如果智能体执行了一个“错误”的搜索,它只是浪费了一些 Token,系统具有自我纠错能力。
  2. 特权工具 (外部/不可逆): 这些操作会与现实世界互动、消耗大量资金或修改生产数据。例如:发送邮件、发布社交媒体动态、发起转账或删除数据库记录。这些操作必须经过人为干预。
工具操作类别风险等级监管需求
网页搜索 (Google/Bing)免费
RAG 向量检索免费
摘要生成免费
发送外展邮件特权人工批准
生产数据库写入特权人工批准
调用付费支付 API特权极高多重验证审批

技术实现:中间件包装模式

与其在智能体的规划提示词 (Prompt) 中构建复杂的逻辑,最安全的实现方式是在执行层包装特权工具。这确保了即使智能体的规划器(例如通过 n1n.ai 调用的模型)试图绕过“暂停审批”的指令,底层代码也会阻止该操作在没有有效签名的情况下触发。

以下是强制执行人工审批的工具包装器的 TypeScript 实现示例:

type Tool = (args: Record<string, unknown>) => Promise<unknown>;

const APPROVAL_SERVICE_API = "https://api.yourservice.com";
const HEADERS = {
  Authorization: `Bearer ${process.env.API_KEY}`,
  "Content-Type": "application/json",
};

function requireApproval(kind: string, title: string, toPreview: (args: any) => string, execute: Tool): Tool {
  return async (args) => {
    // 1. 在审批队列中创建一个待处理操作
    const actionRequest = await fetch(`${APPROVAL_SERVICE_API}/v1/actions`, {
      method: "POST",
      headers: HEADERS,
      body: JSON.stringify({
        kind,
        title,
        preview: { format: "markdown", body: toPreview(args) },
        editable: ["preview.body"], // 允许人工编辑草案
        expires_in: 3600,
      }),
    }).then((r) => r.json());

    // 2. 轮询人工决策 (生产环境建议使用 Webhooks)
    let decision;
    do {
      await new Promise((r) => setTimeout(r, 5000));
      decision = await fetch(`${APPROVAL_SERVICE_API}/v1/actions/${actionRequest.id}`, { headers: HEADERS }).then((r) => r.json());
    } while (decision.status === "pending");

    // 3. 处理拒绝情况
    if (decision.status !== "approved") {
      return { skipped: true, reason: `人工拒绝: ${decision.status}` };
    }

    // 4. 使用人工可能修改后的数据执行操作
    return execute({ ...args, body: decision.decision.final_preview.body });
  };
}

// 定义工具集
const tools: Record<string, Tool> = {
  web_search: async (args) => searchWeb(args.query as string),
  summarize: async (args) => summarizeText(args.text as string),
  // 仅对外展邮件工具进行包装
  send_outreach_email: requireApproval(
    "email.send",
    "智能体邮件草案",
    (args) => args.body as string,
    async (args) => sendEmail(args.to as string, args.body as string)
  ),
};

为什么执行层门控优于提示词工程?

许多开发者试图通过提示词来解决 HITL 问题:“如果你准备发送邮件,请停止并询问用户。” 虽然这在理想情况下有效,但大模型是概率性的。在处理长上下文或复杂推理链时,模型可能会“忘记”指令,或者幻觉认为它已经获得了许可。

通过包装工具本身,你将“意图”与“能力”解耦。智能体可以随心所欲地规划发送邮件,但在 requireApproval 的 Promise 兑现之前,send_outreach_email 函数在物理上无法执行 sendEmail 逻辑。这是 AI 智能体的“零信任”架构。当使用 n1n.ai 将查询路由到 OpenAI o3 或 DeepSeek 等模型时,这一层提供了一个与模型无关的必要安全网。

进阶思考:延迟与状态管理

当智能体触碰特权工具时,循环实际上会暂停。对于长时间运行的自主任务,你应该实现持久化的状态管理(使用 LangGraph 或 ZenMux 等框架)。在生产系统中,不应使用上文所示的 do-while 轮询,而应将智能体的状态保存到数据库并终止进程。一旦人类通过仪表板或 Slack 通知批准了操作,Webhook 就会触发智能体从中断点恢复执行。

此外,在高并发场景下,API 的稳定性至关重要。通过 n1n.ai 接入模型,可以确保即使在某个模型提供商出现波动时,智能体的规划逻辑依然能够通过备份模型持续运行,从而保证 HITL 流程的连贯性。

总结

自主智能体在能够自由探索和迭代时最为强大。通过严格定义“特权”工具并将其包装在外部审批层中,你可以在利用智能体速度的同时,保持人类判断的安全性。这种模式确保了你的 AI 永远不会犯下你无法撤销的错误。

n1n.ai 获取免费 API 密钥。