世界を動かす技術を、日本語で。

Ternlight – ブラウザで動作する7 MBの埋め込みモデル(WASM)

概要

  • 7MBの軽量な 埋め込みモデル を紹介
  • CPUのみ で動作、API不要
  • ブラウザ内 で高速テキスト埋め込み
  • npmパッケージ として提供、導入が簡単
  • Reactドキュメント検索 などの用途に最適

7MB埋め込みモデルの特徴

  • 7MBのエンジン+重み のみで構成される軽量モデル
  • miniバリアント はさらに小さい5MB
  • CPUのみ で動作、GPU不要
  • テキスト埋め込みは 約5ミリ秒 で完了
  • APIコールやサーバ通信が不要 なため、完全ローカル処理
  • ブラウザ上 で直接動作
  • npmパッケージ(@ternlight/base) として配布
  • モデルダウンロードやサーバ構築不要 で導入が容易

利用方法

  • npm install @ternlight/base でインストール
  • 例:
    import { embed, similar } from '@ternlight/base';
    similar('easy weeknight dinner ideas', recipes, { topK: 3 });
    // → 上位3件の一致結果を約5msで取得
    
  • semantic search も3行で実装可能

主な用途例

  • Reactドキュメント検索
    • ブラウザ上でReactのドキュメントを高速検索
    • @ternlight/mini(5MB版) を利用
    • ネットワーク接続不要、即時検索体験

導入メリット

  • ネットワーク遅延ゼロ の高速体験
  • 個人情報やデータの外部送信リスクなし
  • サーバコスト不要、メンテナンスフリー
  • ローカル開発や教育用途 にも最適

まとめ

  • 軽量・高速・安全 な埋め込みモデル
  • APIレス・サーバレス で導入が簡単
  • 即時テキスト検索や類似文書検索 に最適

Hackerたちの意見

趣味のプロジェクトで、「ウェブブラウザで使える便利なモデルを作りたい」と思って、MiniLMから小さな文エンコーダーを抽出して、三値量子化を意識したトレーニングを行ったんだ。それから、推論エンジンをゼロから作って、RustでWASM SIMDにしたよ。これは埋め込みモデルで、LLMじゃないんだ。テキストを入力すると384次元のベクトルが出てきて、2つのベクトル間のコサイン類似度でテキストの関連性がわかるんだよ。共有単語に関係なくね(「パスワードをリセットする」↔「パスワードを忘れた」→0.88)。セマンティックサーチやFAQ/意図マッチング、クラスタリングに使えるんだ。デバイス上で動かすことで、APIに依存せずにタイプしながらのセマンティックサーチが快適にできるよ。デモ(2kのReactドキュメント、完全にデバイス上で動作):https://ternlight-demo.vercel.app npmには2つのティアがあるよ: - @ternlight/base(7 MB、~5 ms/埋め込み、より高機能な埋め込み) - @ternlight/mini(5 MB、~2.5 ms/埋め込み)。Nodeとブラウザ用にバンドルされてる。リポジトリ - 技術的詳細を確認してね(MIT、トレーニングパイプラインも含む):https://github.com/soycaporal/ternlight これが役に立つか気になるな。デバイス上の埋め込みのユースケースは何だろう?

すごい!サイズ以外では、これってgte-smallと比べてどうなの?

ありがとう!その説明をウェブページにコピペすることを強くおすすめするよ。いいまとめだね。

0.84のSpearmanの忠実度、MiniLMの教師に対して三値精度での結果はすごいね。これは量子化を意識したトレーニングがどれだけ効果を出してるのか、同じエンコーダのポストトレーニング三値量子化と比べてどうなの?

いいね、ネイティブデスクトップアプリでシンプルなセマンティック検索に使うのに興味津々だよ。他の小さな埋め込みモデルとの比較はある?MiniLM-L6から始めたのは、このクラスでは特に良いモデルだから?提供されているのは「Retrieval (SciFact NDCG@10)」だけだから、これを判断するのが難しいね。でも、主張されているパフォーマンスはかなり違う気がする。i5-4570のFirefoxで35 emb/secしか出ないのに、400/secってどういうこと?非SIMDパスにフォールバックする問題でもあるのかな?次はネイティブのRustバイナリを試してみるよ。

すべてのコードを共有してくれて、めっちゃ感謝!素晴らしいプロジェクトだね!

異なるテキストを追加するプロセスはどうなってるの?そのプロセスにはどんな制限があるの?デモはめっちゃクールだね。

すごいね。ここにOpenStreetMapのタグに対応した単語の辞書があるよ:https://codeberg.org/cartes/web/src/branch/master/components... あなたの作業が、ユーザーが「pancake」と入力して「crêpe」を得られるように、明示的に「pancake = crêpe」の辞書エントリーを書かずに助けてくれると思う?実際には、あなたのライブラリはまず5MBを一度だけダウンロードする必要があって、それから今のFuse.jsのように使われる感じ?英語以外の言語にはどれくらい対応できるの?OpenStreetMapのタグウィキで「トレーニング」できるかな?あなたの作業に感謝!

30秒の埋め込み時間を事前にやってブラウザに送ることはできるの?その後は推論がすごく早いよね。

うん、サーバー側で一度インデックスを作って、埋め込みをフロントエンドに送ることができるよ。

これクールだね!でも、ランディングページにデモを起動するボタンを置いた方がいいかも。ウェブページを開くときにファンが急に騒ぎ出すのはちょっとびっくりするから。

同意する。でも、これを聞くと、コンピュータの音が何をしているかを親密に教えてくれた昔を思い出すなぁ。

Hacker Newsで議論の続きを見る