pgvecto.rsは、ベクトル類似性検索機能を提供するPostgres拡張機能です。Rustで書かれており、pgrxをベースにしています。現在、安定版がリリースされ、既に多くの企業や開発者によって実際の環境で使用されています。
pgvecto.rsの主な特徴:
-
既存のDB内で使用可能:既存のデータベース内でPostgres拡張機能として簡単に使用でき、現在のワークフローやアプリケーションとのシームレスな統合が可能です。
-
制限のないフィルタリングと結合:VBASEフィルタリングを使用して、任意のフィルター条件を適用し、他のテーブルとの結合が可能です。これにより、高いリコール率と低レイテンシーを実現し、他のベクトルデータベースとは一線を画しています。
-
効率的なFP16サポート:FP16ベクトルタイプをサポートし、メモリと保存容量を半分に削減し、スループットを向上させます。
-
高度な量子化:スカラー量子化と積量子化を利用して最大64倍の圧縮を実現します。スカラー量子化では、2%未満のリコール損失で最大4倍のメモリ節約を達成できます。
-
ハイブリッド検索:PostgreSQLの全文検索機能とpgvecto.rsを組み合わせて、単一のクエリ内でテキストとベクトルデータを検索できます。最新のBGE-M3モデルを使用したスパースベクトル検索も可能になりました。
-
非同期インデックス作成:pgvecto.rsのインデックスはバックグラウンドスレッドによって非同期で構築されるため、挿入をブロックせず、常に新しいクエリに対応できます。
-
拡張されたベクトル長:最大65535次元のベクトルをサポートしており、LLMのエンベディングモデルにも適しています。
-
Rustによる信頼性:Rustの厳格なコンパイル時チェックにより、メモリ安全性が保証され、C拡張機能に見られる多くのバグやセキュリティ問題を回避できます。
-
バイナリベクトル検索:FP32ベクトルと比較して30倍のメモリ削減を実現しながら、精度を維持するバイナリベクトル検索機能が追加されました。
pgvecto.rsの使用例:
DROP EXTENSION IF EXISTS vectors;
CREATE EXTENSION vectors;
-- ベクトル列を持つテーブルを作成
CREATE TABLE items (
id bigserial PRIMARY KEY,
embedding vector(3) NOT NULL -- 3次元
);
-- 値を挿入
INSERT INTO items (embedding)
VALUES ('[1,2,3]'), ('[4,5,6]');
-- または配列からベクトルへのキャストを使用して値を挿入
INSERT INTO items (embedding)
VALUES (ARRAY[1, 2, 3]::real[]), (ARRAY[4, 5, 6]::real[]);
-- 演算子を通じて距離関数を呼び出す
-- 二乗ユークリッド距離
SELECT '[1, 2, 3]'::vector <-> '[3, 2, 1]'::vector;
-- 負の内積
SELECT '[1, 2, 3]'::vector <#> '[3, 2, 1]'::vector;
-- コサイン距離
SELECT '[1, 2, 3]'::vector <=> '[3, 2, 1]'::vector;
-- 類似する埋め込みを検索
SELECT * FROM items ORDER BY embedding <-> '[3,2,1]' LIMIT 5;
pgvecto.rsは、機械学習モデルの出力や画像特徴量などのベクトルデータを効率的に検索・管理したい場合に特に有用です。例えば、レコメンデーションシステムや画像検索エンジンの構築に活用できます。
最新の開発:
-
PGVecto.rs Cloud:スケーラブルなベクトル検索をクラウド環境で提供する新しいサービスがリリースされました。これにより、ユーザーは自身のインフラストラクチャを管理することなく、pgvecto.rsの機能を利用できるようになりました。
-
Terraformサポート:PGVecto.rs CloudのためのTerraformプロバイダーが公開され、インフラストラクチャの他のコンポーネントと同様にPGVecto.rs Cloudを管理できるようになりました。
-
pg_bestmatch.rs:BM25(Best Matching 25 Score)テキストクエリ機能を提供する新しいPostgreSQL拡張機能がリリースされ、テキスト検索の精度が向上しました。
pgvectorとの比較:
pgvectorは、PostgreSQLのネイティブベクトル拡張機能として広く使用されていますが、pgvecto.rsはいくつかの点で優位性を持っています:
-
パフォーマンス:pgvecto.rsは、特に大規模なデータセットでpgvectorよりも高速な検索性能を提供します。2024年の比較では、pgvecto.rsがpgvectorよりも最大20倍高速であることが示されています。
-
柔軟性:pgvecto.rsは、より多様なインデックスタイプと検索アルゴリズムをサポートしており、異なるユースケースに対応できます。
-
スケーラビリティ:pgvecto.rsは、より大きなデータセットと高次元ベクトルを効率的に処理できるように設計されています。
-
高度な機能:量子化、非同期インデックス作成、FP16サポート、バイナリベクトル検索など、pgvecto.rsはより高度な機能を提供しています。
ただし、pgvectorはPostgreSQLのコア開発チームも含むメンバーによってメンテナンスされており、より広範なサポートと安定性を提供する可能性があります。 選択は、具体的なプロジェクト要件、パフォーマンスニーズ、および必要な機能に基づいて行うと良いでしょう。
参考文献
- Overview | pgvecto.rs (アクセス日: 2024-08-13)
- 20x Faster as the Beginning: Introducing pgvecto.rs extension written in Rust (アクセス日: 2024-08-13)
- pgvecto.rs GitHub repository (アクセス日: 2024-08-13)
- Comparison with pgvector | pgvecto.rs (アクセス日: 2024-08-13)
- pgvector vs. pgvecto.rs in 2024: A Comprehensive Comparison for Vector Search in PostgreSQL (アクセス日: 2024-08-13)
- Introducing PGVecto.rs Cloud - Scalable Vector Search in PostgreSQL, Now in the Cloud (アクセス日: 2024-08-13)
- Introducing Terraform Support for PGVecto.rs Cloud (アクセス日: 2024-08-13)
- Unleash the power of sparse vector (アクセス日: 2024-08-13)
- pg_bestmatch.rs: Elevate Your PostgreSQL Text Queries with BM25 (アクセス日: 2024-08-13)
- My binary vector search is better than your FP32 vectors (アクセス日: 2024-08-13)