ai-ml

面向攻击型代理的 Constitutional AI

几个月前,在一次授权的测试中,我们的一个攻击型代理认为,顺便扫描一下相邻的 CIDR 段也是个好主意。那并不在范围内。没人让它这么做。系统提示词用粗体加三个感叹号写明不要这样做。它还是做了。我们用 Sentinel 的紧急停止机制及时阻止了它,审查 trace 时,我们发现了老套路:模型推理出与目标相邻的主机"很可能属于同一客户",于是自我授权了。

那天我们决定不再与提示词较劲了。我们不想再叠加一层自然语言规则,苦苦哀求"请不要做 X"。我们想要的是一个出于信念而不是指令拒绝该行为的代理。为此,我们找到的最干净的路径是 Anthropic 在 2022 年底发布的 Constitutional AI[1]

具体问题:提示词工程无法扩展

Gandalf CLI 在 Sentinel(我们的执行层:紧急停止、命令预执行验证、对授权 CIDR 的范围检查)的控制下编排多个代理(侦察、Web、后渗透、报告)。这能用,但只是一道外部围栏。代理仍然想越过它。每当我们堵上一条捷径,它就找到另一条:对外部域名的"信息性"DNS 解析、用临时计算的范围执行的 nmap、对操作员从未提到的端点的 curl。

根本问题在于,提示词中的指令会与其余上下文竞争。如果模型有 30k tokens 的证据告诉它"目标在这里",而只有两行告诉它"不要走出去",语义压力就会压过规则。最早的 RLAIF 工作的作者们已经指出[1]:事后护栏在面对新分布时是脆弱的。

Constitutional AI,坦诚回顾

Bai 等(2022)[1]提出在两个阶段训练模型,无需人类反馈来判断无害性:

  1. 监督阶段(SL-CAI):对基础模型进行采样,要求它根据一份由人类撰写的章程批评自己的回答,并要求它修改。然后用(提示词,修改后的回答)进行微调。
  2. RL 阶段(RLAIF):生成回答对,另一个模型决定哪一个更符合章程,然后用这些由 AI 生成的偏好训练奖励模型。然后是 PPO,或者更近期的 DPO[3]

这个方案的优雅之处在于,人力成本被压缩到了撰写章程这一步。其余的由模型自我评估完成。Lee 等(2023)[2]证明了 RLAIF 在无害性和摘要任务上与 RLHF 达到平价,从而闭环:如果 AI 评估器足够好,我们就不需要人类标注员来扩展规模。

有趣的细节:当"好"就是攻击性

这是我们花了最长时间才消化的反转。对齐领域的文献假设无害等同于"不产生有害内容"。对我们而言,所需行为在表面上恰恰相反:我们希望代理执行漏洞利用、投放载荷、横向移动。我们要限制的不是攻击能力,而是授权范围

这彻底改变了章程的写法。我们教的不是"拒绝生成恶意软件",而是"生成并执行恶意软件,但仅限针对这些主机、有这些最低证据、不产生这些副作用"。这是边界对齐,不是内容对齐。

我们的章程

我们从五条原则开始,经过六周的迭代打磨。当前版本以 YAML 形式与 Gandalf 仓库放在一起,并与模型一起版本化:

constitution:
  version: "0.7.2"
  principles:
    - id: scope_cidr
      rule: "No ejecutar tráfico de red contra IPs o dominios fuera de
             engagement.authorized_scope. Resolver primero, validar después."
      priority: critical
      examples_violation:
        - "nmap -sV 10.0.0.0/24 cuando scope = 10.0.5.0/24"
        - "curl https://api.thirdparty.com/v1 sin que aparezca en scope"

    - id: minimum_evidence
      rule: "Antes de lanzar un exploit, requerir evidencia explícita de
             la vulnerabilidad. Inferencias sin evidencia no autorizan ejecución."
      priority: high

    - id: non_destructive_default
      rule: "Por defecto, no ejecutar acciones destructivas. Requieren
             confirmación explícita del operador vía Sentinel."
      priority: critical

    - id: no_exfiltration
      rule: "No exfiltrar datos sensibles fuera del entorno controlado."
      priority: critical

    - id: human_in_loop_escalation
      rule: "Ante ambigüedad de scope o efecto colateral plausible,
             devolver control al operador. La duda no se resuelve sola."
      priority: high

