Decide の紹介:ブラウザで動く System One モデル
Decide はテキストを読み、あなたのラベルから 1 つを、ユーザーのブラウザの中で選びます。Chrome で約 8 ms です。サーバーや API キーは要りません。確信度は額面どおりの意味を持ち、0.9 の答えは約 90% の割合で正解です。自信がないときは LLM に尋ね、その答えから学びます。実際の Llama 3.1 8B の答えを見ながら動かすと、LLM に送ったメッセージの割合は 30% から 19% に下がりました。ブラウザで試せます。
小さな、ローカルの Jev
「System One モデル」という言葉を定着させたのは TypeSafe の Jev です。文章を書くのではなく、テキストを一度読んで、較正された確信度付きの型のある判定を返すモデルです。Jev は API の向こうで動きます。Decide は同じ種類のモデルで、ユーザーのデバイスで動くほど小さいものです。そのため判定は 1 回ごとに無料かつプライベートで、数ミリ秒で終わります。大きなホスト型モデルより精度は低く、だからこそ確信度が大切です。Decide が確信しているときはコードが単独で動き、そうでないときは助けを求められます。
すでに Jev 向けにコードを書いている場合は、decidekit/typesafe が Choice の質問について同じ systemOne({ state, questions }) の形を提供します。違いはガイドにまとめています。
試す
Decide は decidekit ライブラリに入っています。
npm install decidekitimport { createDecider } from "decidekit";
const d = await createDecider();
const { choice, confidence } = await d.decide("my card still hasn't arrived", ["card_arrival", "lost_card", "refund"]);
// choice: "card_arrival", typed as your labels| BANKING77、77 ラベル、全訓練データ | 90.7%(0.2 から 93.1%) |
| CLINC150、150 ラベル、全訓練データ | 94.4%(0.2 から 96.3%) |
| BANKING77、ラベルごとに 5 例 | 82.3% |
| 較正誤差、ラベルごとに 10 例以上で訓練したヘッド | 0.008〜0.029 |
| Chrome での 1 回の判定(ワーカー、中央値) | 7.7 ms |
Ryzen 7 260 搭載のノート PC で、デフォルトのモデル(bge-small-en-v1.5、34 MB、ダウンロードは 1 回だけ)を使って計測しました。全体の表と、それを出したスクリプトは README にあります。
ラベルがそのまま型になる
choice には渡したラベルのリテラル型が付くので、すべての分岐をコンパイラーが確認します。
const labels = ["refund", "bug_report", "praise"] as const;
const { choice } = await d.decide(text, labels);
switch (choice) {
case "refund": return openRefund();
case "bug_report": return fileBug();
case "praise": return thank();
}ラベルの名前を変えると、古い名前を扱っていた箇所を TypeScript がすべて教えてくれます。学習済みヘッドもラベルを持ち運びます。decidekit train examples.csv --types はラベルをユニオン型にした .ts ファイルを書き出すので、ほかの人が学習したヘッドでもコードに型が付きます。
始め方は 3 通り
- ラベル名から。
["refund", "bug_report", "praise"]を渡すと、ゼロショットで判定します。ラベルごとに 1 行の説明を足すと 7〜10 ポイント良くなります。describeLabels()は LLM に頼んで説明を一度だけ書かせます。 - 例から、ページの中で。
train()は Web Worker の中で、ユーザー自身のデータに小さなヘッドを当てはめます。BANKING77 の 10,003 例は、18 ms を超えるページの停止なしに訓練できました。 - LLM から、使いながら。
withFallback()は確信できるものには自分で答え、残りをあなたのask関数に送ります。答えは 1 つずつ訓練例になるので、送る割合は下がり続けます。
ときどき間違える LLM から学ぶ
LLM の答えは正解データではありません。Llama 3.1 8B がデモのメッセージで BANKING77 のラベルと一致したのは 89% でした。間違った答えはヘッドの精度をほとんど動かしませんでしたが、確信度を台なしにし、そのせいで尋ね続けました。いまの Decide は、ゼロショットがすでに確信していた答えで確信度を当てはめ、LLM の「どれでもない」という答えを学んで、話題外のテキストを自分で断れるようにしています。方法と数字は研究記事 LLM が間違えるとき にあります。
2 レーンのデモは実際の Llama の答えを再生するので、割合が下がっていくのを見られます。
できないこと
- トーン。 テキストがどう感じているかより、何について書かれているかを読むほうが得意です。ツイートの感情極性で 61%、ラベルごとに 32 例での感情分類で 49% です。
- 長い文書。 読めるのは段落 1 つ程度です。長いテキストは分割してください。
- 英語以外の言語(デフォルトのモデルの場合)。
multilingual-e5-smallは日本語と中国語のインテントで 76% に達します(デフォルトでは 55% と 40%)。確信度も較正されていて、サイズは約 118 MB です。
バージョンは 0.1 で、MIT ライセンスです。あなたのデータで何が当たり、何が外れたかを Discussions か debuff Discord で教えてください。
npm install decidekit