本文へスキップ

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 ライブラリに入っています。

bash
npm install decidekit
ts
import { 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 には渡したラベルのリテラル型が付くので、すべての分岐をコンパイラーが確認します。

ts
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 通り ​

  1. ラベル名から。 ["refund", "bug_report", "praise"] を渡すと、ゼロショットで判定します。ラベルごとに 1 行の説明を足すと 7〜10 ポイント良くなります。describeLabels() は LLM に頼んで説明を一度だけ書かせます。
  2. 例から、ページの中で。 train() は Web Worker の中で、ユーザー自身のデータに小さなヘッドを当てはめます。BANKING77 の 10,003 例は、18 ms を超えるページの停止なしに訓練できました。
  3. 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 で教えてください。

bash
npm install decidekit