🐥

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