GitHub概要
pgvector/pgvector
Open-source vector similarity search for Postgres
スター16,802
ウォッチ114
フォーク828
作成日:2021年4月20日
言語:C
ライセンス:Other
トピックス
approximate-nearest-neighbor-searchnearest-neighbor-search
スター履歴
データ取得日時: 2025/7/30 00:10
pgvector
概要
pgvectorは、PostgreSQL用のオープンソース拡張機能で、ベクトル演算と類似性検索のサポートを追加します。既存のPostgreSQLデータベース内で直接ベクトルデータを保存、インデックス化、クエリすることが可能になります。
pgvectorを使用することで、既存のPostgreSQLインフラストラクチャを活用しながら、セマンティック検索、推薦システム、画像検索、自然言語処理(NLP)などのAIアプリケーションを構築できます。
詳細
PostgreSQL拡張機能
pgvectorはPostgreSQLの標準的な拡張機能として実装されており、PostgreSQL 13以降をサポートしています。既存のPostgreSQLデータベースに簡単に追加でき、SQLクエリを使用してベクトルデータを操作できます。
ベクトルデータ型
pgvectorは以下の複数のベクトルデータ型をサポートしています:
- vector: 単精度浮動小数点(float32)ベクトル
- halfvec: 半精度浮動小数点(float16)ベクトル(ストレージサイズ削減)
- bit: バイナリベクトル
- sparsevec: スパースベクトル(ゼロ値が多いデータに最適)
インデックス形式
pgvectorは高速な近似最近傍検索のために2つのインデックスアルゴリズムを提供しています:
HNSW(Hierarchical Navigable Small World)
- マルチレイヤーグラフ構造を構築
- 一般的にIVFFlatよりも優れたクエリパフォーマンス(速度-再現率のトレードオフ)
- ビルド時間が長く、メモリ使用量が多い
- 空のテーブルでもインデックス作成可能(トレーニング不要)
- 最大4,000次元(半精度)または64,000次元(バイナリ量子化)をサポート
IVFFlat(Inverted File Flat)
- k-meansクラスタリングを使用してベクトルをリストに分割
- HNSWよりもビルド時間が短く、メモリ使用量が少ない
- クエリパフォーマンスはHNSWよりも低い
- テーブルにデータが存在する状態でのインデックス作成を推奨
距離関数
pgvectorは以下の距離関数をサポートしています:
- L2距離(ユークリッド距離):
<->
- 内積:
<#>
(負の内積を返す) - コサイン距離:
<=>
- L1距離(マンハッタン距離):
<+>
- ハミング距離(バイナリベクトル用):
<~>
- ジャッカード距離(バイナリベクトル用):
<%>
最新バージョンの改善点(v0.8.0)
2024年にリリースされたpgvector 0.8.0では、特にフィルタリングを含むクエリのパフォーマンスが大幅に改善されました:
- 反復インデックススキャンによりフィルタ付きクエリで最大9.4倍の高速化
- PostgreSQLのクエリプランナーがより効率的なインデックスを選択
- HNSWとIVFFlatの両方でフィルタリング後の再現率が向上
メリット
- 既存インフラの活用: 既存のPostgreSQLデータベースに簡単に統合可能
- ACID準拠: PostgreSQLの信頼性とトランザクション保証を継承
- SQLインターフェース: 標準的なSQLクエリでベクトル操作が可能
- 多言語サポート: PostgreSQLクライアントを持つあらゆる言語から利用可能
- スケーラビリティ: レプリケーション、Citusなどによる水平スケーリングが可能
- 高パフォーマンス: 最新バージョンでは数千万の高次元ベクトルを処理可能
- 統合開発: 単一データベースでリレーショナルデータとベクトルデータを管理
デメリット
- 専用ベクトルデータベースとの比較: 特化型ベクトルデータベースと比較すると、一部の高度な機能が不足
- メモリ使用量: 大規模なHNSWインデックスは相当なメモリを消費
- ビルド時間: 大規模データセットでのインデックス構築に時間がかかる場合がある
- チューニングの必要性: 最適なパフォーマンスを得るにはパラメータ調整が必要
主要リンク
- GitHub - ソースコードとドキュメント
- PostgreSQL公式アナウンス - 最新リリース情報
書き方の例
基本的な使用例
-- 拡張機能の有効化
CREATE EXTENSION vector;
-- ベクトルカラムを持つテーブルの作成
CREATE TABLE items (
id bigserial PRIMARY KEY,
embedding vector(3)
);
-- ベクトルデータの挿入
INSERT INTO items (embedding) VALUES
('[1,2,3]'),
('[4,5,6]');
-- L2距離による最近傍検索
SELECT * FROM items
ORDER BY embedding <-> '[3,1,2]'
LIMIT 5;
-- コサイン類似度による検索
SELECT *, 1 - (embedding <=> '[3,1,2]') AS cosine_similarity
FROM items
ORDER BY embedding <=> '[3,1,2]'
LIMIT 5;
HNSWインデックスの作成
-- 基本的なHNSWインデックス
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);
-- パラメータを指定したHNSWインデックス
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)
WITH (m = 16, ef_construction = 64);
-- 検索パラメータの設定
SET hnsw.ef_search = 100;
IVFFlatインデックスの作成
-- IVFFlatインデックス(100リスト)
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops)
WITH (lists = 100);
-- 検索パラメータの設定
SET ivfflat.probes = 10;
フィルタリングを伴う検索
-- カテゴリでフィルタリングした最近傍検索
SELECT * FROM items
WHERE category_id = 123
ORDER BY embedding <-> '[3,1,2]'
LIMIT 5;
-- 部分インデックスの作成(特定カテゴリのみ)
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)
WHERE (category_id = 123);
高度な使用例
-- バイナリ量子化を使用したインデックス
CREATE INDEX ON items USING hnsw ((binary_quantize(embedding)::bit(3)) bit_hamming_ops);
-- スパースベクトルの使用
CREATE TABLE sparse_items (
id bigserial PRIMARY KEY,
embedding sparsevec(5)
);
INSERT INTO sparse_items (embedding) VALUES
('{1:1,3:2,5:3}/5');
-- ベクトルの集約
SELECT category_id, AVG(embedding)
FROM items
GROUP BY category_id;
パフォーマンスチューニング
-- メンテナンスワークメモリの増加(インデックス構築の高速化)
SET maintenance_work_mem = '8GB';
-- 並列ワーカーの設定
SET max_parallel_maintenance_workers = 7;
-- インデックス構築の進捗確認
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%"
FROM pg_stat_progress_create_index;
pgvectorは、既存のPostgreSQLインフラストラクチャを活用しながら、強力なベクトル検索機能を提供する優れた選択肢です。ACIDコンプライアンス、SQLインターフェース、成熟したエコシステムにより、エンタープライズグレードのAIアプリケーションの構築が可能になります。