PostgreSQL に embedding の機能を追加する方法はいくつかあります。大きく分けて、拡張機能を利用する方法と、カスタムのロジックを組み込む方法があります。
1. 拡張機能を利用する
PostgreSQL には、embedding 機能をサポートする様々な拡張機能が公開されています。代表的なものとしては、以下のようなものがあります。
- pgvector: 最も人気があり、多くの機能を備えた拡張機能です。ベクトルデータの保存、検索、インデックス作成、類似度計算など、embedding 機能を全面的にサポートしています。
- IMMENSE Database: 大規模なベクトルデータを扱うための高速なデータベースです。pgvector よりもさらに高速な類似度計算が可能です。
- LanceDB: LLM を効率的に利用するためのベクトルデータベースです。
- その他: 複数のコミュニティや企業が開発している、より特定のユースケースに特化した拡張機能も存在します。
これらの拡張機能は、通常、PostgreSQL の公式ウェブサイトや GitHub で入手できます。それぞれの拡張機能は、インストール方法や使い方などがドキュメントで説明されているので、そちらを参考にしてください。
インストール手順の例(pgvectorの場合):
- PostgreSQL の拡張機能パッケージをダウンロードします。
- PostgreSQL のコマンドラインから
CREATE EXTENSION pgvector;
コマンドを実行します。 - データベースにベクトルデータを保存するためのテーブルを作成します。
pgvector
拡張機能の関数(例えば、similarity_luminosity
)を使用して、ベクトル間の類似度を計算します。
2. カスタムのロジックを組み込む
pgvector などの拡張機能を使用できない場合、または特定の要件に合わせて、独自のロジックを組み込むことも可能です。
- ベクトルデータの保存: ベクトルデータ(通常は浮動小数点数(float)またはdouble precision)を PostgreSQL の数値型(例えば、
float8
またはdouble precision
)として保存します。 - ベクトル間の類似度計算: Python などのプログラミング言語を使って、ベクトル間の類似度を計算します。距離計算(コサイン類似度、ユークリッド距離など)は、NumPy などのライブラリを使って効率的に計算できます。
- PostgreSQL へのデータ連携: 計算結果を PostgreSQL に保存したり、検索クエリの結果として返すようにします。
重要な考慮事項:
- インデックス: ベクトルデータを効率的に検索するためには、適切なインデックスを作成することが重要です。pgvector では、R-tree などの空間インデックスが使用されます。
- ベクトルデータのサイズ: ベクトルのサイズが大きいほど、類似度計算のパフォーマンスが低下する可能性があります。適切なデータ型を選択したり、インデックスの構成を最適化したりすることで、パフォーマンスを改善できます。
- 類似度計算アルゴリズム: 類似度計算アルゴリズムは、ユースケースによって適切なものを選択する必要があります。コサイン類似度は、ベクトルの大きさに関係なく、方向のみを考慮するため、一般的に使用されます。ユークリッド距離は、ベクトルの大きさも考慮するため、ベクトルが近い距離にあるかどうかを判断するのに適しています。
補足:
- 最近では、PostgreSQL への埋め込みデータ格納や検索を支援する、クラウドサービスやツールも登場しています。これらのサービスを利用することで、より簡単に embedding 機能を導入できます。
- 常に最新のドキュメントやチュートリアルを参照し、PostgreSQL のバージョンと使用している拡張機能の情報を確認してください。
参考:
pgvector、LLM、LangChain を使用して Google Cloud データベースで AI 搭載アプリを構築する
ベクトル エンベディングを生成して管理する | Cloud SQL for PostgreSQL | Google Cloud
database – PostgreSQL 拡張機能作成と権限 – postgresql 9.1
エンベディング ワークフローの例を理解する | Cloud SQL for PostgreSQL | Google Cloud
PostgreSQL拡張機能の管理: psql、Python等プログラミング例と代替手段
pgvectorを使ってPostgreSQLをベクトルデータベースとして使ってみる – Qiita