
News Observation Lab for Future
AI ドラフトのヒューマン・イン・ザ・ループ導入ガイド:ASP.NET Core での承認・監査・安全送信

既存のサポート、ERP、CRM アプリケーションに AI を組み込む際、最初のリリースは「モデルのドラフト」を人間がレビューする境界を設けることで安全性を確保します。本稿では、ASP.NET Core と React で構築した SupportAgent.NET を例に、承認・監査・送信までのワークフローを具体的に示します。
1. ライフサイクルの明示的なモデリング
主要な状態は「生成 → レビュー中 → 編集 → 承認 → 送信」です。編集は任意で、変更なしのドラフトは「レビュー中」から直接「承認済み」へ遷移できます。「拒否」は「レビュー中」または「編集済み」から分岐し、送信は「承認」の前提条件となります。各状態はサーバー側メソッドだけが遷移させ、モデルは承認や送信のロジックを持ちません。
2. 改訂と決定の分離保存
.NET 8/9 と SQL Server を使用し、ワークフロー状態と生成元をドラフトに保存します。SQL Server の [timestamp] は同時実行トークンとして機能し、EnvelopeJson がレビュー対象の受信者・件名・添付ファイル参照を捕捉します。テナントごとの外部キーと一意リビジョン番号で整合性を保ち、編集時は親リビジョンもインクリメントされます。決定・送信ボックスの一意性により、重複した承認や配信意図が防止されます。
3. ワークフロー操作の生成と公開
IChatClient がプロバイダー抽象化を提供し、生成テキストはサーバーが永続化状態を決定します。クライアントは送信機能を持たず、生成されたテキストはリビジョン 1 として保持され、モデル ID と共にドラフトが「生成済み」として作成されます。生成はデータベーストランザクション外で行い、下書きと証拠は同時に保存されます。
4. データ漏洩を防ぐ監査証跡の保存
アクタ、サーバータイムスタンプ、遷移、リビジョン、決定理由、相関 ID を記録し、不変リビジョンは増分差分と AI 生成テキストと最終テキストの比較を保持します。機密テキストは暗号化し、アクセス制御された証拠ストレージに格納。操作ログはプロンプトやシークレットを含まず、識別子・タイミング・結果コードのみを出力します。
5. トランザクション送信ボックスによる安全な送信
承認済みドラフトと不変ペイロードのみをワーカーが送信し、テナント・ドラフト・リビジョンごとの冪等性キー、試行回数、次回試行時刻、リース所有権、プロバイダー受領書を保存します。複数ワーカーは期限切れリースでエントリを原子的に取得し、キャンセルは原子的に競合させます。送信後は「送信済み」ステータスが付与され、バウンスや配信イベントは別管理です。
6. レビュー労働と正確さの測定
生成リビジョンと実際に送信されたテキストの正規化編集距離(Levenshtein 距離/テキスト長)を追跡し、距離が小さいことが必ずしも品質を示すわけではない点に注意します。承認率は「承認済みドラフト ÷ (承認済み+拒否)」で算出し、保留中ドラフトは配信失敗と同様に分離して扱います。結果はプロンプトバージョン・モデル・取得構成ごとに比較します。
7. 避けるべき典型的なミス
自動送信は「単純な場合」に限定し、モデルの信頼性で承認フローを省略しません。出典のないテキストは保持せず、送信ツールは LLM に公開しません。また、承認と編集の競合、テナント間アクセス、ワーカーの重複要求、プロバイダー受領直後のクラッシュをテストし、未承認メッセージが顧客に届く事態を防止します。
結論
AI を既存 ASP.NET Core アプリに組み込む際は、単なる「人間を入れる」だけでなく、バージョン付きドラフト、承認された決定、不変の配信ペイロード、回復可能な送信ワークフローを実装することが重要です。これにより、モデル権限を委譲せずに AI 製図の利点を安全に活かすことができます。