Agent Mentor Learn
エージェントハーネスの基礎: ループと制御 · 第 5 回 / 全 6 回

レッスン5: 介入と操舵: 中断、方向転換、ヒューマン・イン・ザ・ループ

学習目標:

  • 自律的なループになぜ人間が要るのかを述べ、因果関係をはっきり示せる: 過剰なエージェンシーがあるからこそ、自律的なループほど手動のゲートを必要とする
  • 中断・操舵・承認を区別できる — それぞれがループのどこに切り込み、何を変えるのか
  • 高インパクトなアクションに対する人間の承認点を実行の前に置くか後に置くかを判断でき、「不可逆になる前に」という原則を述べられる

前提: レッスン3と4を終え、ループには停止条件があること、デッドループと空回りにはフォールバックが要ることを知っており、ハーネスをモデルを取り囲む制御コードとして理解していること | 前: レッスン4 << | 次: レッスン6 >>

最初の4つのレッスンはループ自体を管理した。このレッスンは人を入れる

ここまでで、あなたの手の中のループは走り、止まり、その下にフォールバックを備えています。レッスン3が明示的な停止条件を与え、レッスン4がデッドループと空回りを見分けて予算を燃やし尽くさない方法を教えました。これらの制御には共通点があります: 最初から最後まで、ハーネスがループと1対1で格闘しているだけで、誰も割って入っていません。

現実のエージェントが、誰にも見られずに最後まで走り切ることはめったにありません。タスクの途中で、全部を取りやめたくなるかもしれません — 方向がまるきり間違っているので、これ以上使わないでほしい。プロセスを止めずに目標だけ変えたくなるかもしれません: 「リファクタリングはやめて、まず本番のあのバグを見つけて直して」。あるいは、ある1つのステップだけは危険なので、実行される前に自分の目で見てうなずきたい。これらはどれもモデルが自分で決められることではなく、レッスン3と4の自動的な停止やフォールバックも届きません — これらはがループの外側から手を伸ばして行うことです。このレッスンはその層を扱います: 人間はどうやってループの途中に介入するのか、そしてその介入のコードはどこに置くべきなのか。

ループが自律的であるほど、人間によるゲートが要る

まず1つ片づけましょう: ループを自分で走らせるためにあれだけ手を尽くしたのに、なぜ人を戻すのでしょうか。

答えは「自律的」という言葉の裏側に隠れています。エージェントとは、ループの中でモデルが次に何をするか、どのツールを使うかを自分で決めるシステムです。その自律性こそが有用さの理由であり、そして危険さの理由でもあります。セキュリティの世界には、このリスクを指す名前があります: 過剰なエージェンシー(excessive agency)です。OWASP はこう述べています: "Excessive Agency is the vulnerability that enables damaging actions to be performed in response to unexpected, ambiguous, or manipulated outputs from an LLM, regardless of what is causing the LLM to malfunction."1(過剰なエージェンシーとは、LLM の誤動作の原因が何であれ、予期しない・曖昧な・操作された LLM の出力に反応して有害なアクションが実行されてしまう脆弱性である。)

この一文をループの上に重ねると、具体的になります。あるターンで、モデルはツールの返り値を読み違えるかもしれませんし、ユーザーの曖昧な一文を取り違えるかもしれませんし、読んだ Web ページに埋め込まれた悪意ある指示に引きずられるかもしれません。レッスン4の暴走モードが壊したのは、ループのリズムでした — 止まらない、その場で空回りする。ここで壊れるのはループのアクションです: 実際にやってはいけないことをやってしまいました。そしてループが持つ権限と自律性が大きいほど、たった1つの誤った判断がもたらす損害は大きくなります。だからハーネス自身の自動的なゲート — 停止条件、フォールバック — に加えて、誤りを取り消せない少数の地点には、もう1つのゲート、人間のゲートが必要です。アクションが着地する前に、人が「ちょっと待て」と言える機会を与えるためです。

