「GGUF」はllama.cppが言語モデルに使用するファイルフォーマットです。GGUFの特徴の一つに「単一ファイルである」という点があり、複数のファイルが散在する他のフォーマットと比較すると使いやすさの面で有利と言えます。ただ、ファイル中にどんな情報が含まれているのかわからないと、本当にGGUFファイルだけでモデル実行に必要な全ての情報が揃うのか疑問に感じるかもしれません。オンデバイス推論エンジン「NobodyWho」の開発チームのブログにてGGUFにはどのような情報が含まれているのかを解説していました。

What's in a GGUF, besides the weights - and what's still missing? - NobodyWho

https://nobodywho.ooo/posts/whats-in-a-gguf/

◆GGUFに含まれる機能

GGUFに含まれている情報として以下のものがブログで取り上げられています。

・チャットテンプレート

・特殊トークン

・サンプラー設定・サンプラーチェーンシーケンス

チャットテンプレートは会話型言語モデルの応答形式を定義したものであり、複雑な機能に対応するためにJinja2テンプレート言語で記述されます。GGUFではデフォルトのチャットテンプレートは「tokenizer.chat_template」キーに保存されています。Jinja2はループ・条件分岐・代入・リスト・辞書などを備えたプログラミング言語であるため、会話型のLLMアプリケーションは新しいメッセージが追加されるたびにインタープリタを同梱する必要があります。インタープリタの実装によってはパフォーマンスにかなりの差があるものの、チャットテンプレート処理がローカルLLMアプリケーションのパフォーマンス上のボトルネックとなることはないため問題とされることはありません。



特殊トークンとはテキスト表現よりも広い意味合いを持たせたトークンを指します。特殊トークンの代表例は「eos(end-of-sequence)」です。言語モデルは入力されたトークンのシーケンスに対して次のトークンを無限に出力し続けるため、eosトークンを用いてそれを停止させるのが一般的な解決策となっています。以下はGemma 4用の特殊トークンの一例です。



サンプラー設定については言語モデルが出力した確率分布から次のトークンを選択する「サンプリング」の結果を改善するため、どこかで使われた実績のあるサンプラー設定を手動でコピー&ペーストして流用するケースが常態化していましたが、GGUFフォーマットが改良され「general.sampling.sequence」フィールドが追加されたことによりモデルファイル内にサンプラーチェーンを直接指定できるようになりました。ただし現状では多くのGGUFモデルがgeneral.sampling.sequenceフィールドを省略しているため、llama.cppのデフォルト設定に依存しているケースが多い状況です。

◆GGUFに不足している機能

記事作成時点でGGUFに不足している機能としては以下のものがあるとNobodyWhoのブログは指摘しています。

・ツール呼び出しフォーマット:GGUF標準にツール呼び出しフォーマットの文法を含めればより汎用的なパーサーの作成が可能になる

・Thinkトークン:上流のHugging Faceリポジトリではthink_tokenフィールドが導入されたもののGGUFへの変換で省略されることが多く、思考ストリームの分離が困難になっている

・プロジェクションモデル:マルチモーダルLLMでは画像や音声などを処理するためのプロジェクションモデル用とメインモデル用との2つのGGUFファイルが必要になることが多い

・サポート機能リスト:モデル非依存の推論ライブラリがモデルのサポート外のツール呼び出しをした際に、より一貫したエラーメッセージや警告を提供できるようになる



◆まとめ

GGUFは「単一ファイルであることによる使い勝手の良さ」「モデル実行に必要な全てを網羅していること」「モデル固有のコードパスを削減できること」「オープンかつ拡張性の高さ」という特性を併せ持った優秀なフォーマットであり、支持基盤として強力なコミュニティが存在することから今後の標準規格の強化やエクスペリエンス向上を期待することができる、とNobodyWhoのブログは結んでいます。