powered by TechFeed
表示モード
Microsoft

MicrosoftがAIエージェントのガードレールを統一する仕様「Agent Hooks」を公開 — 「ルールを書いた」のに「ルールが効かない」問題に構造で対処

8月28日、Microsoftが「Agent Hooks: An open, framework-neutral AI governance contract」と題した記事を公開した。AIエージェントのガバナンスをフレームワーク横断で統一する仕様「Agent Hooks」の設計と実装について詳しく紹介されている。

8月28日、Microsoftが「Agent Hooks: An open, framework-neutral AI governance contract」と題した記事を公開した。AIエージェントのガバナンスをフレームワーク横断で統一する仕様「Agent Hooks」の設計と実装について詳しく紹介されている。


Agent Hooksが保護しないもの(先に知っておくべき限界)

記事はAgent Hooksの限界についても明示的に述べている。先に把握しておくと、以降の設計意図がより正確に読める。

  • 協調的な契約であり、セキュリティ境界ではない。ホストフレームワークは完全に信頼される前提で、インターセプターはインプロセスで動作する
  • 悪意あるホストやバグのあるホストがポイントをスキップしたり判定を無視したりしても、コンフォーマンスキットはそれを検出できない
  • サーバーサイドのツール実行(ホスト型コードインタープリター等)はツールの縫い目でインターセプトできず、post_model_call で補足するしかない

「ホックレイヤーは協調するフレームワークが何をするかを統制する。敵対的・非信頼コードの封じ込めはサンドボックスの仕事であり、Agent Hooksはサンドボックスではない」と仕様に規範的な言語で記載されている。


「ガードレールを書いた」≠「ガードレールが効いている」

AIエージェントの本番運用が現実になるにつれて、見えてきた問題がある。ポリシーの強制が「書いた」と「動いた」の間で静かに失敗することだ。

記事が示す具体例はわかりやすい。カスタマーサポートエージェントに「500ドル超の返金は人間の承認が必要」というルールを設定した。フレームワークのドキュメント通りにコールバックを実装した。しかし四半期末に発覚したのは、裁量返金予算を大幅に超過した損失だった。

原因の分析結果は3点:

  • ガードがリクエストの異常でexceptionを投げた → フレームワークがそれをキャッチし、警告をログに残して返金を実行した(デフォルト動作)
  • バッチ処理の入力経路にはコールバック自体が一切接続されておらず、出力スキャナーもそのパスを見ていなかった
  • ガードが実際に何を評価したかを示す証跡が残っておらず、監査不能だった

「誰も指示に反したことをしていない。指示が問題だった」と記事は指摘する。


主要フレームワークのガバナンス面の実態

Microsoftは主要フレームワークのインターセプト機構を調査した。

フレームワーク イベント数 アクションの停止 失敗時の動作
LangChain 20 不可(戻り値無視) デフォルトで握りつぶし
CrewAI 78 不可(観測のみ)
LlamaIndex 不可(テレメトリ設計)
OpenAI Agents SDK 7 可(ただし入力ガードと初回モデル呼び出しが並行して起動するため競合が生じうる) フラグ依存
Semantic Kernel 3 DI登録時の実行順序は未保証

どのフレームワークも「denyが確実にアクションを止める」ことを検証できるコンフォーマンスキット(仕様への適合性をテストするテストスイート)を提供していない。すべての保証はフレームワーク固有の「暗黙知」に依存している、というのが調査の結論だ。


Agent Hooks:M×NをM+Nにする

今回公開された**Agent Hooks(仕様名:AGENT-HOOKS-0.1)**は、この問題に対する構造的な回答だ。

設計は意図的にシンプルに抑えられている:

  • 8つのインターセプトポイントagent_startup / input / pre_model_call / post_model_call / pre_tool_call / post_tool_call / output / agent_shutdown
  • 1つのコンテキストペイロード(AgentContext)
  • 3つの判定(allow / deny / transform)
  • ホスト(フレームワーク)側の義務を規範的に定義

コントロール(ガードレール)は1回書けば複数フレームワークで動く。フレームワークは1回実装すればあらゆるコントロールを受け入れられる。従来のM×Nアダプター行列がM+Nになる。

