GGMLって?

LLM関連の話題は新しいものが次々出てくるので、キャッチアップしていくのも大変なのだが、llama.cppを試していて、GGMLを使っているけど、これってなんだろう、みたいな…。

GGML自体は機械学習向けCライブラリという感じ。とはいえ、llama.cppとか見ていると、モデルのファイル名に書いていたりもするから、ファイルフォーマット的な雰囲気も感じる。もう少し直感的にわかりやすい説明がないかなと思っていたら、わかりやすい感じでまとめてあった。ChatGPTにまとめてもらうと、

GGMLは、大規模な言語モデルを扱うためのCライブラリで、その名前は開発者Georgi Gerganovのイニシャルから取られています。このライブラリは、低レベルの機械学習プリミティブ(テンソル型など)を定義するとともに、大規模言語モデル(LLM)を配布するためのバイナリ形式も定義しています。このバイナリ形式は、消費者ハードウェア上で大規模言語モデルを実行可能にする「量子化」という技術を利用しています。

GGMLファイルは、指定された形式に従ってレイアウトされたバイナリエンコードデータで構成されています。この形式は、ファイル内に存在するデータの種類、その表現方法、およびその出現順序を指定します。有効なGGMLファイルには最初にGGMLのバージョン番号が存在し、その後に大規模言語モデルを定義する三つのコンポーネント、すなわちモデルのハイパーパラメータ、語彙、および重みが続きます。

GGMLは最先端の技術であり、頻繁に変更が行われます。後方互換性を犠牲にすることなく迅速な開発を支援するため、GGMLはエンコーディングの形式を変更する可能性のある改善を導入するためにバージョニングを使用します。

ハイパーパラメータは、大規模言語モデルの振る舞いを設定するために使用される値を指します。これは、モデルを作成するために使用された訓練プロセスで導出された重みであるモデルのパラメータとは対照的です。各モデルは、そのモデルが受け入れるハイパーパラメータ値を定義する独自のハイパーパラメータ構造を定義します。

モデルの語彙は、モデルが言語(テキスト)を生成するために使用するコンポーネントを含みます。しかし、人間の語彙が単語で構成されているのとは異なり、大規模言語モデルの語彙は「トークン」で構成されています。トークンは一つの単語全体であることもありますが、多くの場合、それらは単語の断片です。

最後に、GGMLファイルの最大のコンポーネントは、ファイルが表現するLLMの重みです。大規模言語モデルは、言語を生成するために使用されるソフトウェアであり、画像を生成するために使用されるソフトウェアがレンダリングできる色の数を増やすことで改善できるのと同様に、大規模言語モデルはモデル内の重みの数を増やすことで改善できます。

量子化とは、モデルを使用するために必要なリソースを減らすために、重みが表現される精度を減らすプロセスを指します。GGMLは、効率とパフォーマンスの間のトレードオフを提供するいくつかの異なる量子化戦略(例えば、4ビット、5ビット、8ビットの量子化)をサポートしています。

GGML – Large Language Models for Everyone の要約

という感じで、GGは人の名前で、Cのライブラリなのだが、このライブラリがハイバーパラメーター、辞書、ウェイトを保持していて、量子化もできる、という感じみたい。

Fessでセマンティックサーチ

Fess 14.9.1にfess-webapp-semantic-searchプラグインを入れることで、通常のキーワードベースの検索に加えて、ベクトルで検索した結果をマージして利用することができます。以前のプラグインでは、上位X件しか、ベクトル検索の結果を表示できなかったのですが、Fess 14.9.1以降ではReciprocal Rank Fusion(RRF)によって、ベクトル検索の結果をマージすることができるので、キーワード検索の結果でページングすることができ、通常の検索システムとしても利用できます。

利用方法は、fess-webapp-semantic-searchのREADME.mdに書いてあるとおりですが、Dockerであれば、簡単に試すことができると思います。まず、docker-fessをcloneして取得します。

git clone --branch v14.9.1 --single-branch https://github.com/codelibs/docker-fess.git
cd docker-fess/compose

compose.yamlを編集して、プラグインがインストールされるようにします。以下のように環境変数に設定されるようにします。

      - "FESS_PLUGINS=fess-webapp-semantic-search:14.9.0"

Fessを起動します。

docker compose -f compose.yaml -f compose-opensearch2.yaml up -d

OpenSearchにモデルをロードさせるために以下のスクリプトを取得してセットアップします。一応、多言語対応のモデルを利用して、ベクトルを生成していますが、必要に応じて、モデルを変更するなどしてください。

curl -o setup.sh https://github.com/codelibs/fess-webapp-semantic-search/blob/fess-webapp-semantic-search-14.9.0/tools/setup.sh
/bin/bash setup.sh

setup.shを実行すると、fess.semantic_search.〜が表示されるので、これは、Fessにログインして、全般のシステムプロパティの入力欄にコピペしてください。

あとは、管理画面のメンテンナンスページにいき、再インデクシングを実行してください。この状態では、何もインデクシングされていないと思いますが、再インデクシングすると、ベクトル検索が可能なインデックスに更新する処理が走ります。

あとは、普通にクロールして、検索するだけです。何かあれば、フォーラムとかで気軽に聞いてください。

Fess 14.9.1のリリース

Fess 14.9.1をリリースしました。セマンティックサーチ関連で調整が必要だったので、その修正をしました。

#2753はベクトル検索などから返ってくる結果が0件だったりすると例外が出る状態だったので修正しました。

#2754はベクトル検索などから返ってくる結果のスコアが低いものは足切りしないと、関連しないものが表示されるので、それを切り捨てるための最低スコア値を設定できるようにしました。

#2755はヘルパークラスなど、Config Loaderが実行される際に呼びさせるような処理を追加しました。

という感じで、fess-webapp-semantic-searchプラグインが利用する機能を追加しました。このプラグインは近いうちにりりーする予定ですが、これにより、自然な形でFessの結果にセマンティックサーチの結果を織り交ぜて、表示することができるようになります。

という感じですが、何かあればフォーラムをご利用ください。