言語モデル
言語モデルって、単語列を見せたときに次に来る単語は?の出現確率で~とかなんとかを説明するためのスライドを書いていたときに、こう動きのないスライドで一例を図示するよりいろいろなパターンを見せて分からせたいよね……それじゃアプリ作るか!って勢いで作ったところ、ハルシネーションってこう起こるんだって体感したり、ChatGPTとかたまに変なこと言い出したりする理由が分かったとか、ポチポチ単語を選択するだけで文章が作られていくのが面白いとか、結構好評だったので、ついでにアドベントカレンダーのネタにもしようと。
ちなみにコードはこちら用に新規に適当に書き起こしました。
https://amanorox.github.io/llmplay/
プログラム概要
誰でも気軽に試せて、言語モデルを動かすコストがかからないようにウェブブラウザ内ですべて処理が完結するようにしました。
使用ライブラリなど
- Transformers.js
https://huggingface.co/docs/transformers.js/index - Qwen2.5-0.5B
https://huggingface.co/onnx-community/Qwen2.5-0.5B - Chart.js
https://www.chartjs.org/
採用言語モデルのこと
日本語1文字が複数トークンに分割されていたり、1トークン1文字だけだったりするモデルでは次の語の候補に1文字のものしか出てこないっていうのは面白くないと、日本語をよくサポートしてくれるモデルとして Qwen を、あとはブラウザ内で処理できて軽量なところでと、0.5Bの極小サイズのモデルを採用しました。
いろいろなモデルを試したところ、0.5Bモデルはやっぱり性能が低くて7Bくらいあると様々な文章作るのに楽しい感じがあるなと思います(先発で作成したものは専用の言語モデルサーバーを用意してそっちで大きいモデルを使って推論してました)。
7Bモデルを4ビット量子化してもさほど性能低下は感じないですが、0.5Bモデルの量子化はだいぶ違うと、まともそうな fp16 を選んでいます。デフォルトの量子化モデルをロードして次語の確率表を出すと、日本語の続きにどうして英語の候補が羅列されるの……ってなります。数(パラメータ数)の暴力で性能低下がカバーされてるのかなって思っています。