LESSON 30分

ストーリー

田中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 人間エスカレーション
監視違反ログの記録と分析、繰り返し違反の検出

チェックリスト

  • トピックの3分類(ALLOW/REVIEW/DENY)を設計できる
  • スコープ階層に応じたアクセス制御を理解した
  • グレーゾーンの取り扱い方針を策定できる
  • スコープ違反の監視・レポーティングの仕組みを把握した

推定所要時間: 30分