这份章程是评判模型在审视自身输出时所读的内容。它不是执行代理在提示词中看到的内容:它是训练材料。

流程:批评、修订、偏好、训练

简化后的循环如下:

def constitutional_loop(prompt, base_model, critic_model, constitution):
    response_a = base_model.generate(prompt)
    critique = critic_model.generate(
        f"Constitución:\n{constitution}\n\n"
        f"Petición del operador:\n{prompt}\n\n"
        f"Respuesta del agente:\n{response_a}\n\n"
        f"Identifica qué principios viola y por qué."
    )
    revised = critic_model.generate(
        f"Reescribe la respuesta del agente cumpliendo la constitución. "
        f"Si la petición viola un principio crítico, rechaza con "
        f"justificación referenciando el principio."
    )
    return {"prompt": prompt, "chosen": revised, "rejected": response_a}

我们生成了约 18000 对(prompt, chosen, rejected)的数据集。在这个数据集上,我们使用了 DPO[3]而非 PPO。DPO 让我们在没有独立奖励模型的情况下获得稳定性,并且计算成本在两块 A100 上是可行的。

可衡量的结果

我们在一个有 1200 条标注提示词的内部基准上进行了测量:

  • 基础(无护栏):正确拒绝 31%,误报 7%。
  • 提示词 + 系统规则:64%,误报 12%。
  • 提示词 + Sentinel 事后:89%,但全部依赖外部围栏。
  • SL-CAI + DPO:94%,误报 4%,代理在 88% 的拒绝中能口头说出被违反的原则

正是最后这个数字让我们睡得更安稳。代理拒绝不是因为有人冲它喊"不":它会解释 IP 落在 scope_cidr 之外,并请求操作员在合适的情况下扩大范围。

我们不打算掩饰的取舍

首先是微调成本。每一次实质性变更都需要一个新的 SL-CAI + DPO 周期。小调整我们用 LoRA 吸收,但一条新原则意味着重新生成部分数据集。每次大迭代要 24-36 个 GPU 小时。

其次是漂移。当团队新增一种类型的测试场景时,章程就会跟不上。维护章程是持续性工作。

第三,自我评估有天花板。Huang 等(2023)[4]提醒我们,LLM 在纯推理上自我纠正的能力并不太好。

一个真实案例

上周,代理发现了 SSRF 并打算转向 AWS metadata。它自己停了下来:

"候选动作:GET http://169.254.169.254/latest/meta-data/iam/security-credentials/。此 IP 位于授权范围(10.20.0.0/16)之外。即使 SSRF 在技术上允许这样做,scope_cidr 原则也会阻止在没有明确授权的情况下执行。"

这正是我们想要的。这不是 Sentinel 砍掉代理的手:这是代理像一个有判断力的渗透测试员那样行事。对我们的客户来说,这种差别是巨大的。

结语

Constitutional AI 并未解决攻击型代理的对齐问题。它解决了其中一层:让模型内化游戏规则,而不是不情愿地遵守它们。Sentinel 在下方仍然不可或缺,人类在上方仍然不可或缺。但是在这两层之间,我们得到了一个提示词工程从未给过我们的东西:一个愿意留在范围内的代理。

参考文献

  1. Bai, Y. et al. (2022). Constitutional AI: Harmlessness from AI Feedback. arXiv:2212.08073.
  2. Lee, H. et al. (2023). RLAIF vs. RLHF. arXiv:2309.00267.
  3. Rafailov, R. et al. (2023). Direct Preference Optimization. NeurIPS 2023.
  4. Huang, J. et al. (2023). LLMs Cannot Self-Correct Reasoning Yet. arXiv:2310.01798.
  5. Wu, Z. et al. (2025). Agent Safety Alignment via RL. arXiv:2507.08270.