embeddingのためのOSSコマンドラインツールを作っている
毎週のように新しいモデルが発表されるLLMほどではないが,embedding model(埋め込み表現モデル)にもたくさんのモデルがある。埋め込み表現と,そのメジャーなアプリケーションであるベクトル検索のリサーチがてら,いろいろなembeddingを手軽に試せるembcliというOSSを作っている。
GitHub: embcli - CLI for Embeddings
ライセンス: Apache License v2
設計思想や使い勝手は,さまざまなLLMをコマンドラインから呼べるllmというツールにインスパイアされていて,ざっくりそのembedding版を目指している。なおllmもembeddingsをサポートしていて,とはいえembedding modelのサポートはLLMよりは薄いので,embeddingの取扱いに特化したニッチツールがあっても良いかな...と思ったのがきっかけ。
ソフトウェアとしてはまだ粗々なものの,一通りのベースらしきものができたところでPyPIに初期バージョンを登録したので,紹介エントリを書く。
インストールと使い方
たとえばSentenceTransformerモデルを試す場合,embcli-sbertをpipでインストールする。
依存を最小限にするためモデルごとにパッケージを公開していて,他にはOpenAIモデル用のembcli-openai, Cohereモデル用のembcli-cohereなどがある。
サポートしているモデルの一覧はREADMEを参照ください。プロプライエタリのモデルを使うにはAPIキーが必要です。
embコマンド
embcli-<model>にはembというコマンドラインツールが含まれていて,サポートされるコマンドは
で確認できる。各コマンドのヘルプもemb <command> --helpで表示される。
主なコマンドと,その使い方の例を紹介していく。
インストール済みモデルをリストする
emb modelsで,インストールされているモデルのリストを表示する。
)
ここではembcli-sbertのみインストールしているので,SentenceTransformerModelだけが表示されている。他のパッケージをインストールすると,環境にインストールされているすべてのモデルが表示される。
埋め込み表現を生成する
emb embed コマンドで埋め込み表現を生成する。--model または -m オプションで,使うモデルを指定する。
2つの埋め込み表現の類似度(または距離)を計算する
emb simscore コマンドで,2つのセンテンスから生成した埋め込み表現の類似度または距離を計算する。--similarityまたは-sオプションで,計算にどのメトリクスを使うかを指定する。2つの埋め込み表現のdot productを計算する場合:
セマンティックサーチ(ベクトル検索)
embcli-<model>にはChromaと,いくつかの小さなサンプルコーパスが付属していて,簡易的にembeddingのインデクシングと検索を試すことができる。手元にインデックスしたいテキストがある場合は,自前のコーパスも利用できる。
emb ingest-sampleコマンド(または,手元にインデックスしたい自前のコーパスがすでにある場合はemb ingestコマンド)で,テキストコーパスから埋め込み表現を生成して,ローカルファイルシステム上のChromaデータベースにインデックスする。
--collectoinまたは-cオプションでコレクション名を指定し,--corpusでサンプルコーパス名を指定する。たとえばdishes-jaコーパスをインデックスする場合
)
インデックス済みのコレクションは,emb searchコマンドで検索できる。「おすすめのデザートは?」というクエリで検索すると,
軽量なSentenceTransformerモデルを使って日本語のテキストをインデックス/検索すると,正直イマイチな印象。多言語に強いCohere(プロプラ)のモデルなんかだと結構いい感じになります。
開発ステータスとこれから
開発ステータスはpre-Alphaで,これからやりたいことは
- ドキュメンテーション
- ローカルモデルのサポート拡充(特にllama.cpp/GGUF)
- CLIPなどマルチモーダルモデルのサポート
- Quantizationのサポート(int8, binary, など)
- サポートしているモデルのドキュメンテーションや原著論文を読んで解説を書く
- ベクトル検索以外のダウンストリームタスク(クラスタリング,文書分類,他)のサポート
- ベクトル検索で使う各種ベクトルデータベースのサポート
など。
勉強のためという漠としたイメージで始めたOSSプロジェクトですが,面白そう・便利かもと思った方はお好みのモデルのパッケージをインストールしてみてください。ドキュメンテーションがTODOとなっていますが(汗),READMEとコマンド付属のヘルプで大体の使い方はすぐに掴めると思います。GitHub Issuesでもフィードバック・リクエストを受け付けています。
おまけ:設計ポリシーなど
pluggyを使い,プラッガブルで拡張性の高い設計にしている。また,uv workspaceを活用することで,コアライブラリと各種プラグインをモノレポで管理しつつ,依存ツリーをパッケージごとに管理しつつ,複数モデル(パッケージ)をインストールしても依存ツリーの一貫性が保たれるようにした。
このあたりの詳細は以前に書いたブログuv workspacesでスッキリ作るPythonモノレポとuv workspacesとpluggyで作る,プラッガブルなPythonエコシステムで紹介しています。