SDKはPython / TypeScript / .NET / Rust / Goの5言語で提供、47シナリオのコンフォーマンスキットが付属し、「対応している」という主張をテスト可能な事実にする。ポリシー評価エンジンとして外部プロセス連携に使われる**RegoOPA:Open Policy Agentのポリシー記述言語)**のインプロセス評価にも対応している(詳細はパフォーマンスの節を参照)。


実装例

冒頭の返金問題を解決するインターセプターは数行だ:

from agent_hooks import Interceptor, Verdict

class RefundGuard(Interceptor):
    def intercept(self, context) -> Verdict:
        if context["interception_point"] != "pre_tool_call":
            return Verdict.allow()
        call = context["tool_call"]
        if call["name"] == "issue_refund" and call["args"]["amount"] > 500:
            return Verdict.escalate(reason="refund_over_limit", message="requires human approval")
        return Verdict.allow()

Microsoft Agent Frameworkへの組み込みはファクトリー呼び出し1行で完結する:

pip install agent-framework-core[agent-hooks]
agent = Agent(
    client=client,
    tools=[issue_refund],
    middleware=[create_agent_hooks_middleware([RefundGuard()])]
)

「コントラクトの一部だけをインストールして全部あると思い込む」ことが構造的に不可能になっている点が重要だ。


承認の偽造を型で防ぐ

設計上のこだわりが出ているのが承認ブロックの仕組みだ。

エスカレーション(deny + 承認要求)には context_identity としてSHA-256ハッシュが付与される。このハッシュは「承認者が実際に見た内容」の正規化JSONから計算される。承認の解決時にはこのIDを一致させなければならない。

{
  "decision": "deny",
  "reason": "refund_over_limit",
  "message": "requires human approval",
  "approval": {
    "resolver": "host",
    "context_identity": "sha256:11f8bab5…"
  }
}

デモでは840ドルの返金申請を人間が承認した後、同じ承認トークンを使って8,400ドルの返金を試みるシナリオを検証している。内容が変わればハッシュが変わり、承認は無効になる。セッションへの承認ではなく、内容への承認という設計だ。

この検証をLangGraph / OpenAI Agents SDK / Semantic Kernel / LlamaIndex / CrewAI / Claude Agent SDK / Microsoft Agent Framework / リファレンスホストの8フレームワークで実行し、全フレームワークで同一の20行の決定ストリームが得られることを確認している。


パフォーマンスへの影響

気になるオーバーヘッドについても数値が示されている。

  • コントラクト機構自体(ID割り当て・ゲート参照・スコープ管理)のオーバーヘッド:コモディティハードウェアで約1マイクロ秒/実行。モデル呼び出しのコストに対してノイズレベル。
  • ポリシー評価を外部プロセスに委譲した場合:26.8ミリ秒/評価(プロセス起動コストが支配的)
  • RegoをインプロセスOPAエンジンで評価した場合:0.32ミリ秒/評価(約20回の決定でウォームアップ完了後)

ただし正直な注記もある。完全なフェールクローズド(フェールクローズドとは、障害発生時にデフォルトで動作を止める設計方針。対義語はフェールオープン=障害時に処理を通過させる)のストリーミングはバッファリングを要求する。最初のトークン出力前に出力判定を完了させる保証と、first-token latencyは両立しない。デフォルトはバッファードモードで、ストリーミングが必要なホスト向けには「宣言された境界公開インクリメンタルモード」をサポートする。


インストール

pip install agent-hooks-sdk          # Python
npm install @responsibleai/agent-hooks  # TypeScript
cargo add agent-hooks-sdk            # Rust
dotnet add package ResponsibleAI.AgentHooks  # .NET
go get github.com/responsibleai/agent-hooks/sdk/go/agenthooks  # Go

仕様・コンフォーマンスキット・ドキュメント・5言語SDKはすべて github.com/responsibleai/agent-hooks で公開されている。MicrosoftのAI責任原則の全体像についてはResponsible AIも参照されたい。


詳細はAgent Hooks: An open, framework-neutral AI governance contractを参照していただきたい。