AI・生成AI

AIエージェントを業務に組み込むときの設計論点 — 権限・可観測性・停止条件

AIが自分でツールを呼んで作業を進める構成が実用段階に入りました。
デモは驚くほど簡単に動きますが、業務に載せるときに必ず決めるべきことがあります。

1. 権限をどこまで渡すか

最大の論点です。エージェントに渡すツールは、そのまま攻撃面になります。

読み取り専用   … 検索、参照、集計
書き込みあり   … 登録、更新
不可逆         … 削除、送信、決済

不可逆な操作は、原則としてエージェントに渡しません。
渡す場合も「下書きを作るまで」に留め、実行は人が承認します。

TOOLS = {
    "search_orders":  {"auto": True},              # そのまま実行
    "draft_reply":    {"auto": True},              # 下書きまで
    "send_email":     {"auto": False},             # 人の承認が必要
    "delete_record":  None,                        # 渡さない
}

2. 何をしたかを追えるようにする

エージェントは判断過程が見えにくいので、後から追える記録が必須です。

class AgentStep(models.Model):
    run_id = models.CharField(max_length=32, db_index=True)
    step_no = models.IntegerField()
    tool = models.CharField(max_length=60)
    arguments = models.JSONField()
    result_summary = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

「なぜこの結果になったか」を説明できないと、業務では使えません。
問い合わせが来たときに答えられる状態を、最初から作っておきます。

3. 止まる条件を必ず入れる

エージェントは同じ失敗を繰り返すことがあります。
明示的な停止条件が無いと、API 費用だけが増え続けます。

MAX_STEPS = 15
MAX_COST_YEN = 50
MAX_SAME_TOOL_REPEAT = 3

if step_no > MAX_STEPS or spent > MAX_COST_YEN:
    stop("上限に到達しました")
if same_tool_count >= MAX_SAME_TOOL_REPEAT:
    stop("同じ操作を繰り返しています")

3つ目の「同じツールを繰り返している」検知が、実務では特に効きました。
無限ループの大半はこの形で現れます。

精度を上げる前に、失敗の受け止め方を決める

「精度を上げる」議論に入りがちですが、実務でより重要なのは
失敗したときにどうなるかです。

  • 失敗を検知できるか
  • 失敗しても被害が出ない範囲に収まっているか
  • 人が引き取れる形で止まるか

この3つが成立していれば、精度が完璧でなくても業務に載せられます。
逆にここが無いと、精度がいくら高くても載せられません。

使いどころの見極め

向いているのは、探索と整理の作業です。

  • 大量の資料から該当箇所を探す
  • 下書きを複数案作る
  • 分類・タグ付けの候補を出す

向いていないのは、唯一の正解がある処理です。
それはコードで書いたほうが速く、確実で、安く済みます。

まとめ

  • 不可逆な操作は渡さない。渡すなら人の承認を挟む
  • 全ステップを記録し、判断過程を説明できるようにする
  • 上限(回数・費用・同一操作の繰り返し)を必ず入れる
  • 精度より先に「失敗したときの受け止め方」を設計する