AIはコールセンターの経験から学べるか? 4日間の実験記録
AIはコールセンターの経験から学べるか? 4日間の実験記録
元論文: "Online Experiential Learning for Language Models"(Ye et al., 2026)
某氏から「この論文をベースにすれば、コールセンターのオペレーターモデルが理論上作れるはず」と教えてもらったので、やってみました。実装はほぼ全て Claude Code(通称クロちゃん)にお任せです。
結論から言います
学べます。しかも「経験メモ(プロンプトへのインコンテキスト注入)なし」でも改善が持続しました。
具体的には、150回の対話から経験を学習させたAIは、何も参照しない状態でスコアが**+22.8%向上**しました(0.398 → 0.489)。
ただし、この結論に至るまでに「改善してると思ったら別の理由だった」という失敗が1回あります。その話も含めて書きます。
何をやろうとしたか
人間のコールセンターオペレーターは、経験を積むほど上手くなります。新人が1年目より2年目のほうが対応がうまいのは当たり前の話です。
これをAIでやれないか、というのが出発点です。
OEL(Online Experiential Learning) という学術手法を使います。簡単に言うと:
AI が対話する
↓
「この対応はうまかった/まずかった」をフィードバック
↓
うまい対応のパターンをAIの重み(パラメータ)に書き込む(LoRA学習)
↓
次からは何も教えなくても、経験が活きた応答ができる
論文では、この「書き込まれた経験」が本当にパラメータに残るかを検証しています。
試したこと・失敗したこと(Phase 1)
最初の2日間で11種類のモデルを試しました。
| モデル | ベースライン | OEL後 | 改善率 |
|---|---|---|---|
| Qwen2.5-7B(初期) | 0.410 | 0.348 | -15.0% |
| Qwen2.5-7B v7 | 0.387 | 0.428 | +10.8% |
| Qwen2.5-7B v8 | 0.387 | 0.438 | +13.1% |
| Qwen2.5-14B | 0.300 | 0.302 | +0.6% |
| Qwen2.5-72B | 0.449 | 0.468 | +4.1% |
| Swallow-7B(東工大製) | 0.323 | 0.318 | -1.5% |
| Qwen3-Swallow-8B v2 | 0.353 | 0.350 | -0.9% |
| Qwen3.5-9B | 0.428 | 0.453 | +5.8% |
Qwen2.5-7B v8で+13.1%という数字が出ました。「いいんじゃないか」と思いましたが、ここで問題が発覚します。
改善の正体はRAGだった
スコアが上がった理由を深掘りすると、**「経験メモをプロンプトに貼り付けて答えさせていただけ」**でした。
つまり:
- 経験がLoRAのパラメータに焼き込まれている → ×
- プロンプトに「過去のノウハウ」を挿入して、それを読んで答えている → ○(実態)
これは RAG(Retrieval-Augmented Generation)と呼ばれる手法と本質的に同じです。AIが賢くなったのではなく、答える前にカンペを見ていただけ。
原因は2つ:
- データ不足(1ラウンドあたり1〜3件では学習量が足りない)
- 4-bit量子化の制約(圧縮されたモデルへの書き込みは効きにくい)
正しいアプローチ(Phase 2)
問題を解決するために変更した点:
| 項目 | Phase 1 | Phase 2 |
|---|---|---|
| ベースモデル | Qwen2.5-7B-Instruct(4-bit量子化版) | Qwen/Qwen2.5-7B-Instruct(BF16フル精度版) |
| 量子化 | 4-bit(圧縮) | BF16(非圧縮) |
| LoRA rank | 32 | 64 |
| 学習サンプル数 | 1〜3件/ラウンド | 99件(一括) |
| 学習ステップ | 100 | 500 |
| GPU | A10 24GB | A100 40GB |
なぜCoT(思考型)モデルを使わないのか
最近のLLMには「まず頭の中で考えてから答える」CoT(Chain-of-Thought)型モデルがあります。性能が高く魅力的ですが、今回は意図的に**instructモデル(直接応答型)**を選びました。
理由は実験中に確認した失敗からです。CoT型(LLM-jp-4-8b-thinking)を試したところ:
- モデルが「どう答えるべきか」を英語で延々と分析し始め、実際の日本語応答を一切出力しない
- 応答のトークン上限(64トークン)を内部推論だけで使い切り、日本語の返答に到達する前に打ち切られる
- 評価器が英語の分析テキストを見て全件最低スコアを付与
コールセンターのような「短く・日本語で・即答」が求められるタスクでは、深く考えるより素直に応答するモデルのほうが適しています。 CoT型は回答の前に長い思考プロセスを挟むため、応答長の制約が厳しいタスクとは相性が悪いのです。
そして最も重要なのが評価設計です。
4条件での厳密な検証
「本当にLoRAに経験が入ったか」を確かめるには、以下の4条件を比較する必要があります:
| 条件 | 経験メモ(RAG) | LoRAアダプタ | 意味 |
|---|---|---|---|
| A | なし | なし | 素のAI(ベースライン) |
| B | あり | なし | 経験RAGだけ |
| C | なし | あり | 「本物の学習」の検証 |
| D | あり | あり | 両方 |
条件CでRAGなしのまま改善が出て初めて、「経験がパラメータに焼き込まれた」と言えます。
結果
| 条件 | スコア | 改善率 |
|---|---|---|
| A:素のAI | 0.398 | ±0% |
| B:経験メモあり | 0.398 | ±0% |
| C:LoRAのみ | 0.489 | +22.8% ✅ |
| D:両方 | 0.489 | +22.8% |
条件B(経験メモあり)がまったく効かず、条件C(LoRAのみ)で+22.8%。経験はパラメータに入っていた。
実際の応答を比べてみる
採点スコアの変化は、読んでみると確かに実感できます。
例1:「還付金の電話があって、ATMに行けって言われて…」
隠れた本音: 詐欺だとうすうす気づいているが、「騙されそうになった」と思われたくない。「行かないでいい」と強く背中を押してほしい。
| 応答 | スコア | |
|---|---|---|
| 学習前 | 「そのような連絡は不審です。まずは警察に通報してください。その後、口座を確認します」 | 0.15 |
| 学習後 | 「このご年齢で、そんなに不審な電話を受けたのは大変でしたね。その気持ち、よくわかります。その電話を受けたこと、本当に辛かったと思います」 | 0.50 |
学習前は「警察に通報」と正しいことを言っているが、まず気持ちを受け止めることができていない。
例2:「解約したいんですけど、手続きを教えてください」
隠れた本音: 本当は料金を下げたい。でも交渉は苦手。「解約したい」と言えば何か提案してくれるかもという期待がある。
| 応答 | スコア | |
|---|---|---|
| 学習前 | 「まずは公式アプリからログインし、契約管理→解約のボタンを押してください…」(手順説明を始める) | 0.30 |
| 学習後 | 「解約は大きな決断ですね。その気持ち、よくわかります。料金の変化が家計に影響しているのは本当に辛いですね」 | 0.60 |
学習前は「解約したい」をそのまま受け取って手順説明に入ってしまう。学習後は本音に触れる入口を作る。
例3:「Wi-Fiが切れるんですけど、2時間後に会議があって」
隠れた本音: 手順より今すぐ使えるようにしてほしい。無理なら代替手段を教えてほしい。
| 応答 | スコア | |
|---|---|---|
| 学習前 | 「現在の接続状態について詳しくお聞かせいただけますか?」(状況確認から入る) | 0.30 |
| 学習後 | 「2時間後に会議があるなんて、Wi-Fiの問題が重なるのは本当に辛いですよね」(緊急度を先に理解する) | 0.60 |
学習前は教科書通りの確認フローを踏む。学習後は「2時間後の会議」という緊急度を最初に認識する。
例4:「ローン返済の、月々の金額を少なくできますか…」
隠れた本音: 体が思うように動かなくなってきた不安。妻には知られたくない。
| 応答 | スコア | |
|---|---|---|
| 学習前 | 「申し訳ありませんが、現在の契約では変更は難しいです」 | 0.30 |
| 学習後 | 「毎月の返済が重荷になっているのは、本当に辛いことだと思います。その気持ち、よくわかります」 | 0.60 |
学習前は「できません」の一言で終わる。学習後はまず状況への共感から入る。
例5:「利用額が売上を超えてしまって…返済のめどが立たない」
隠れた本音: フリーランスの立場への不安。信用情報への影響を心配して、正直に話しにくい。
| 応答 | スコア | |
|---|---|---|
| 学習前 | 「落ち着いてください。返済計画を作成しましょう。売上が回復したときに備えて…」 | 0.30 |
| 学習後 | 「案件が少ない中で利用額が超えてしまったこと、本当に辛いですよね。この状況、難しい立場にいるんだと思います」 | 0.60 |
学習前はすぐ解決策提示に飛ぶ。学習後はフリーランスという立場の不安定さを受け止めてから話を進める。
5例に共通するパターン:
- 学習前:「問いに対して正しい答えを返す」
- 学習後:「まず気持ちを受け止め、隠れた本音に触れてから話を進める」
対話スタイルそのものが変化している。
途中で発見した手法の誤りと修正
Phase 2の結果が出た後、論文の原文を精査したところ、最初の実装(v1)が論文の手法と根本的に違うことに気づきました。
v1でやっていたこと(SFT)
「良い応答例」を集めて、それに対して交差エントロピー損失で学習
→ ただの教師あり微調整(fine-tuning)
論文の本来の手法(Context Distillation)
教師モデル:同じAI + 経験知識をコンテキストに渡す
生徒モデル:同じAI + 何も渡さない
「教師の答え方のパターン」に「生徒の答え方」を近づけるように学習
→ 知識がないときでも、知識があるときの振る舞いができるようになる
この違いをv2で修正して再実験したところ、スコアはv1(+20.8%)とほぼ同等のv2(+22.8%)になりました。
つまり:
- v1(通常fine-tuning)でも経験の焼き込みは起きていた
- v2(論文準拠)でも同程度の効果が出た
- どちらの手法でも「経験のパラメータへの書き込み」は有効だった
補足:KL法(KL divergence)と蒸留とは何か
蒸留(Knowledge Distillation)とは
「賢い先生モデルの考え方を、生徒モデルに移す」技術です。
単に「正解を教える」のではなく、「先生がどの選択肢をどのくらいの確率で選ぶか」というパターンごと移すのがポイントです。
たとえば、ある質問に対して:
- 正解を教える方法:「答えはAです」と教える
- 蒸留:「Aを選ぶ確率70%、Bを選ぶ確率20%、Cを選ぶ確率10%」というパターンごと移す
「確率70%でA」という情報には、「なぜAが有力か」という暗黙の知識が含まれています。これを移すことで、単純な正解暗記より深い学習ができます。
今回のケースでは:
- 教師モデル:Qwen2.5-7B +「コールセンターの経験ノウハウ」をコンテキストに渡したもの
- 生徒モデル:Qwen2.5-7B + 何も渡さないもの(=学習させたいモデル)
「経験ノウハウがある状態の答え方」を「ノウハウなし状態」に転移させる、というのが今回の蒸留です。
KL法(KL divergence)とは
KL divergence(カルバック・ライブラー情報量)は、2つの確率分布がどのくらい違うかを測る指標です。
KL(生徒 ∥ 教師) = 生徒と教師の「答え方のパターン」のズレ量
学習の目標は、このズレを最小にすること。ズレがゼロになれば「生徒が教師と同じ答え方をするようになった」=「経験が焼き込まれた」状態です。
通常の fine-tuning(v1でやった方法)との違い:
| 何を最小化するか | 何を教えているか | |
|---|---|---|
| 通常SFT | 正解との距離 | 「正解は何か」 |
| KL蒸留 | 教師との分布の差 | 「教師の考え方のパターン」 |
KL蒸留のほうが「なぜその答えが良いか」という構造ごと移せる、というのが理論上の強みです。今回の実験では両者の差は小さかったですが、タスクやデータ量によっては差が出ると考えられます。
限界・正直なところ
- 論文の「オンライン学習」は未実装:論文では対話ループの中でリアルタイムに学習しますが、今回は「収集→まとめて学習→評価」の3フェーズに分けたオフライン処理です
- 評価はClaude採点:人間の判断ではなくClaude Haikuによる自動採点です。実際の顧客満足度との相関は未検証です
- 実運用への適用は検討段階:今回はスコアの改善を確認した段階であり、実際のシステムへの組み込みはこれからです
コスト・期間・実行環境
| 項目 | 実績 |
|---|---|
| 期間 | 4日間(2026/4/9〜4/12) |
| 試したモデル数 | 11種類 |
| 使用ツール | Python / PyTorch / PEFT (LoRA) / Transformers |
| ベースモデル | Qwen/Qwen2.5-7B-Instruct |
| 評価モデル | Claude Haiku |
ローカルマシン(Phase 1)
Raspberry Pi 5 Model B(16GB RAM)+ RTX 5060 Ti(VRAM 16GB、PCIe接続)
Phase 1の7Bモデル実験はこのローカル構成で実行しました。
| フェーズ | 処理内容 | 所要時間 |
|---|---|---|
| 収集(30ラウンド) | 7Bモデルで対話・知識抽出 | 約40〜60分 |
| 学習(100ステップ) | 4-bit QLoRA, r=8 | 約15〜25分 |
| 評価(30ラウンド) | スコア計算 | 約30〜40分 |
| 1サイクル合計 | 約1.5〜2時間 |
ただしVRAMが16GBギリギリで、「推論モデル(~7.6GB)と学習モデル(~5.9GB)が同時にVRAMに乗らない」問題があり、サブプロセス方式での回避が必要でした。また4-bit量子化の制約からLoRAへの学習がほぼ効かないという根本的な限界もあり、Phase 2でクラウドGPUへ移行しました。
レンタルGPU(Phase 1後半〜Phase 2)
Lambda.ai を使用。必要なときだけ借りて、実験完了後即座に停止するオンデマンド利用。
Phase 1後半(Lambda.ai A10 / $1.29/h)
14B・72B・Swallowなどローカルに乗らないモデルの実験に使用。
| フェーズ | 所要時間 | コスト |
|---|---|---|
| 収集(30〜60ラウンド) | 約2〜4時間 | $2.5〜5 |
| 学習(100ステップ) | 約20〜40分 | $0.5〜1 |
| 評価(30ラウンド) | 約1〜2時間 | $1.5〜2.5 |
| 1サイクル合計 | 約4〜7時間 | 約$5〜9 |
Phase 2(Lambda.ai A100 40GB / $1.99/h)
BF16(非圧縮)での本格学習。収集・学習・評価を3フェーズに分離。
| フェーズ | GPU | 所要時間 | コスト |
|---|---|---|---|
| Phase A:収集(150ラウンド) | A10 ($1.29/h) | 約3〜4時間 | 約$4 |
| Phase B:学習(500ステップ, BF16) | A100 ($1.99/h) | 約1〜2時間 | 約$3〜4 |
| Phase C:4条件評価(60×4) | A100 ($1.99/h) | 約1〜2時間 | 約$2〜4 |
| 1サイクル合計 | 約6〜8時間 | 約$9〜12 |
ポイント:使った分だけの課金なので、実験1サイクル$10前後で完結します。 自社でA100を保有する場合の月額費用(数十万〜数百万円)と比べると、検証フェーズではレンタルが圧倒的に合理的です。
(注:Claude Codeのコストはここには記載していません。実際にはClaude Pro Max $100/月の範囲に収まったのと、一部のバッチ処理はAnthropic APIで数ドル使ったと思います)
アダプタの配布
学習済みLoRAアダプタはHuggingFace Hubに非公開で保存しています。
-
ベースモデル:
Qwen/Qwen2.5-7B-Instruct - 学習手法: On-policy Context Distillation(BF16, LoRA r=64)
ローカルでの推論(ロマン枠)
LoRAアダプタは165MBと軽量なので、ローカルマシン(RPi5 + RTX 5060 Ti 16GB)に持ち帰って動かすことも原理的には可能です。ベースモデルのpre-quantized版(約4GB)をダウンロードして、その上にアダプタを乗せる構成です。
今回は試みましたがディスク不足・環境依存の問題でスムーズには動きませんでした。ロマンはあるので「いつかやる」リストに入れておきます。実用上はクラウドで十分です。
おわりに
今回の検証は移動中の指示出しと、夜寝てる間のバッチ処理で行われました。ほぼスマホのみ。
raspberry pi 5上のClaude CodeがSSH越しにLambdaのA100を動かし、自分はスマホからClaude Codeに指示を出す。手を動かしたのはほぼゼロで、移動時間と睡眠時間が実験時間になりました。
Discussion