コンテンツにスキップ

Risk-based Human Approval|リスクベース人間承認

一言で(TL;DR)

エージェントが実行しようとする操作をリスクスコア(不可逆性 × 失敗コスト)で3層に分類し、低リスクは自動実行、中〜高リスクは人間承認を経由、極高リスクは禁止とします。承認の要否を操作ごとに動的に判定することで、安全性とスループットを両立させます。

解決する問題

エージェントが外部システムに副作用を持つ操作を実行できる場合(F8)、すべてを自動実行すれば不可逆な損害が発生しえますし、すべてに人間承認を求めれば待ち時間で業務が止まります。LLM はハルシネーションにより誤った操作を選択する可能性があり(F4)、かつエージェントシステムは本質的に人間との協働が前提です(F17)。

このパターンが無いと、以下のいずれかに陥ります:

  • 全件承認:低リスクの読取操作にまで人間を介在させ、エージェントの価値(自動化による時短)が消失します。
  • 全件自動:本番DBの削除やメール送信など取り消せない操作まで自動実行し、障害発生時の影響が甚大になります。
  • 承認判断がプロンプト任せ:LLM に「危険だと思ったら聞いて」と指示しても、どの操作が危険かの判断自体が確率的でありすり抜けます。

選定条件(When to use / When NOT)

  • 使う条件
    • エージェントが書込・更新・削除・送信など副作用を伴う操作を実行できます。
    • [reversibility] が操作によって異なります(読取は可逆だが送信は不可逆、など)。
    • [failure_cost] が中〜高の操作が混在しており、一律のポリシーでは過剰か不足になります。
    • 人間がレビューに関与できる運用体制があり、[latency_budget] に承認待ち時間を組み込めます。
  • 使わない条件(=代替に倒す)
    • すべての操作が読取専用で副作用がない → C2 Read-Free / Write-Gated の Read-Free 側だけで十分です。
    • [failure_cost] が一律に低く、すべての操作が容易にロールバック可能 → 承認なしの自動実行+事後監査で済みます。
    • [latency_budget] が極めて短く(数秒以内)人間介在を許容できない → ドライラン+自動検証(C3)に倒します。

駆動変数とチューニング(程度)

目盛り 効かなすぎ ⇔ 効きすぎ 決め方 [駆動変数] 目安(出発点)
リスク層の閾値(auto/approval/forbidden の境界) 危険な操作が自動実行される ⇔ 安全な操作にも承認を要求しスループット低下 [reversibility] × [failure_cost] のマトリクスで機械的に分類 可逆+低コスト=auto、不可逆 or 高コスト=approval、不可逆+高コスト=forbidden
承認タイムアウト 無期限待ちでタスクが滞留 ⇔ 短すぎて承認者が間に合わない [latency_budget] から逆算。SLA の概ね 50-70% を承認待ちに割り当て 対話型: 2-5分、バッチ型: 1-24時間
リスク評価の粒度 操作単位が粗すぎて高リスク操作を見逃す ⇔ 細かすぎて分類の維持コスト過大 [failure_cost] が高い領域ほど細かく分類する ツール名 × パラメータの組み合わせ(例:delete は approval、read は auto)
承認者の多重度(何人に聞くか) 1人承認で見落とし ⇔ 多人数承認で待ち時間膨張 [failure_cost] が極めて高い操作ほど多重度を上げる 通常1人、金銭移動・本番変更は2人以上

相反における立ち位置(相反)

  • F-15 読取専用 vs 書込可能 → hybrid(Read自由・Writeはゲート)。本パターンはまさにこのハイブリッド戦略の実装であり、Read 操作は承認なしに自動実行し、Write 操作をリスクスコアで auto/approval/forbidden に仕分けます。[reversibility] が低い操作ほどゲートを厳しくします。

構造

flowchart TD
  Req[エージェントの操作要求] --> Classify[リスク分類エンジン]
  Classify -->|低リスク: auto| Exec[自動実行]
  Classify -->|中〜高リスク: approval| Queue[承認キュー]
  Classify -->|極高リスク: forbidden| Deny[拒否・ログ記録]
  Queue --> Human{人間レビュー}
  Human -->|承認| Exec
  Human -->|却下| Deny
  Human -->|条件付承認| Modify[パラメータ修正]
  Modify --> Exec
  Exec --> Log[実行結果 + 承認記録を監査ログ]
  Deny --> Log

実装メモ

リスク分類の最小実装(擬似コード):

from enum import Enum
from dataclasses import dataclass