これは自動化への不信ではありません。認識です。モデルは長い連続したターンにわたって走りうるのであり、Anthropic のガイダンスが言うとおりです: "The LLM will potentially operate for many turns, and you must have some level of trust in its decision-making."2(LLM は多くのターンにわたって動作しうるので、その意思決定をある程度は信頼しなければならない。)ただし信頼は、道中ずっと自由にさせることと同じではありません。信頼はほとんどのステップを自力で歩かせるためのものであり、人間のゲートは、曲がり方を間違えたら取り消せない少数の交差点を見張ります。

3種類の介入: 中断、操舵、承認

ループへ手を伸ばすことは、いつも「止めさせる」だけではありません。その後ループがどうなるかで分けると、3つの手があり、それぞれ切り込む地点も、変えるものも違います。

中断 — ループ全体を取りやめる。 3つの中でいちばん身も蓋もない手です: モデルがこのターンで何をしたがっていようと、ループは終了し、それ以上リクエストは出ません。レッスン3の停止条件に似ていますが、違いは引き金を引くのが誰かです。停止条件は、あらかじめ決めたルールによってハーネスが自分で手を引くこと。中断は、ループの外の人が手で停止を押すことです。方向がまるごと間違っていて、続けてもトークンを燃やすだけだと見て取れたときに使います。中断のあと、ループは終わりです — 「その後」はありません。

操舵 — 目標を変える、あるいは新しい指示を渡し、そのまま走らせ続ける。 これは何も終了させません。会話に人間の新しいメッセージを押し込み、モデルが次に傾ける先を変え、ループはその指示を持って進みます。たとえばエージェントがあるモジュールのリファクタリングを黙々と進めているときに、もっと緊急な本番バグを見つけたとします。プロセスを再起動せずに、こう放り込めます: 「リファクタリングは中断して、まずログインエンドポイントの 500 を突き止めて直して」。操舵が変えるのはループの目標であって、ループが生き延びるかどうかではありません。

承認 — 1つのステップに青信号を出す。うなずきがなければ、アクションもない。 最初の2つはループ全体に作用します。承認は特定の1つのアクションに作用します: ループが高インパクトな操作にたどり着くと停止し、「これからこれをやります」と提示し、人がイエスと言った場合にだけ実行します — ノーならスキップまたはキャンセルします。これは実のところ、非常に規律ある一時停止にすぎません: "Agents can then pause for human feedback at checkpoints or when encountering blockers."2(エージェントはチェックポイントで、あるいは障害に突き当たったときに、人間のフィードバックを待って一時停止できる。)承認とはそのチェックポイントを、危険なアクションのちょうど手前に正確に留めたものです。承認が通れば、ループは通常のリズムに戻ります。3つの中でいちばん日常的でもあり、常時オンにしておくのに最も向いています。

3つを取り違えないための1行: 中断はループが生きるかを決め、操舵はループがどこを向くかを決め、承認は1つのアクションが通るかを決めます。レッスン6の最小ハーネスは、承認が実際にコードとして書き込まれる場所です。

承認弁をループに書き込む: アクションが着地する前に止める

3つのうち、ハーネスのコードに宿る必要が最も強いのは承認です。中断と操舵はたいてい、人がターミナルに何か打ち込めば起動できます。承認は、ハーネスが正しい場所で能動的に止まって待つ形でなければなりません。省けば、ループは単に危険なことをやってのけます。

過剰なエージェンシーに対して OWASP が挙げる緩和策の一つは、こうです: "Utilise human-in-the-loop control to require a human to approve high-impact actions before they are taken."1(ヒューマン・イン・ザ・ループの制御を用い、高インパクトなアクションが実行される前に人間が承認することを必須にせよ。)この一文の順序に注目してください — 実行される前に承認する。承認が先、実行が後であって、先に実行してあとから署名を集めるのではありません。弁を物理的にどこへ置くかについて、この標準は幅を残しています: "This may be implemented in a downstream system (outside the scope of the LLM application) or within the LLM extension itself."1(これは下流のシステム(LLM アプリケーションの範囲外)で実装してもよいし、LLM の拡張自体の中で実装してもよい。)これを私たちのループに落とすと、自然な置き場所はツールのディスパッチです — 高インパクトと印を付けたツールが実際に呼ばれる直前に、一時停止を挿し込みます。

コードでは、ツールを実行する行の手前に置いた分岐になります:

