AIに「ハンコ」を押させるな:LangChainのHuman-in-the-loopで実現する責任ある自動化
はじめに:AIが勝手にメール送っちゃった事件
「お客様に変なメール届いてるんですけど!」
これは、ある企業のAI開発担当者から聞いたの怪談話です。完全自動化を目指しすぎた結果、AIエージェントが誤った内容のメールを顧客リスト全員に送信してしまった…。想像するだけで胃が痛くなりますね。
AIは便利ですが、幻覚(ハルシネーション)を見ます。だからこそ、重要なアクション(メール送信、DB更新、契約締結など)の前には、必ず**「人間のチェック(承認)」**を挟むべきです。今回は、LangChain (LangGraph) を使って、この「Human-in-the-loop」をシステム的に実装する方法をご紹介します。
基礎知識:Human-in-the-loop (人間介入) とは
直訳すれば「ループの中に人間を入れる」ことです。AIがタスクを実行する過程で、一度立ち止まり、人間の入力を待つ仕組みを指します。
「自動化の意味ないじゃん」と思うかもしれませんが、逆です。「9割はAIが下書きし、最後の1割(決定)だけ人間がやる」ことで、生産性と安全性を両立させるのがモダンなAI開発のアプローチなのです。上司の承認印みたいなものですね。嫌われがちなハンコ文化ですが、事故防止装置としては優秀なんです。
実装・設定:LangGraphでの承認フロー実装
LangGraphを使えば、状態遷移図(ステートマシン)としてワークフローを記述できます。ここで interrupt_before を使うのがポイントです。
from langgraph.graph import StateGraph
# グラフの作成
workflow = StateGraph(State)
# ノードの定義
workflow.add_node("draft_email", draft_email_agent)
workflow.add_node("send_email", send_email_tool)
# エッジ(流れ)の定義
workflow.add_edge("draft_email", "send_email")
# ★ここが重要! send_email の前で一時停止する設定
app = workflow.compile(interrupt_before=["send_email"])
こうしておくと、メールの下書きが終わった時点で処理が一時停止(Suspend)します。管理画面などで人間が中身を確認し、「承認」ボタンを押して初めて send_email
が実行されるわけです。
応用テクニック:Slack連携によるスムーズな承認
いちいち管理画面にログインして承認するのは面倒ですよね。Slack Interactive Componentsを使えば、「承認」「却下」ボタン付きのメッセージをSlackに飛ばし、そこから直接AIの処理を再開させることができます。
私のチームでも導入していますが、「外出先からスマホでAIの成果物をチェックして承認」というスタイルは、管理職としても非常に効率が良いです。(サボってるわけじゃないですよ、効率化です)
トラブルシューティング:ステート管理の落とし穴
Human-in-the-loopを実装するには、処理の状態(State)をどこかに永続化する必要があります。デフォルトのメモリ上保存だと、承認待ちの間にサーバーが再起動したら、タスクが消滅してしまいます。
PostgresSaver
などを使ってDBに状態を保存しましょう。「承認したのにメールが送られてない」という問い合わせ対応で一日が終わるのは避けたいですからね。
まとめ:最後の責任を取るのは私たち人間だ
AIエージェントの自律化が進めば進むほど、Human-in-the-loopの重要性は増していきます。
「AIが勝手にやりました」は、ビジネスの世界では通用しません。最後の最後で「Goサイン」を出す権限と責任は、我々人間が手放してはいけないのです。安心してAIに働いてもらうためにも、しっかりとしたブレーキ(承認フロー)を設計しておきましょう。
コメント
コメントを投稿