Klarna — AI Assistantによるカスタマーサポート革命
企業概要
| 項目 | 内容 |
|---|
| 企業名 | Klarna(クラルナ) |
| 業種 | フィンテック(後払い決済) |
| 設立 | 2005年(スウェーデン) |
| ユーザー数 | 8,500万人以上 |
| 対応言語 | 35言語以上 |
| 公式情報 | OpenAI公式ケーススタディ |
課題
- 月間数百万件のCS問い合わせに対し、人的リソースでの対応が限界
- 35言語以上をカバーする多言語対応のコスト増大
- 返金・返品・支払い状況確認などの反復業務に人手を取られる
技術選定の理由
LLMの選択: OpenAI GPT-4(外部LLM)
- なぜOSSではなくOpenAI?: 35言語以上の多言語対応が必要であり、当時OSSモデル(Llama 2等)では多言語性能が不足していた
- なぜRAGではなくプロンプトエンジニアリング?: FAQ・返品ポリシー等の構造化されたデータはシステムプロンプトに直接埋め込める規模であり、RAGのオーバーヘッドを回避
- 最適化手法: Meta-prompting(GPT-4自身にプロンプトを最適化させる手法)を採用
フレームワーク: LangGraph + LangSmith
- LangGraph: マルチステップのAgent制御(分類→情報取得→回答生成→確認)
- LangSmith: プロンプトのA/Bテスト、レイテンシ監視、品質トラッキング
システムアーキテクチャ
┌──────────────┐ ┌─────────────┐ ┌──────────────┐
│ 顧客チャット │────▶│ 言語検出 │────▶│ 意図分類 │
│ (35+ 言語) │ │ Agent │ │ Agent │
└──────────────┘ └─────────────┘ └──────┬───────┘
│
┌───────────────────────────┼────────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ FAQ応答 │ │ 注文状況 │ │ 返金処理 │
│ Agent │ │ 確認Agent │ │ Agent │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└───────────────────────────┼────────────────────┘
▼
┌──────────────────┐
│ エスカレーション │
│ 判定 Agent │
└──────────────────┘
実装例: LangGraphベースのCS Agent
以下はKlarnaが採用したアーキテクチャを参考にした実装例です。
1. 依存関係
pip install langchain langgraph langsmith openai
2. Agent定義
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
from typing import TypedDict, Literal
import json
class CSState(TypedDict):
user_message: str
language: str
intent: str
response: str
needs_escalation: bool
llm = ChatOpenAI(model="gpt-4o", temperature=0)
def classify_intent(state: CSState) -> CSState:
result = llm.invoke([
SystemMessage(content="""あなたは問い合わせ分類Agentです。
以下のカテゴリに分類してください:
- faq: よくある質問
- order_status: 注文状況確認
- refund: 返金・返品
- payment: 支払い関連
- escalation: 人間対応が必要
JSON形式で {"intent": "カテゴリ"} を返してください。"""),
HumanMessage(content=state["user_message"])
])
parsed = json.loads(result.content)
state["intent"] = parsed["intent"]
state["needs_escalation"] = parsed["intent"] == "escalation"
return state
KLARNA_FAQ = """
Q: 返品期限は? A: 商品到着後30日以内です。
Q: 分割払いの手数料は? A: 4回払いまでは手数料無料です。
Q: 支払い方法の変更は? A: アプリの「支払い」セクションから変更可能です。
"""
def handle_faq(state: CSState) -> CSState:
result = llm.invoke([
SystemMessage(content=f"""あなたはKlarnaのFAQ対応Agentです。
以下のFAQデータを基に回答してください。
FAQにない場合は「専門スタッフに確認します」と回答してください。
{KLARNA_FAQ}"""),
HumanMessage(content=state["user_message"])
])
state["response"] = result.content
return state
def handle_refund(state: CSState) -> CSState:
result = llm.invoke([
SystemMessage(content="""あなたは返金処理Agentです。
顧客に返金手順を説明し、必要情報(注文番号・理由)を確認してください。
返金は承認後5-7営業日で処理されることを伝えてください。"""),
HumanMessage(content=state["user_message"])
])
state["response"] = result.content
return state
def route_intent(state: CSState) -> Literal["faq", "refund", "escalate"]:
if state["needs_escalation"]:
return "escalate"
if state["intent"] in ("faq", "order_status", "payment"):
return "faq"
return "refund"
def handle_escalation(state: CSState) -> CSState:
state["response"] = "専門スタッフにお繋ぎします。少々お待ちください。"
return state
graph = StateGraph(CSState)
graph.add_node("classify", classify_intent)
graph.add_node("faq", handle_faq)
graph.add_node("refund", handle_refund)
graph.add_node("escalate", handle_escalation)
graph.set_entry_point("classify")
graph.add_conditional_edges("classify", route_intent,
{"faq": "faq", "refund": "refund", "escalate": "escalate"})
graph.add_edge("faq", END)
graph.add_edge("refund", END)
graph.add_edge("escalate", END)
app = graph.compile()
result = app.invoke({
"user_message": "先週の注文を返品したいのですが",
"language": "", "intent": "", "response": "",
"needs_escalation": False
})
print(result["response"])
3. データの準備方法
import requests
from bs4 import BeautifulSoup
def scrape_help_center(url: str) -> list[dict]:
"""ヘルプセンターのHTMLからQ&Aペアを抽出"""
resp = requests.get(url)
soup = BeautifulSoup(resp.text, "html.parser")
faqs = []
for article in soup.select(".help-article"):
faqs.append({
"question": article.select_one("h2").text,
"answer": article.select_one(".content").text,
"category": article.get("data-category", "general"),
})
return faqs
成果
| 指標 | 導入前 | 導入後 | 改善幅 |
|---|
| 月間AI対応数 | — | 230万件 | — |
| 平均解決時間 | 11分 | 2分以下 | -82% |
| リピート問い合わせ | — | — | -25% |
| 年間コスト削減 | — | — | $40M |
| FTE相当 | — | 700名分 | — |
学びと再現のポイント
- 小さく始める: Klarnaも最初はFAQ応答のみでPoC → 段階的にRefund/Order等を追加
- Meta-prompting: GPT-4にプロンプトを書かせてA/Bテストする手法が有効
- 人間レビューのループ: 最初の1ヶ月は全回答をサンプリングしてレビュー
- LangSmithで品質監視: レイテンシ・成功率・顧客満足度を継続的にトラッキング