3か所を見ておく価値があります。第一に、チェックは executeToolにあります — 一時停止はアクションが着地する前に起きなければならず、人間を待っているあいだ、危険な操作はまだ実行されていない必要があります。第二に、拒否は黙ってスキップされるのではなく、is_error を立てた tool_result を返します(レッスン2のあのフィールドを覚えていますか?)。そうすればモデルはこの経路が塞がれていることを学び、次のターンに同じアクションをもう一度提案する代わりに別の方法を探しにいきます。第三に、isHighImpact は高インパクトな操作だけを止めます — ファイルを読む、ログを確認する、といった無害な動きはそのまま通します。そうしないと1ステップごとに人間のうなずきが必要になり、エージェントは高価な手動ツールへ成り下がります。

ゲートの置き場所: アクションが不可逆になる前であって、後ではない

あの承認弁が機能するのは、ひとえに正しい場所に立っているからです。この節では、その配置のルールだけを取り出します。このレッスンの中で最も逆に覚えられやすく、逆にしたときの代償が最も大きいものだからです。

ルールは一文です: 承認の一時停止は、アクションが不可逆になる前に置く。後ではない。 この考えには、以前のコース「エージェントツール呼び出し: エージェントに実際に行動させる」ですでに出会っています — アクションの影響範囲が大きく、取り消しが利かないほど、その確認点は早い位置になければなりません。ループに落とすとこうなります: チェックは executeTool の1行上に置き、人間を待っているあいだ破壊的なアクションはまだ起きていない状態にします。下へ動かせば、あなたが反応するころにはテーブルは削除され、メールは全員に送られ、本番設定はすでに変更済みです — そしてログがどれほど精密でも、やったことは残骸を写真に撮ることだけです。

「不可逆」をどう見分けるか。反実仮想のテストを自分に課してください: このアクションが実行されて、それが間違っていたら、1手で取り消せるか。安く巻き戻せるもの — 一時ファイルを書く、内部の下書きを保存する — にはゲートは不要か、あってもごく緩いもので構いません。取り消せない、あるいは莫大なコストでしか取り消せないもの — データベースの削除、送金、外部への公開、本番設定の変更 — には早い位置にゲートが必要で、しかも「先に承認、それから実行」でなければなりません。これはレッスン4ときれいにつながります: あちらはループがリソースを燃やし尽くすのを防ぐ話で、こちらはループが取り消せないことをやるのを防ぐ話です。前者はリズムの暴走、後者はアクションの暴走であり、どちらも「手遅れ」が来る前にゲートを置く必要があります。

たいてい見落とされる細部が1つ: ゲートは、アクションが実際に着地する場所にいちばん近いステップに置きます。テーブルの削除がいくつもの手を経るとしましょう — モデルが提案し、ハーネスがディスパッチし、drop_table が呼ばれる。「モデルが提案する」ステップに承認を置くだけでは足りません。提案そのものは何の損害も与えないからです。レッスン1が言ったとおり、"The model never executes anything on its own."3(モデルは自分では何も実行しない。)損害は最後の executeTool の呼び出しに宿ります。ゲートを実行側へできるだけ寄せておけば、モデルは何度でも考えを変え、引数を練り直せます — それらはすべて、まだ誰も傷つかないゲートのこちら側で起きます。

レッスン6が3つを1つのループにどうまとめるか

このレッスンを前のレッスンと並べると、ハーネスの制御は一式そろいます: レッスン3の停止条件(頃合いになったら自動で手を引く)、レッスン4の暴走のフォールバック(デッドループと空回りを見つけ、予算を燃やし尽くさない)、そしてこのレッスンのヒューマン・イン・ザ・ループの承認(危険なアクションが着地する前の手動ゲート)です。3つから1つを選ぶものではありません。同じループの上に積み重なる3つの層です — 停止条件はどれだけ長く走るかを、フォールバックは進路を外れたときどうするかを、承認はこの1手をそもそも実行させるかを司ります。

