FAQ
どの言語に対応していますか?
デフォルトのモデルは英語向けです。他の言語には Decide Multilingual を使ってください。
const d = await createDecider({ model: "debuffjp/decide-multilingual" });Decide Multilingual は intfloat の multilingual-e5-small に由来する Xenova/multilingual-e5-small の無変更のコピーで、下の表の e5 はこのモデルです。0.1.1 より前のこの例は Xenova の ID を使っていました。その ID は今でも動きます。decidekit はこのモデルの設定(必要な "query: " という接頭辞、温度)を知っているので、確信度は較正されたままです。ダウンロードは 34 MB に対して約 118 MB です。MASSIVE(60 インテント、ラベル名は英語、言語ごとに 2,000 件のテストメッセージ、eval/multilingual.ts)の結果です。
| デフォルト、日本語 | e5、日本語 | e5、中国語 | e5、ドイツ語 | e5、英語 | デフォルト、英語 | |
|---|---|---|---|---|---|---|
| ゼロショット | 6.4% | 43.5% | 38.5% | 40.0% | 51.4% | 61.9% |
| ラベルごとに 10 例 | 30.8% | 68.4% | 69.5% | 60.4% | 70.2% | 76.1% |
| 全訓練データ | 55.0% | 76.5% | 76.5% | 71.6% | 78.6% | 85.6% |
| 英語の例だけで訓練 | 9.0% | 70.1% | 65.3% | 60.8% |
最後の行は、英語の例で訓練した 1 つのヘッドが、多少の損失で他の言語でも動くことを示します。訓練した e5 のヘッドの較正誤差は約 0.03 です。英語のテキストにはデフォルトのモデルを使ってください。精度が 7 ポイント高くなります。
デフォルトのモデル専用に調整した設定が 2 つあります。1 つは withFallback の話題外ゲート(noneBelow)です。e5 は無関係なテキストでも類似度が 0.8 前後なのでゲートが働かず、「どれでもない」を学びません。もう 1 つはラベルの説明の温度で、e5 では計測していません。ONNX の重みを持つ他の Hugging Face モデルも model に渡せますが、計測はしていません。
長いテキストを読めますか?
短いテキストが最適で、段落 1 つ程度です。エンコーダーが読むトークン数には限りがあり、残りは無視するので、長い文書は冒頭で判断されます。長い文書を分類するには、段落に分けてそれぞれ判定するか、意味を担う部分(件名、タイトル、最初の段落)で判定してください。
ユーザーのテキストはデバイスの外に出ますか?
いいえ。ブラウザでは、モデルとヘッドはユーザーのタブで動き、訓練もそこで動きます。decidekit 自身が行うネットワークリクエストは、Hugging Face または自分の modelHost からのモデルファイルのダウンロードだけです(ほかには自分で取得するヘッドファイルがあります)。
オフラインで動きますか?
最初の訪問のあとなら動きます。モデルファイルはブラウザにキャッシュされ、残りはあなたの静的ファイルです。最初の読み込みにはネットワークが必要です。ブラウザがキャッシュを消すと、モデルをもう一度ダウンロードします。Node では、最初のダウンロードのあと transformers.js がキャッシュディレクトリにファイルを保持します。
動かすコストは?
呼び出しごとのコストはありません。コストは最初のダウンロード(バンドラーの wasm エイリアスを使って、モデル 34 MB と wasm 12.9 MB、gzip で 3.3 MB)と、ユーザーの CPU です。判定 1 回の中央値は Chrome で約 8 ms、Node の decideMany() で 1 テキスト 1.1 ms です。リリース前のデフォルトの all-MiniLM-L6-v2 は約 36 MB と 3-5 ms でした。
これと LLM のどちらを使うべきですか?
答えが決まったラベルのどれかで、例を集められるなら decidekit を使ってください。LLM を使うのは次のような場合です。答えが自由回答のとき。テキストの外の事実をもとに推論するとき。例がなく、ゼロショットの 66-73%(ラベル名)や 72-83%(1 文の説明)では足りないとき。LLM の構造化出力でも型付きの選択は得られますが、API が必要で、呼び出しごとに費用がかかり、確信度は較正されていません。
組み合わせもできます。ローカルで判定し、minConfidence を下回る答え(choice が null)だけを大きなモデルに送ります。
jimothy と比べるとどうですか?
jimothy(MIT)も、較正された確信度を持つ型付きのローカル分類器を作ります。BANKING77 での報告値は、独自の分割と all-MiniLM-L6-v2 で 92.4% です。decidekit 0.2 は、データセットのテスト分割と Decide Small で 93.1% です(0.2 より前は 90.7%)。分割とエンコーダーが違うので、直接は比べられません。decidekit 0.2 の Adam の設定は jimothy のソースから来ています。jimothy の訓練は Node で、推論はワーカーで動きます。Node で事前に訓練するなら jimothy を選んでください。ユーザー自身のデータからページの中で訓練する必要があるなら decidekit を選んでください。
transformers.js のゼロショットパイプラインは?
NLI ベースで、結果に型がなく、スコアは較正されていません。decidekit のゼロショットは埋め込みを比べ、選択にラベルの型を付け、同じ decide() の呼び出しのまま訓練済みヘッドに移れます。
WebGPU を使いますか?
デフォルトでは使いません。createDecider({ device: "webgpu" }) はデバイスを transformers.js に渡しますが、ワーカーの中の WebGPU はまだ完成しておらず、計測もしていません。デフォルトはブラウザで wasm、Node で cpu です。WebGPU を使うなら、バンドラーの wasm エイリアスは外してください。
スマートフォンで動きますか?
まだテストしていません。デスクトップと同じダウンロード(最初の訪問でモデル 34 MB と wasm)が必要で、スマートフォンの CPU では判定が遅くなります。頼る前に、対象のデバイスで計測してください。
Node とブラウザのどちらですか?
どちらも同じコードが動きます。Node では decidekit の createDecider() を使います。バッチには decideMany() が高速です。ブラウザでは decidekit/browser の createWorkerDecider() を使います。同じデサイダーを Web Worker で動かすので、ページは固まりません。よくある分け方は、Node か CLI で訓練し、ヘッドファイルを配布し、ブラウザで判定するものです。例がユーザーから来るなら、ブラウザで訓練もできます。
ヘッドのライセンスは?
自分のデータで訓練したヘッドはあなたのものです。decidekit 自体は MIT です。heads/ の既製のヘッドは公開データセットから作られていて、そのライセンスを引き継ぎます。BANKING77 は CC BY 4.0(PolyAI)、CLINC150 は CC BY 3.0(Clinc)です。配布するときはデータセットのクレジットを記載してください。
自分のデータでどのくらい正確ですか?
ラベルがどれだけ区別できるか、例がいくつあるかで変わります。2 つの公開インテントベンチマークでは、訓練したヘッドは0.2 ではラベルごとに 5 例で 83.7-90.2%、全訓練データで 93.1-96.3% に達しました。0.2 より前は 82.3-89.6% と 90.7-94.4% です。リリース前のデフォルトの all-MiniLM-L6-v2 では 78.7-87.3% と 90.6-94.0% です。2 から 10 ラベルの小さなタスクは、ラベルごとに 1 例で 93.4% に達しました。ラベル付きの例を一部取り分けて計測してください。手順は確信度としきい値にあります。
どんな判定が得意ですか?
テキストが何についてのものかの判定です。インテント、トピック、振り分け、カテゴリなどです。テキストがどう感じているかの判定は苦手です。bge-small で計測しました(各 2,000 テスト行、eval/mteb.ts、eval/hwu64.ts)。
| タスク | ラベル | ゼロショット | 訓練後 | 確信した答えの正答率 |
|---|---|---|---|---|
| HWU64 のインテント(調整には未使用) | 64 | 59.8% | 85.8%(ラベルごとに 10)、90.2%(すべて) | 98% |
| AG News のトピック | 4 | 67.5% | 84.4%(ラベルごとに 32) | 95% |
| ツイートの感情極性 | 3 | 53.3% | 61.3%(ラベルごとに 32) | 89% |
| 感情 | 6 | 50.6% | 49.4%(ラベルごとに 32) | 66% |
| 有害性(有害 7.6%) | 2 | 65.7% | 66.6%(ラベルごとに 32) | 56% |
感情極性、感情、有害性はエンコーダーの限界です。トーンではなく意味で訓練されているので、例を増やしてもほとんど効きません。有害性は最悪のケースで、まれなラベルがさらに悪くします。常に「有害でない」と答えれば 92% の割合で正解だからです。有害なテキストの少なさをヘッドに伝える方法も試しました(eval/prior-shift.ts)。結果は、ほとんどすべてに「有害でない」と答えるようになっただけでした。4 倍大きい bge-base(model: "Xenova/bge-base-en-v1.5")もあまり効きませんでした。ラベルごとに 32 例で、感情 54.6%、有害性 64.2%(低下)、ツイートの感情極性 62.0% でした。HWU64 は 90.6% です。今のところ、これらには LLM か専用の分類器を使ってください。
なぜエンコーダーをファインチューニングしないのですか?
ヘッドだけを訓練すれば、ブラウザのタブでも訓練できるほど軽く済み(10,003 例で 147-217 s、9 例で 0.1 s)、キャッシュした 1 つのエンコーダーですべてのヘッドをまかなえます。2026-11-02 に SNIPS と PAWS でファインチューニングを試したところ、開発分割で BANKING77 は 2.5 ポイント、CLINC150 は 1.2 ポイント下がりました。否定できたのはこのデータの組み合わせだけです。0.2 より前のこの回答では、BANKING77 で約 91% を超える道としてファインチューニングが有力としていましたが、実際にはヘッドの訓練の改善で 93.1% に届きました。
ヘッドの大きさは?
重みを base64 にした JSON で、77 ラベルが 156 KB、150 ラベルが 303 KB です。大きさはラベルの数で増え、例の数では増えません。
再訓練なしでラベルを変えられますか?
いいえ。ヘッドが知っているのは訓練に使ったラベルだけです。ラベルの追加、削除、名前の変更には、例を変えて train() をもう一度呼んでください。同じデサイダーなら、エンコードするのは新しいテキストだけです。
npm がインストールスクリプトをブロックしたと警告します
npm 11 は、プロジェクトが許可していないパッケージのインストールスクリプトを飛ばし、decidekit の依存のうち onnxruntime-node、sharp、protobufjs の 3 つについてそう伝えます。decidekit はそれでも動きます。onnxruntime-node はバイナリをパッケージに含めていて、decidekit は sharp を使いません(transformers.js が画像用に読み込むものです)。CI のパック済みパッケージのテストはこの方法でインストールしています。承認は不要です。
decide() が "this head was trained on ..." と例外を投げるのはなぜですか?
ヘッドは訓練に使ったエンコーダーでしか動きません。ヘッドのモデルでデサイダーを作ってください:createDecider({ model: head.model })。
ゼロショットの confidence に意味はありますか?
おおよそあります。固定の温度は 2 つのインテントのデータセットでほぼ較正された状態になりましたが、あなたのラベルでそうなるとは限りません。しきい値を置く前に自分のラベル付きテキストで確かめるか、独自の温度を当てはめるヘッドを訓練してください。確信度としきい値を参照してください。
モデルの読み込みで "File doesn't exist" と表示されるのはなぜですか?
Windows の Node では、transformers.js はモデルを node_modules の中にキャッシュします。階層の深いプロジェクトではパスが Windows の上限である 260 文字を超えることがあり、読み込みが "Load model ... failed. File doesn't exist" で失敗します。プロジェクトを短いパスに移すか、Windows で長いパスを有効にしてください。