ストーリー
田
田中VPoE
入力・出力のフィルタリングを学んだ。次はもう少し上位の概念「トピック制限とスコープ管理」だ
あなた
AIが回答できる範囲を制限するということですか?
あ
田
田中VPoE
その通り。NetShop社のカスタマーサポートAIに「今日の株価は?」と聞かれたら、どうすべきだと思う?
あなた
業務範囲外なので「お答えできません」と返すべきですね
あ
田
田中VPoE
そうだ。だがそれだけではない。「御社のCEOの経歴は?」「社内の開発環境は何を使っていますか?」など、微妙なケースもある。どこまでが許可で、どこからが禁止か、明確に定義する必要がある
スコープ管理の基本
許可・禁止・グレーゾーンの3分類
┌─────────────────────────────────────────┐
│ トピック分類体系 │
├─────────────────────────────────────────┤
│ │
│ ● 許可トピック(ALLOW) │
│ ・商品に関する質問 │
│ ・注文状況の確認 │
│ ・返品・交換の手続き │
│ ・配送に関する問い合わせ │
│ │
│ ▲ グレーゾーン(REVIEW) │
│ ・会社概要、採用情報 │
│ ・競合他社との比較 │
│ ・技術的な質問 │
│ │
│ ✕ 禁止トピック(DENY) │
│ ・社内情報、経営情報 │
│ ・個人情報に関する質問 │
│ ・政治・宗教に関する意見 │
│ ・医療・法律アドバイス │
│ ・業務と無関係な雑談 │
│ │
└─────────────────────────────────────────┘
トピック制限の設計
1. トピック分類ルールの定義
TOPIC_RULES = {
"customer_support_ai": {
"allow": {
"topics": [
"商品情報", "注文状況", "返品・交換",
"配送状況", "支払い方法", "会員情報",
"キャンペーン情報", "よくある質問",
],
"description": "NetShop社の商品・サービスに関する質問",
},
"review": {
"topics": [
"会社情報", "採用情報", "技術的質問",
"パートナーシップ", "メディア問い合わせ",
],
"description": "回答可能だが定型文で対応するトピック",
"action": "redirect_to_template",
},
"deny": {
"topics": [
"社内情報", "経営情報", "従業員情報",
"政治", "宗教", "医療アドバイス", "法律相談",
"投資助言", "競合他社の批判",
],
"description": "回答を拒否するトピック",
"action": "polite_decline",
},
}
}
2. トピック分類器の実装
class TopicClassifier:
"""入力のトピックを分類する"""
def __init__(self, rules: dict):
self.rules = rules
def classify(self, user_input: str) -> dict:
classification_prompt = f"""
以下のユーザー入力のトピックを分類してください。
ユーザー入力: {user_input}
許可トピック: {self.rules["allow"]["topics"]}
レビュー対象: {self.rules["review"]["topics"]}
禁止トピック: {self.rules["deny"]["topics"]}
JSON形式で出力:
{{
"detected_topic": "検出されたトピック",
"category": "allow" | "review" | "deny",
"confidence": 0.0-1.0,
"reasoning": "分類理由"
}}
"""
return call_llm(classification_prompt)
def get_action(self, classification: dict) -> str:
category = classification["category"]
if category == "allow":
return "proceed"
elif category == "review":
return self.rules["review"]["action"]
else:
return self.rules["deny"]["action"]
業務範囲の階層的定義
NetShop社のスコープ階層
Level 0: 基本応答(常に許可)
├─ 挨拶、お礼
└─ 「何ができますか?」への回答
Level 1: 一般情報(認証不要)
├─ 商品カタログの閲覧
├─ 配送ポリシーの説明
└─ よくある質問への回答
Level 2: アカウント情報(認証必要)
├─ 注文履歴の確認
├─ 配送状況のトラッキング
└─ 会員情報の確認
Level 3: トランザクション(認証 + 確認必要)
├─ 返品手続きの開始
├─ 住所変更
└─ 支払い方法の変更
Level 4: 管理操作(管理者のみ)
├─ 注文のキャンセル処理
├─ 返金処理
└─ アカウントの停止
スコープレベルに応じた制御
class ScopeManager:
"""スコープレベルに応じたアクセス制御"""
SCOPE_LEVELS = {
0: {"auth_required": False, "confirmation": False},
1: {"auth_required": False, "confirmation": False},
2: {"auth_required": True, "confirmation": False},
3: {"auth_required": True, "confirmation": True},
4: {"auth_required": True, "confirmation": True,
"role": "admin"},
}
def check_access(
self, scope_level: int, user_context: dict
) -> dict:
requirements = self.SCOPE_LEVELS[scope_level]
if requirements["auth_required"] and not user_context.get("authenticated"):
return {
"allowed": False,
"reason": "認証が必要です。ログインしてください。",
}
if requirements.get("role") and user_context.get("role") != requirements["role"]:
return {
"allowed": False,
"reason": "この操作には管理者権限が必要です。",
}
return {"allowed": True, "needs_confirmation": requirements.get("confirmation", False)}
グレーゾーンの取り扱い
グレーゾーン対応テンプレート
| トピック | 対応方針 | 回答テンプレート |
|---|
| 会社概要 | 公開情報のみ回答 | 「NetShop社は…公式サイトで詳細をご確認ください」 |
| 採用情報 | 採用ページへ誘導 | 「採用情報は https://… をご確認ください」 |
| 技術的質問 | 公開ドキュメントの範囲で回答 | 「公開ドキュメントによると…」 |
| 競合比較 | 自社の特徴のみ回答 | 「当社の特徴は…他社との比較はお答えしかねます」 |
エスカレーションフロー
トピック分類
│
├─ ALLOW → 通常回答
│
├─ REVIEW → テンプレート回答 or 人間にエスカレーション
│ ├─ テンプレートあり → テンプレート回答
│ └─ テンプレートなし → 「担当部門に確認します」
│
└─ DENY → 丁寧な拒否
└─ 「申し訳ございませんが、その内容にはお答えできません。
商品やご注文に関するご質問をお待ちしております。」
スコープ違反の監視
class ScopeViolationMonitor:
"""スコープ違反の監視とレポーティング"""
def log_violation(self, event: dict):
"""スコープ違反をログに記録"""
log_entry = {
"timestamp": datetime.now().isoformat(),
"user_input": event["user_input"],
"detected_topic": event["topic"],
"category": event["category"],
"action_taken": event["action"],
}
self.violation_log.append(log_entry)
# 同一ユーザーの連続違反を検出
if self._is_repeated_violation(event["user_id"]):
self._alert_security_team(event)
def generate_report(self, period: str) -> dict:
"""期間別の違反レポートを生成"""
return {
"total_violations": len(self.violations),
"by_category": self._group_by_category(),
"top_denied_topics": self._top_topics(n=10),
"repeat_offenders": self._repeat_users(),
"recommendations": self._generate_recommendations(),
}
まとめ
| 項目 | 内容 |
|---|
| トピック3分類 | ALLOW(許可)、REVIEW(グレーゾーン)、DENY(禁止) |
| スコープ階層 | Level 0-4の階層的アクセス制御 |
| グレーゾーン対応 | テンプレート回答 or 人間エスカレーション |
| 監視 | 違反ログの記録と分析、繰り返し違反の検出 |
チェックリスト
推定所要時間: 30分