レッスン6では、この3つを1つの走る最小ハーネスに溶接します: ターン数上限つきの while ループ、空回り検知、そして高インパクトな操作への承認弁。このレッスンの isHighImpact の分岐、レッスン3のカウンター、レッスン4の進捗チェックが、1つのループ本体の中で互いに衝突せずそれぞれの位置に収まる様子を、そこで見ることになります。このレッスンでは、2つを握っておけば十分です: 3つの介入がそれぞれ何を変えるのか、そして承認のゲートは引き返せない地点の手前に立たなければならない、ということです。

まとめ

  • ループが自律的であるほど、要所には人間のゲートが要ります: 過剰なエージェンシーとは、予期しない・曖昧な・操作されたモデル出力が、取り消せない有害なアクションを引き起こしうるということです1。多くのターンにわたって動作しうるモデルを信頼すること2は自由にさせることと同じではなく、人間のゲートは曲がり方を間違えたら取り消せない少数の交差点を見張ります
  • 3つの介入はそれぞれ別の層を司ります: 中断はループの生死に作用し(ループの外から人が全体を取りやめる)、操舵は向きに作用し(新しい指示を押し込み、目標を変え、走らせ続ける)、承認は1つのアクションが通るかに作用します(危険な操作の前で止まってうなずきを待つ)。最後のものはまさに「チェックポイントで人間のフィードバックを待って一時停止する」2という考えを、高インパクトなアクションの手前に留めたものです
  • ヒューマン・イン・ザ・ループの承認の鉄則は、承認が先、実行が後です: 高インパクトなアクションは、実行される前に人間が承認することを必須にし1、弁は下流のシステムに置いても、エージェントの拡張自体の中に置いてもかまいません1
  • ゲートはアクションが不可逆になる前に置き、後には置きません: executeTool の上に座っていれば、人間を待つあいだ破壊的なアクションはまだ起きていません。実行の下へ動かせば、どれほど精密なログも事後の追跡でしかなく、すでに着地したものは何も止められません。「不可逆」を見分けるには反実仮想のテストを使ってください — 間違って実行されたら、1手で取り消せるか。
  • このレッスンの承認、レッスン3の停止条件、レッスン4の暴走のフォールバックは、同じループの上に積み重なる3つの層であり、レッスン6ではそれらを溶接して走る最小ハーネスにします

レッスン6 >>

Footnotes

  1. LLM06:2025 Excessive Agency — OWASP Gen AI Security Project — https://genai.owasp.org/llmrisk/llm062025-excessive-agency/ 2 3 4 5 6

  2. Building Effective AI Agents — Anthropic Engineering — https://www.anthropic.com/engineering/building-effective-agents 2 3 4

  3. How tool use works — Claude API — https://platform.claude.com/docs/en/agents-and-tools/tool-use/how-tool-use-works

練習

01

デプロイエージェントが「ビルド → テスト → 本番リリース」のパイプラインを自動で走らせています。以下は、オンコールのエンジニアが別々のタイミングで行った3つのことです。それぞれについて、中断・操舵・承認のどれかを判定し、その理由を述べてください(ループを終了させたのか、ループの目標を変えたのか、1つのアクションに青信号を出したのか)。

レベル1: 3つの介入手をラベル付けする
  1. エージェントが「本番リリース」ステップの直前で止まります。画面にプロンプトが出ます: 「v2.3.1 を本番にリリースしようとしています。確認しますか?」。エンジニアはバージョン番号にちらりと目をやり、「確認」をクリックし、エージェントはリリースを進めます。
  2. エージェントが、毎回失敗するテストを再試行し続けています。エンジニアはこの道は行き止まりだと判断して停止を押し、パイプライン全体が終了してプロセスが抜けます。
  3. エージェントがまだテストを走らせているところに、エンジニアがメッセージを差し込みます: 「2.3.1 は出さないで — 顧客が欲しいのは 2.3.0 だから、そのバージョンに切り替えて続けて」。エージェントは新しいバージョン番号で進みます。
完了基準 · ローカルでチェック
02

以下のループ本体は、外部にメールを送れるエージェントに人間の承認を足そうとしていますが、書き方に問題があります: 人間に尋ねるころには、メールはすでに送信済みです。配置の何が問題で、それが何を招くかを指摘し、承認弁を正しい位置へ移してください。

レベル2: 承認弁を正しい位置に置く
完了基準 · ローカルでチェック