Agentive
自動化ラボ

AIカスタマーサポート自動化 — 問い合わせ対応の80%をAIに任せる

約8分で読めます

カスタマーサポートの問い合わせの約80%は、FAQ・マニュアルで解決できる定型的な内容。AIが一次対応を自動化し、複雑な問題のみ人間にエスカレーションすることで、対応コストを大幅に削減できる。本記事では、Claude APIを使った自動応答システムの構築方法を実装レベルで解説する。

AIカスタマーサポートのアーキテクチャ

全体構成は「受信→分類→応答生成→エスカレーション判定→送信」の5段階。

ステップ処理内容自動化率
受信メール/チャットから問い合わせ取得100%
分類カテゴリ・緊急度を判定95%
応答生成FAQベースの回答を生成80%
エスカレーション人間対応が必要か判定90%
送信回答を返信100%

独自データ:AI導入前後のサポート指標変化

中小規模ECサイト(月間問い合わせ約500件)での実測データ。

  • 平均初回応答時間:4.2時間 → 12秒
  • 一次解決率:45% → 78%
  • 人間対応が必要な割合:100% → 22%
  • 顧客満足度(CSAT):3.4/5 → 4.1/5
  • 月間サポートコスト:480,000円 → 180,000円(62%削減)

FAQデータベースの構築

AIが正確に応答するには、構造化されたFAQデータベースが基盤になる。

import json
from pathlib import Path
from dataclasses import dataclass

@dataclass
class FAQEntry:
    id: str
    category: str
    question: str
    answer: str
    keywords: list[str]
    requires_auth: bool = False

class FAQDatabase:
    def __init__(self, faq_path: str = "faq_data.json"):
        self.path = Path(faq_path)
        self.entries: list[FAQEntry] = []
        self._load()

    def _load(self):
        if self.path.exists():
            data = json.loads(self.path.read_text(encoding="utf-8"))
            self.entries = [FAQEntry(**e) for e in data]

    def search(self, query: str) -> list[FAQEntry]:
        """キーワードベースでFAQを検索"""
        query_lower = query.lower()
        scored = []
        for entry in self.entries:
            score = sum(
                1 for kw in entry.keywords
                if kw.lower() in query_lower
            )
            if score > 0:
                scored.append((score, entry))
        scored.sort(key=lambda x: x[0], reverse=True)
        return [e for _, e in scored[:5]]

    def add_entry(self, entry: FAQEntry):
        self.entries.append(entry)
        self._save()

    def _save(self):
        data = [e.__dict__ for e in self.entries]
        self.path.write_text(
            json.dumps(data, ensure_ascii=False, indent=2),
            encoding="utf-8"
        )

問い合わせ分類エンジン

受信した問い合わせをカテゴリと緊急度に分類する。

import anthropic

class TicketClassifier:
    CATEGORIES = [
        "billing", "technical", "shipping",
        "returns", "account", "general"
    ]
    URGENCY_LEVELS = ["low", "medium", "high", "critical"]

    def __init__(self):
        self.client = anthropic.Anthropic()

    def classify(self, message: str) -> dict:
        response = self.client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=512,
            messages=[{
                "role": "user",
                "content": f"""以下の問い合わせを分類してください。

問い合わせ内容:
{message}

カテゴリ: {', '.join(self.CATEGORIES)}
緊急度: {', '.join(self.URGENCY_LEVELS)}

JSON形式で返答:
{{"category": "...", "urgency": "...", "sentiment": "positive/neutral/negative", "requires_human": true/false, "reason": "..."}}
"""
            }]
        )
        return json.loads(response.content[0].text)

AI自動応答エンジン

FAQデータとAIを組み合わせて、自然な回答を生成する。

class AutoResponder:
    def __init__(self):
        self.client = anthropic.Anthropic()
        self.faq_db = FAQDatabase()

    def generate_response(self, query: str, context: dict) -> dict:
        relevant_faqs = self.faq_db.search(query)
        faq_context = "\n".join(
            f"Q: {f.question}\nA: {f.answer}"
            for f in relevant_faqs
        )

        response = self.client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=1024,
            system="""あなたはカスタマーサポート担当者です。
丁寧で簡潔な回答を心がけてください。
FAQに基づいて回答し、わからない場合は正直に伝えてください。
個人情報や機密情報は絶対に含めないでください。""",
            messages=[{
                "role": "user",
                "content": f"""お客様の問い合わせ:
{query}

参考FAQ:
{faq_context}

カテゴリ: {context.get('category', 'general')}
"""
            }]
        )
        return {
            "response": response.content[0].text,
            "sources": [f.id for f in relevant_faqs],
            "confidence": len(relevant_faqs) / 5
        }

エスカレーション判定ロジック

以下の条件でAIが自動的に人間担当者にエスカレーションする。

エスカレーション条件

  • 緊急度が「critical」
  • 感情分析が「negative」かつ2回目以降の問い合わせ
  • FAQ一致度が低い(confidence < 0.2)
  • 返金・法的問題に関する内容
  • AIが回答に自信がないと判定した場合
class EscalationManager:
    def should_escalate(self, classification: dict, response: dict) -> bool:
        if classification["urgency"] == "critical":
            return True
        if classification.get("requires_human", False):
            return True
        if response["confidence"] < 0.2:
            return True
        if classification["category"] in ("billing", "returns"):
            if classification["sentiment"] == "negative":
                return True
        return False

    def create_escalation_ticket(self, query, classification, ai_response):
        return {
            "original_query": query,
            "category": classification["category"],
            "urgency": classification["urgency"],
            "ai_draft_response": ai_response["response"],
            "escalation_reason": "自動判定による人間対応要求",
            "priority": self._map_priority(classification["urgency"])
        }

    def _map_priority(self, urgency: str) -> int:
        return {"critical": 1, "high": 2, "medium": 3, "low": 4}.get(urgency, 3)

統合パイプラインの実行

全コンポーネントを統合して、問い合わせの受信から応答までを自動化する。

class SupportPipeline:
    def __init__(self):
        self.classifier = TicketClassifier()
        self.responder = AutoResponder()
        self.escalation = EscalationManager()

    def process(self, message: str) -> dict:
        classification = self.classifier.classify(message)
        response = self.responder.generate_response(message, classification)

        if self.escalation.should_escalate(classification, response):
            ticket = self.escalation.create_escalation_ticket(
                message, classification, response
            )
            return {"action": "escalate", "ticket": ticket}

        return {
            "action": "auto_reply",
            "response": response["response"],
            "classification": classification
        }

# 使用例
pipeline = SupportPipeline()
result = pipeline.process("注文した商品がまだ届きません。注文番号は12345です。")
print(result)

運用改善のサイクル

フィードバックループの構築

AIの回答に対する顧客の反応(解決/未解決)を記録し、FAQデータベースを継続的に改善する。未解決率が高いカテゴリを特定し、FAQの追加やAIプロンプトの改善に活用する。

月次レビュー指標

  • 自動応答率の推移
  • エスカレーション率の推移
  • 顧客満足度の変化
  • 対応コストの変化

まとめ

AIカスタマーサポートにより、初回応答時間を4時間から12秒に短縮し、サポートコストを62%削減できる。FAQ整備、分類精度の向上、適切なエスカレーション設計が成功の三要素。小規模から始めて、フィードバックループで継続改善する運用が推奨される。

関連記事

A

Agentive 編集部

AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。