はじめに — つまずきに寄り添って
実務でAIを使い始めると「期待通りの回答が出ない」「不正な入力で誤動作した」「知らないうちに機密が漏れた」といった事態に直面します。多くの場合、原因は入力側の検証不足です。本記事は、現場で実際に使える検出・サニタイズ・監視の手順(チェックリストとPythonでの自動化ポイント)を、落ち着いた語り口でまとめます。焦らず一歩ずつ実装できることを目標にしています。
なぜ入力検証が次の重要課題か
プロンプト注入、出力漏洩、悪意あるファイルアップロード、意図的なデータ中毒など、AI運用で発生するリスクは多岐にわたります。モデル自体の精度改善だけでなく、外部から入るデータやユーザーの行動を守る仕組みがなければ、業務影響は大きくなります。本記事のゴールは「実運用で使えるチェックリストと自動化テンプレ」を提供することです。
脅威一覧と優先度付け
| 脅威 | 説明 | 業務影響(例) | 優先度 |
|---|---|---|---|
| プロンプト注入 | ユーザー入力に悪意ある命令が含まれ、モデルの動作を逸脱させる | 誤情報提供、機密問い合わせ応答 | 高 |
| オーバーフロー的長文 | 長大入力でコンテキストを埋め、重要指示を無効化する | 誤応答やリソース枯渇 | 高 |
| 悪性ファイル(バイナリ/マクロ) | アップロードされたファイルにマルウェアや機密埋め込み | サーバ侵害、情報漏洩 | 高 |
| メタデータ改ざん | ファイル・データのヘッダや属性を改変して誤認させる | 誤処理、ログ不整合 | 中 |
| 意図的なデータ中毒 | 学習データを汚染してモデル挙動を劣化させる | 長期的モデル精度低下 | 中 |
入力検証の基本パターン(手順化)
- 受け口設計(どの入力を受けるか明確にする)
- 形式検証(型・長さ・エンコーディング)
- コンテンツ検査(ブラックワード、意味的検出、サマライズ)
- サニタイズ(HTML/スクリプト除去、エスケープ)
- 正規化(正規形式に揃える)
- ログ出力(検査結果を追跡可能に)
以下は各ステップで使えるPythonの小技をまとめた簡易テンプレです。
| ステップ | Pythonでの手法/ライブラリ | 具体ポイント |
|---|---|---|
| 形式検証 | pydantic / dataclasses | 必須フィールド、型、最大長を宣言して早期拒否 |
| MIME/拡張子検査 | python-magic, mimetypes | 拡張子だけでなく魔術バイトで確認 |
| HTML除去・サニタイズ | bleach / html-sanitizer | 許可タグ白リスト方式で余計なスクリプトを排除 |
| エンコーディング検査 | chardet / builtins | UTF-8以外は正規化 or 拒否 |
| テキスト誤用検出 | 正規表現 / シンプルなベクトル類似検索 | ブラックワード、長さ、異常パターンをスコア化 |
プロンプト注入への具体対策
プロンプト注入は、モデルに渡すコンテキストとユーザー入力を適切に分離することで大きく軽減できます。
- システムプロンプト分離:システム側指示を固定化し、ユーザー入力を末尾や別フィールドに分ける。
- コンテクストの最小化:本当に必要な情報だけを渡す。過去の会話履歴は短縮して渡す。
- 入力のサマライズ:長文は先に要約し、要約をモデルに渡す。
- エスケープ/サニタイズ:ユーザー入力内の命令句(例: “ignore previous”)を検出して中和する。
疑似検出フロー(簡潔な説明):
1) 入力受信 → 2) ブラックワードスキャン(スコア) → 3) スコア閾値超過なら隔離・レビュー → 4) 問題なければサマライズ→モデルへ
| 検出ルール例 | アクション |
|---|---|
| 明示的命令句(”ignore system”, “follow this” 等) | 自動でマスク、運用ログに記録、レビューキュー行き |
| コンテキスト置換意図(長文で重要指示が埋められる) | 要約して指示を再付与、もしくは拒否 |
ファイルアップロード・バイナリ対策
ファイル系は三重チェックが基本です。拡張子・MIME・magicバイトを確認し、必要ならサンドボックスで開いて抽出したテキストを検査します。
| 検査 | 目的 | Pythonでのポイント |
|---|---|---|
| 拡張子チェック | 表面的フィルタ | mimetypesで初期判定 |
| MIME/magicバイト | 拡張子偽装検出 | python-magicで厳密判定 |
| コンテンツ抽出 | テキスト化してサニタイズ・スキャン | textract等で抽出、並列処理・タイムアウトを設定 |
| サンドボックス実行 | 動的挙動検査 | アンチウイルスAPI/隔離環境と連携 |
モニタリングとアラート設計
ログは復元可能かつ解析しやすい形で残します。Prometheusや軽量ログ集約(ファイル→Elasticsearch/Logstash等)と組み合わせると実運用が容易です。
| ログ項目 | 説明 |
|---|---|
| 入力ハッシュ | 同一攻撃再現時に追跡できるように生成 |
| 検査結果 | 各チェックの合否とスコア |
| フィルタ適用履歴 | どの処理で何を変えたかの追跡 |
| 応答ラベル | レビュー済み/自動応答/隔離などの状態 |
モニタリング指標例と閾値(SLOの一例):
- 検出率(目標): >= 95%(既知攻撃に対して)
- 誤検知率(許容): <= 5%
- 対応時間(中央値): <= 1時間(高優先度インシデント)
テストと演習
- ユニットテスト:ブラックワードや長さチェックの正常/異常ケースを網羅
- 統合テスト:ファイルアップロード→抽出→検査→モデルへ渡す一連の流れ
- fuzzテスト:ランダム長文字列や制御文字を投げる
- 攻撃シミュレーション:実際のプロンプト注入例やマルウェア疑似ファイルを使った演習
- 定期演習:成果をラベリングして検出ルールにフィードバックするループを構築
運用ルールとランブック項目
| 状況 | 初動対応 | 次のアクション |
|---|---|---|
| 高リスク検出(プロンプト注入等) | 該当セッション隔離、ログ保存、モデル切替 | 詳細分析→必要なら通信遮断→ポストモーテム |
| 疑わしいファイル | アップロード隔離、サンドボックス実行、AVスキャン | 脅威確定ならIP/ユーザーブロック、証跡保存 |
導入後の次の一歩(実務タスク)
| 期間 | タスク |
|---|---|
| 7日でできること | 受け口設計・pydanticで最低限の形式検証を導入・MIME魔術バイトチェックの実装 |
| 30日で回す体制 | ログ集約→簡易ダッシュボード→Prometheus/Alertmanagerで閾値アラート |
| KPI例 | 検出率、誤検知率、平均対応時間、検査レイテンシ |
運用テンプレ(簡易)
疑似的な検出フロー(実際のコードではありませんが、運用設計のテンプレとして):
1) 受信 → 2) pydanticで構造検証 → 3) mime/magicチェック(ファイル時) → 4) テキスト化→ブラックワード/長さスコア計算 → 5) スコア閾値超なら隔離・人レビュー、超えなければサニタイズしてモデルへ
Pythonのライブラリ候補(参考): pydantic, python-magic, bleach, textract, chardet, requests
参考:WordPressに貼れる簡易サンプル(HTMLで表現)
以下はサンプルの処理フローを示すHTML表現です。実運用では同等の処理をPythonで自動化します。
| ステップ | 処理結果の記録例 |
|---|---|
| 受信 | input_hash=abcd1234, source=web_form |
| 形式検証 | schema_ok=true, missing_fields=[] |
| コンテンツ検査 | blackword_score=0.02, length=1024 |
| 最終 | action=allow, note=passed_all_checks |
まとめ
- AI運用の安全性は「入力側の検証」と「運用の監視」で大きく改善する。モデル改善だけに頼らないことが重要です。
- 基本パターン(受け口設計→検証→検査→サニタイズ→正規化→ログ)は必ず実装する。pydanticやpython-magicなど既存ライブラリで効率化できます。
- プロンプト注入や悪性ファイルには専用のフローと隔離ルールを用意し、検出→隔離→レビューのランブックを整備してください。
- 短期(7日)でできる導入項目と30日で回す監視体制を明確にし、定期的なテスト・演習で検出の精度を保つことを推奨します。
次回は、今回のチェックリストをCI/CDに組み込み、デプロイ前に自動検査を回す具体的なパターンを紹介します。Manage AI(https://manageai.online)は実務で使えるテンプレを今後も提供していきます。