# LLM が間違えるとき：その答えで小さなモデルを訓練する {#when-the-llm-is-wrong-training-a-small-model-on-its-answers}

自信がないときは LLM に尋ね、その答えで訓練する小さなローカルモデルは、だんだん LLM を必要としなくなるはずです。LLM が完璧ならそうなります。BANKING77 では送る割合が 23% まで下がりました。15% の割合で間違える LLM では、64% のままでした。間違った答えは精度をほとんど動かさず（90.2% 対 92.0%）、壊したのは確信度でした。確信度を別の例の集合で当てはめると、送る割合は 24〜31% に戻りました。実際の Llama 3.1 8B の答えでは、送る割合は 30% から 19% に下がりました。

ここの数字はすべて、[decidekit/eval](https://github.com/debuffjp/decidekit/tree/main/eval) のスクリプトと、コミットされたその結果ファイルから来ています。

| BANKING77、77 ラベル、LLM の答えの 15% が誤り | LLM に送った割合 | テストでのヘッドの精度 |
|---|---|---|
| 完璧な LLM | 23% | 92.0% |
| LLM の答えで較正 | 64% | 90.2% |
| ラベルごとに 2 つの確認済みの例で較正 | 24% | 90.1% |
| ゼロショットの確信した答えで較正（ラベルなし） | 31% | |

10,003 件のメッセージのストリームの最終ラウンド。[eval/long-stream.ts](https://github.com/debuffjp/decidekit/blob/main/eval/long-stream.ts)。

## 設定 {#the-setup}

[Decide](/ja/decidekit/) は、文エンコーダー（bge-small-en-v1.5、34 MB）を、softmax 層 1 つの分類器にします。`withFallback()` は確信度が 0.9 以上ならローカルで答え、そうでなければ LLM を呼びます。答えはすべて訓練例になり、ヘッドは数百件の答えごとに再訓練されます。

確信度は、取り分けておいた訓練例で当てはめた温度から得ます。ラベルが正しければこれはうまくいきます。ここではラベルが LLM の答えです。

誤り率を制御するため、LLM を代役に置き換えました。代役は正しく答えますが、決めた割合のメッセージでは、ゼロショットが最上位に挙げた誤ったラベルを返します。隣のインテントという、もっともらしい種類の間違いです。

## 1. 誤ったラベルが壊すのは精度ではなく確信度 {#_1-wrong-labels-break-confidence-not-accuracy}

softmax ヘッドは例の平均をとるので、15% の誤ったラベルで失う精度は数ポイントだけです。温度ではそうはいきません。温度は、確信度が取り分けたラベルとヘッドの一致率に合うように当てはめられ、そのラベルの 15% が誤りです。当てはめた温度は 0.9 に届く答えがほとんどなくなるまで上がり、ほぼすべてがまた送られます。ノイズ 30% では 86% が送られました。

## 2. 信頼できる例で確信度を当てはめる {#_2-fit-confidence-on-examples-you-trust}

`train()` は `calibrateOn` を受け取ります。温度の当てはめにだけ使う例です。ラベルごとに 2 つの手で確認した例（合計 154）を使うと、ノイズ 15% での送る割合は 64% から 24% に下がり、完璧な LLM の水準になりました。

ほとんどのアプリで例を手で確認することはないので、`withFallback` が自分で集合を作ります。ラベル名から始めて、ゼロショットが 0.9 以上で答えたテキストを（ラベルごとに最大 4 つ）、ゼロショットの答えをラベルとして残します。その約 7% は誤りですが、その誤りは LLM の誤りとは連動しません。ノイズ 15% では 31% が送られ、ノイズ 30% では 86% に対して 36% でした。

実際の誤りのように、誤りが難しいテキストに集中する場合も、結果は両方のデータセットで変わりませんでした。CLINC150（150 ラベル）では、ゼロショットの集合は手で確認した例と同等でした。送った割合は 21% 対 20% で、LLM 自身の答えでは 43% でした。

## 3.「どれでもない」を学ぶ {#_3-learn-none-of-these}

実際のトラフィックには、どのラベルにも当てはまらないテキストが含まれます。LLM は `null` と答え、その答えは捨てられていました。これを追加のラベルとして学ぶと、ヘッドは話題外のテキストを自分で断れます。話題外のトラフィックが 4.5% の CLINC150 では、取り分けた話題外のクエリのうち、確信した誤ったラベルの付いた割合は 7.6% から 3.8% へと半分になりました。

しかし LLM は、実際にはあるラベルに属するあいまいなテキストにも `null` と答えます。Llama 3.1 8B は範囲内のメッセージの 6.6% でそうしました。こうしたテキストはラベルの近くにあります。最も近いラベルとの類似度の中央値は 0.77 で、話題外のテキストなら 0.46 です。そこで Decide は、テキストとすべてのラベルとの類似度が 0.6 未満のときだけ `null` を学びます。

## 4. 実際の LLM で {#_4-with-a-real-llm}

1,732 件のメッセージ（BANKING77 の 12 インテントと、話題外のクエリ 70 件）について、Llama 3.1 8B の答え（Workers AI）を記録しました。8B がデータセットと一致したのは 89% です。5 通りの順序で `withFallback` に流して再生しました。

| | 後半で送った割合 | 範囲内をローカルで正しく答えた割合 | 話題外に誤ったラベルを付けた割合 |
|---|---|---|---|
| ゼロショットのみ | 30.1% | | |
| LLM の答えで較正、null を捨てる | 24.6% | 78.3% | 6.7% |
| Decide のデフォルト | 19.1% | 83.3% | 2.4% |

スクリプト：[eval/real-stream.ts](https://github.com/debuffjp/decidekit/blob/main/eval/real-stream.ts)。[2 レーンのデモ](/decidekit/lanes/)は同じ答えを再生します。

## この結果が示さないこと {#what-this-doesn-t-show}

- 実際の LLM での実行は、1 つのモデルによる 12 ラベルのタスク 1 つだけです。ラベル数の多い結果は代役の LLM を使っています。
- 類似度 0.6 のゲートは bge-small 向けに調整されています。CLINC150 では安全面の改善（誤ったラベル 4.4%）は保ちますが、ローカルで答える話題外のテキストは減ります。ゲートなしの 56% に対して 24% です。`multilingual-e5-small` は無関係なテキストでさえ 0.6 を超えるので、このモデルではゲートが働きません。
- ゼロショットの確信した答えが較正用の集合として良いのは、あなたのラベルに対するゼロショットの精度がそこそこあるときだけです。名前から意味がわかりにくいラベルには、それぞれ 1 行の説明を書いてください。

自分のラベルで試すには、`npm install decidekit` を実行してから [フォールバックのガイド](https://github.com/debuffjp/decidekit/blob/main/docs/guide-fallback.md) に従ってください。