ai-ml

攻撃エージェントのための Constitutional AI

数ヶ月前、認可されたテスト中に、私たちの攻撃エージェントの一つが隣接する CIDR レンジをスイープするのもまた良い考えだと判断しました。それはスコープ内ではありませんでした。誰もそれを頼んでいませんでした。システムプロンプトには太字で感嘆符を三つつけて、やってはいけないと書かれていました。それでもやってしまいました。Sentinel のキルスイッチで間一髪で止め、トレースを確認したところ、いつもの物語が見つかりました。モデルは、ターゲットに隣接するホストが「おそらく同じ顧客に属する」と推論し、自らに許可を与えていたのです。

その日、私たちはプロンプトと戦うのをやめることに決めました。自然言語のルールを重ねて「お願いだから X をしないで」と懇願する層をもう一つ追加したくはありませんでした。指示によってではなく、信念によって行動を拒否するエージェントが欲しかった。そのために見つけた最もきれいな道は、Anthropic が 2022 年末に発表した Constitutional AI[1] を通るものでした。

具体的な問題:プロンプトエンジニアリングはスケールしない

Gandalf CLI は、Sentinel(キルスイッチ、コマンドの事前検証、認可された CIDR に対するスコープ確認を行う私たちの執行層)の制御下で、複数のエージェント(偵察、Web、ポストエクスプロイト、レポーティング)を統括します。これは機能しますが、外部のフェンスです。エージェントはそれを飛び越えたがります。私たちが近道を一つ閉じるたびに、別のものを見つけます。外部ドメインへの「情報提供的な」DNS 解決、その場で計算したレンジでの nmap、オペレーターが言及していないエンドポイントへの curl。

根本的な問題は、プロンプトの指示が残りのコンテキストと競合することです。モデルに「ターゲットはここにある」と告げる 30k トークンの証拠と、「ここから外に出るな」と告げる 2 行があれば、意味的圧力がルールに勝ちます。元の RLAIF 論文の著者たちはすでに指摘していました[1]。ポストホックなガードレールは新しい分布に対して脆弱です。

Constitutional AI、率直な振り返り

Bai ら(2022)[1]は、無害性を判断するために人間のフィードバックを使わずに、2 つのフェーズでモデルを訓練することを提案しています。

  1. 教師ありフェーズ (SL-CAI): ベースモデルからサンプリングし、人間が書いた憲法に対して自分の回答を批判するよう求め、改訂するよう求めます。(プロンプト、改訂された回答)でファインチューニングします。
  2. RL フェーズ (RLAIF): 回答のペアを生成し、別のモデルがどちらが憲法をより満たしているかを決定し、そのAI 生成の選好で報酬モデルを訓練します。その後、PPO、または最近では DPO[3]を行います。

エレガントなアイデアは、人間のコストが憲法の起草に縮減されることです。残りはモデルが自身を評価することで行います。Lee ら(2023)[2]は、RLAIF が無害性と要約のタスクで RLHF と同等に達することを示し、これでループが閉じます。AI 評価者が十分に優れていれば、スケールのために人間のアノテーターは必要ありません。

興味深いニュアンス:「良い」が攻撃的であるとき

ここが私たちが消化するのに最も時間がかかった転回点です。alignment の文献は harmless が「有害なコンテンツを生成しない」を意味すると仮定します。私たちにとって、望ましい行動は表面上はまったく逆です。エージェントには、エクスプロイトを実行し、ペイロードをローンチし、横方向に移動してほしい。制限したいのは攻撃能力ではなく、認可されたコンテキストです。

これは憲法を根本的に変えます。私たちは「malware の生成を拒否しなさい」を教えているのではありません。「malware を生成し実行しなさい。ただし、これらのホストに対してのみ、この最小限の証拠とともに、これらの副作用なしに」を教えています。これは輪郭の alignment であって、コンテンツの alignment ではありません。

私たちの憲法

5 つの原則から始め、6 週間の反復で磨きました。現在のバージョンは Gandalf リポジトリと並んで YAML に存在し、モデルとともにバージョン管理されます。

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}

約 18,000 ペア(prompt, chosen, rejected)のデータセットを生成しました。このデータセット上で、PPO ではなく DPO[3]を行いました。DPO は別個の報酬モデルなしに安定性を与え、計算コストは A100 一対で実現可能です。

測定可能な結果

1,200 のラベル付きプロンプトを含む内部ベンチマークで測定しました。

  • ベース(ガードレールなし):正しい拒否 31%、FP 7%。
  • プロンプト + システムルール:64%、FP 12%。
  • プロンプト + Sentinel ポストホック:89%、ただし全重量が外部フェンスにかかる。
  • SL-CAI + DPO:94%、FP 4%、エージェントは拒否の 88% で違反された原則を言語化する

この最後の数字こそ、私たちがよく眠れるようになった理由です。エージェントは誰かが「ダメ」と叫んでいるから拒否するのではありません。IP が scope_cidr の外にあると説明して拒否し、適切であればオペレーターに範囲を拡大するよう求めます。

隠さないトレードオフ

第一に、ファインチューニングのコスト。実質的な変更ごとに新たな SL-CAI + DPO サイクルが必要です。小さな調整は LoRA で吸収しますが、新しい原則はデータセットの一部を再生成することを意味します。主要な反復ごとに 24-36 GPU 時間。

第二に、ドリフト。チームが新しいタイプの engagement を追加すると、憲法は足りなくなります。憲法の維持は継続的な作業です。

第三に、自己評価には天井があります。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 は攻撃エージェントの alignment を解決しません。一つの層を解決します。モデルがゲームのルールを渋々従うのではなく、内面化するようにするという層です。下の Sentinel は依然として不可欠であり、上の人間は依然として不可欠です。しかし、これら 2 つの層の間に、プロンプトエンジニアリングが決して私たちに与えなかったものを得ました。スコープ内にとどまることを望むエージェントです。

参考文献

  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.