🧠 7MBの埋め込みモデルがブラウザだけで動く「ternlight」を触ってみた

APIコールなしでオンデバイス実行できる7MBの埋め込みモデルternlight。BitNet系の三値量子化でここまで小さくなる仕組みと、実際に触った感触をまとめた。

7 MB。これがternlightという埋め込みモデルの全サイズだ。

Hacker Newsのデモページを開いて、Reactのドキュメントに対して自然文で検索できるのを見た瞬間、「あれ、これAPI叩いてないよな」と二度見した。ネットワークタブを見ても通信が走っていない。埋め込み生成は全部ブラウザのCPUで完結している。

三値量子化という力技

普通、埋め込みモデルをブラウザで動かそうとすると、モデルサイズがネックになる。数百MBのモデルをダウンロードさせるわけにはいかないし、量子化しても数十MBが精一杯というのが体感だった。

ternlightの答えは極端だ。全重みを -1 0 +1 の3値に落とす「ternary weights」を採用していて、これはBitNet b1.58の手法をベースにしている。学習の最初から量子化を前提にする量子化認識訓練(QAT)を通しているので、後付けで劣化させたわけではないらしい。base版は2層エンコーダでd_model=384・約15.4Mパラメータ、mini版はd_model=256・約9.5Mパラメータ。どちらも出力は384次元のL2正規化ベクトルに揃えてある。

推論エンジンはRustで書かれていて、BitLinearの演算をバイト単位で再現している。学習はPython、実行はRust、配布はJavaScriptという役割分担だ。

import { embed, cosineSim, similar } from '@ternlight/base';

const a = embed('猫がソファで寝ている');
const b = embed('ソファの上で猫が眠っている');
cosineSim(a, b); // 高い類似度が返る

APIキーもエンドポイントも要らない。この3行で埋め込みとコサイン類似度の計算まで完結する。オフラインでも、Cloudflare WorkersのようなエッジランタイムでもVercel Edgeでも動くというのが素直にありがたい。

気になった点

埋め込み生成は約5ミリ秒とのことで、確かに体感でも待たされる感じはなかった。ただし、これはall-MiniLM-L6からの知識蒸留モデルなので、精度は元モデル相当かそれ以下になる。細かいニュアンスの検索や多言語対応が必要な場面では、素直にAPI経由の大きめのモデルを使ったほうがいい気がする。用途を選ぶ道具だ。

日本語でこの手の話をしているZenn・Qiita記事は見当たらなかった。WASM×機械学習の軽量化ネタ自体は日本語圏にもあるが、「サーバーレスで埋め込みまで完結させる」という切り口はまだ薄い。

触ってみて思ったこと

検索・レコメンド機能を作るたびに、埋め込みAPIのレイテンシとコストを気にしてきた身としては、この方向性は正直ワクワクする。全部のユースケースを置き換えるものではないけれど、「オフラインファースト」「プライバシー重視」「エッジで完結」といった要件があるプロダクトには刺さるはずだ。

次に軽量な社内ツールを作るときは、一度これで検索機能を組んでみようと思う。あなたなら、どの用途に使ってみたいだろうか。

元ネタ: https://ternlight-demo.vercel.app/