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

スター履歴

pgvector/pgvector Star History
データ取得日時: 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インデックスは相当なメモリを消費
  • ビルド時間: 大規模データセットでのインデックス構築に時間がかかる場合がある
  • チューニングの必要性: 最適なパフォーマンスを得るにはパラメータ調整が必要

主要リンク

書き方の例

基本的な使用例

-- 拡張機能の有効化
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アプリケーションの構築が可能になります。