class RiskTier(Enum):
    AUTO = "auto"
    APPROVAL = "approval"
    FORBIDDEN = "forbidden"

@dataclass
class RiskPolicy:
    tool: str
    action: str
    reversibility: float   # 0.0(不可逆)〜 1.0(完全可逆)
    failure_cost: float     # 0.0(無害)〜 1.0(致命的)

def classify_risk(policy: RiskPolicy) -> RiskTier:
    risk_score = (1 - policy.reversibility) * policy.failure_cost
    if risk_score >= 0.7:
        return RiskTier.FORBIDDEN
    elif risk_score >= 0.3:
        return RiskTier.APPROVAL
    else:
        return RiskTier.AUTO

リスクポリシーの設定例(YAML):

risk_policies:
  - tool: database
    action: select
    reversibility: 1.0
    failure_cost: 0.0
    tier: auto
  - tool: database
    action: update
    reversibility: 0.6      # WHERE句次第で部分復旧可能
    failure_cost: 0.5
    tier: approval
  - tool: database
    action: drop_table
    reversibility: 0.0
    failure_cost: 1.0
    tier: forbidden
  - tool: email
    action: send
    reversibility: 0.0      # 送信後の取消不能
    failure_cost: 0.4
    tier: approval

落とし穴:

  • リスク分類自体を LLM に任せないでください。分類は決定論的な殻(B1)の責務です。ツール名×アクション名の静的テーブルか、ポリシーエンジン(E2)で判定します。
  • 承認待ちの状態を永続化してください。承認キューに入った操作は耐久的な非同期セッション(A2)で状態を保持し、プロセス再起動でも消失しないようにします。
  • 承認タイムアウト後のデフォルトを安全側に倒してください。タイムアウトしたら自動承認ではなく自動却下にします。
  • 条件付き承認を設計に含めてください。承認者が「金額を1万円以下に修正して実行」のようにパラメータを変更して承認できると、却下→再提案のラウンドトリップを減らせます。

効かせる力学(forces)

  • F4(ハルシネーション):LLM が誤った操作を選択しても、高リスク操作は必ず人間承認を経由するため、ハルシネーションによる不可逆な損害を防止できます。
  • F8(ツール副作用):副作用の危険度をリスクスコアで定量化し、ゲートの厳しさを段階的に制御します。すべての副作用を一律に扱うのではなく、影響度に応じた最小限の摩擦を入れます。
  • F17(人間協働):人間の関与を「全件」でも「ゼロ」でもなく、リスクに応じて適切な頻度に調整します。人間は高リスク判断に集中でき、低リスク作業はエージェントに任せられます。

関連・代替

  • A2 耐久非同期エージェント:承認待ちの間セッション状態を永続化します。本パターンの承認キューは A2 の中断・再開メカニズムに依存します。
  • B1 決定論的な殻:リスク分類エンジンは殻の一部として実装します。分類ロジックに LLM を使いません。
  • C2 Read-Free / Write-Gated:本パターンの基盤となる Read/Write の分離です。Write 側のゲートをリスクスコアでさらに細分化したものが本パターンです。
  • C3 ドライラン/コミット:approval 層の操作に対し、承認前にドライラン結果を人間に提示する補強策です。
  • E5 自律性のはしご:エージェントの実績に応じてリスク閾値を動的に調整する上位パターンです。本パターンの閾値を固定ではなく昇格・降格可能にします。
  • G1 二層観測:承認・却下・自動実行の記録を監査ログとして観測基盤に流します。

コーディングエージェント向け指示(machine-actionable)

このパターンを人間に提案するなら、同時に以下を提案/確認してください:

  • [ ] [reversibility][failure_cost] を操作ごとに評価し、3層(auto/approval/forbidden)のマッピング表を具体化したか
  • [ ] 承認待ちの状態保持に A2 耐久非同期エージェント を併置したか
  • [ ] リスク分類を決定論的コード(B1 の殻)で実装し、LLM に分類判断を委ねていないか
  • [ ] approval 層に C3 ドライラン を組み合わせ、承認者に予測結果を提示する設計にしたか
  • [ ] 承認タイムアウト後のデフォルト動作を安全側(自動却下)に設定したか
  • [ ] 監査ログを G1 二層観測 に流す設計を含めたか
  • [ ] 目盛り(上表)の値を [駆動変数] から導き、理由を添えて提示したか
  • [ ] 将来的な閾値の動的調整が必要なら E5 自律性のはしご の採用を検討したか