
チャットボットやAIエージェントにコンテンツモデレーションを追加する方法

チャットボットやAIエージェントにコンテンツモデレーションを追加するということは、単にNGワードをブロックするだけではありません。本番環境のワークフローでは、ユーザー入力、モデル出力、そしてエージェントが実行できるアクションの全てをチェックする必要があります。
最も安全な考え方は次のとおりです:
input moderation
-> model or agent reasoning
-> tool-call validation
-> output moderation
-> allow / review / blockまとめ
- ユーザー入力がチャットボットやエージェントに届く前にモデレーションを実施しましょう。
- モデル出力がユーザーに表示される前にモデレーションを実施しましょう。
- エージェントがアクションを実行する前にツールコールを検証しましょう。
- コンテンツモデレーションをプロンプトインジェクション対策の完全な防御手段として扱わないでください。
- 中リスクや影響の大きいケースにはヒューマンレビューを活用しましょう。
- EvoLink の
evolink_summary.risk_levelを使えば、許可 / レビュー / ブロックのロジックを簡素化できます。
コンテンツモデレーションとエージェントセキュリティは別物です
コンテンツモデレーションは、有害なテキストや画像を検出するためのものです。危険なプロンプト、有害な出力、ポリシーに違反するユーザーコンテンツのリスクを軽減できます。
エージェントセキュリティはより広範な概念です。プロンプトインジェクション、ツール権限、データアクセス、ヒューマン承認、構造化出力、評価、ログ記録、ワークフロー設計などが含まれます。
OpenAI のエージェント安全ガイドでは、ガードレール、ツール承認、トレースの評定、評価テスト、構造化ワークフロー設計などの手法を組み合わせることを推奨しています。OWASP もプロンプトインジェクションを、データ漏洩、意図しないアクション、ツールの悪用につながる独立した LLM セキュリティリスクとして扱っています。
参考資料:
要点:モデレーションはガードレールの一つです。唯一のガードレールであってはなりません。
レイヤー 1:入力モデレーション
入力モデレーションは、ユーザーのメッセージがモデルに届く前にチェックします。
以下のようなケースを検出できます:
- 明らかに有害なリクエスト
- ポリシーに違反するユーザーメッセージ
- 攻撃的・嫌がらせ的なテキスト
- 安全でない画像のアップロード
- 禁止されたコンテンツを要求するプロンプト
入力モデレーションが有効なのは、明らかに危険なリクエストがモデルのワークフローに入ること自体を防止できるからです。
def handle_user_message(user_input: str):
input_check = client.moderations.create(
model="evolink-moderation-1.0",
input=user_input
)
if input_check.evolink_summary.risk_level == "high":
return {
"status": "blocked",
"message": "I can't help with that request."
}
return run_chatbot(user_input)重要な制約:入力モデレーションはプロンプトインジェクションに対する完全な防御策ではありません。攻撃者は間接的なプロンプト、エンコードされたテキスト、画像、外部ドキュメント、またはツールの出力を利用して、ワークフローの後段でエージェントに影響を与えることができます。
レイヤー 2:出力モデレーション
出力モデレーションは、モデルの応答がユーザーに届く前にチェックします。
以下のようなケースを検出できます:
- 安全でない生成コンテンツ
- ポリシーに違反する応答
- センシティブな領域における有害なアドバイス
- 入力が安全に見えたにもかかわらずすり抜けた応答
def safe_chat(user_input: str):
input_check = moderate(user_input)
if input_check.evolink_summary.risk_level == "high":
return "I can't help with that request."
answer = llm.generate(user_input)
output_check = moderate(answer)
if output_check.evolink_summary.risk_level == "high":
return "I generated a response that needs to be revised. Please try rephrasing."
return answer出力モデレーションは、公開チャットボット、AIコパイロット、モデルの応答がユーザーに直接表示される生成コンテンツワークフローで特に有効です。
レイヤー 3:ツールコール検証
AIエージェントにとって、ツールコールは最もリスクの高いレイヤーであることが多いです。
エージェントがメール送信、データベースクエリ、チケット更新、API呼び出し、ファイル書き込みなどを実行できる場合、ツールコールは実行前に検証すべきです。これは単なるモデレーションではなく、認可とポリシーの適用です。
検証すべき項目:
- ツール名
- 許可されたユーザーまたはアカウントの範囲
- ヒューマン承認の要否
- 許可されたパラメータ値
- 読み取りと書き込みの操作
- 外部の送信先
- 破壊的なアクション
- データ持ち出しのリスク
def validate_tool_call(tool_name: str, args: dict, user_context: dict):
if tool_name == "send_email":
if not args["to"].endswith("@company.com"):
return False, "External email requires approval."
if tool_name == "database_query":
query = args.get("query", "")
forbidden = ["DROP ", "DELETE ", "TRUNCATE "]
if any(word in query.upper() for word in forbidden):
return False, "Destructive database operation blocked."
if tool_name == "refund_customer":
if args["amount"] > user_context["approval_limit"]:
return False, "Refund amount requires human approval."
return True, NoneOpenAI のエージェント安全ガイドでも、MCP ツールに対してツール承認を有効にしておき、エンドユーザーが操作を確認・承認できるようにすることを推奨しています。
レイヤー 4:許可 / レビュー / ブロック ルーティング
安全/危険の二値判定によるモデレーションは、通常は粗すぎます。本番環境でより実用的なパターンは次のとおりです:
| リスク | アクション |
|---|---|
| 低 | 許可 |
| 中 | レビューキューに送る、警告する、配信を制限する |
| 高 | ブロックまたは異議申し立てを要求する |
evolink_summary.risk_level フィールドを返します。def route_by_risk(content: str):
result = client.moderations.create(
model="evolink-moderation-1.0",
input=content
)
risk = result.evolink_summary.risk_level
if risk == "high":
log_block(result)
return {"action": "block"}
if risk == "medium":
queue_for_review(content, result)
return {"action": "review"}
return {"action": "allow"}チャットボットモデレーションの全体パターン
以下は、実用的なエンドツーエンドの全体像です:
def handle_chatbot_turn(user_input: str, user_context: dict):
# 1. Moderate input
input_route = route_by_risk(user_input)
if input_route["action"] == "block":
return "I can't help with that request."
if input_route["action"] == "review":
log_review_event("input", user_input)
# 2. Generate model response and proposed tool calls
agent_result = agent.run(user_input, user_context)
# 3. Validate tool calls before execution
for call in agent_result.tool_calls:
ok, reason = validate_tool_call(call.name, call.args, user_context)
if not ok:
log_security_event(call, reason)
return "That action requires additional review."
# 4. Execute approved tools
tool_outputs = execute_tool_calls(agent_result.tool_calls)
# 5. Generate final response
final_answer = agent.format_response(tool_outputs)
# 6. Moderate output
output_route = route_by_risk(final_answer)
if output_route["action"] == "block":
return "I need to revise that response."
if output_route["action"] == "review":
queue_for_review(final_answer, output_route)
return final_answer実装の詳細はプロダクトによって異なりますが、全体の構造は共通です:入力をチェックし、アクションを制限し、出力をチェックし、判断をログに記録します。
誤検知への対処
誤検知は避けられません。目標は、正当なユーザーを過剰にブロックすることなく、有害なコンテンツを減らすことです。
以下のケースにはレビューキューを活用しましょう:
- 中リスクのコンテンツ
- 文脈が不明確なケース
- ポリシー上センシティブなカテゴリ
- 重要なユーザーまたは影響の大きいアクション
- 異議申し立て
各モデレーション判断には、後からデバッグできるだけの十分なコンテキストをログに記録しましょう:
- コンテンツハッシュ
- ユーザー ID またはアカウント ID
- リスクレベル
- トリガーされたカテゴリ
- 実行されたアクション
- レビュアーによるオーバーライド
- タイムスタンプ
明確な保持期間とプライバシーポリシーがない限り、センシティブなコンテンツの生データをログに記録することは避けてください。
社内で約束すべきこと
モデレーションによってチャットボットが「100%安全になる」とは約束しないでください。
より適切な約束は次のとおりです:
- 有害な入力はモデル実行前にチェックされます
- モデル出力はユーザー表示前にチェックされます
- エージェントのツールコールは実行前に検証されます
- 高リスクまたは曖昧なケースはヒューマンレビューにルーティングできます
- ログとレビュー結果は閾値の改善に活用されます
これが現実的な本番運用の姿勢です。
よくある間違い
間違い 1:入力のみをモデレーションする
入力チェックは有効ですが、モデルは依然として安全でない出力を生成する可能性があります。ユーザーに表示する前に出力もモデレーションしましょう。
間違い 2:プロンプトをセキュリティ境界として扱う
システムプロンプトは動作をガイドしますが、唯一のセキュリティレイヤーであるべきではありません。ツール権限、構造化ワークフロー、承認プロセスを併用しましょう。
間違い 3:検証なしでエージェントにツールを実行させる
ツールコールは必ずモデルの外部で検証してください。モデルはアクションを提案し、アプリケーションがそのアクションを許可するかどうかを決定すべきです。
間違い 4:不確実なケースを全てブロックする
過度に厳格なシステムはユーザーの不満を招きます。不確実なケースは常にブロックするのではなく、レビューに送りましょう。
間違い 5:ログを残さない
ログがなければ、閾値の調整、インシデントの調査、誤検知の把握ができません。
実装チェックリスト
- モデル呼び出し前にユーザー入力をモデレーションする。
- ユーザー表示前にモデル出力をモデレーションする。
- 実行前にエージェントのツールコールを検証する。
- 許可 / レビュー / ブロック ルーティングを使用する。
- 中リスクのコンテンツをレビューキューに送る。
- 必要に応じてユーザー報告と異議申し立てを追加する。
- リスクレベル、カテゴリ、アクション、レビュアーのオーバーライドをログに記録する。
- 必要でない限り、センシティブなコンテンツの生データを保存しない。
- プロダクトの実際の使用例でテストする。
- 本番データが集まった後に閾値を見直す。
FAQ
チャットボットの入力と出力、どちらをモデレーションすべきですか?
両方です。入力モデレーションは、安全でないリクエストがモデルに届く前に減らすことができます。出力モデレーションは、安全でない生成コンテンツがユーザーに表示される前にキャッチできます。
コンテンツモデレーションでプロンプトインジェクションを防げますか?
いいえ。モデレーションは一部の安全でないコンテンツや不審なコンテンツを検出できますが、プロンプトインジェクションにはツール検証、構造化出力、最小権限の原則、ヒューマン承認、ワークフローの分離といった、より広範な防御策が必要です。
AIエージェントのどこにモデレーションを配置すべきですか?
ユーザー入力にはモデルの前に、モデル出力には表示の前にモデレーションを配置し、エージェントのアクション実行前にはツールコール検証と組み合わせてください。
EvoLink はチャットボットモデレーションにどう役立ちますか?
evolink_summary.risk_level を備えた OpenAI 互換のモデレーションエンドポイントを提供しており、チャットボットのコンテンツを許可、レビュー、ブロックのワークフローにルーティングすることが容易になります。ヒューマンレビューは必要ですか?
本番システムでは、はい。ヒューマンレビューは、異議申し立て、中リスクのケース、ポリシー変更、影響の大きい判断において重要です。
関連モデレーションガイド
- OpenAI Moderation API の料金:無料?制限と代替手段
- 画像モデレーション API ガイド:安全でないユーザーアップロード画像のフィルタリング方法
- omni-moderation-latest 解説:OpenAI Moderation API ガイド
- 開発者向けベストコンテンツモデレーション API & ツール


