AI・機械学習
中級
pgvector(ピージーベクター)
PostgreSQL用オープンソースベクトル拡張。既存のPostgreSQLデータベースに高次元ベクトルの格納・類似検索機能を追加する。SQLとのJOINが可能でシンプルな構成を保てる。
0 回閲覧
0 いいね
2026/6/7 更新
関連タグ
pgvector
postgresql
vector-search
rag
hnsw
ivfflat
pgvector
概要
pgvector(ピージーベクター)は、PostgreSQLにベクトル演算機能を追加するオープンソース拡張です。既存のPostgreSQLデータベースにvectorデータ型・類似検索演算子・HNSWインデックスを追加することで、専用ベクトルDBなしにRAGシステムやセマンティック検索を構築できます。
インストールと有効化
-- 拡張のインストール(PostgreSQL 14以降)
CREATE EXTENSION IF NOT EXISTS vector;
-- バージョン確認
SELECT extversion FROM pg_extension WHERE extname = 'vector';
# Docker Postgres with pgvector
docker run -e POSTGRES_PASSWORD=password \
-p 5432:5432 \
pgvector/pgvector:pg16
# Ubuntu/Debian でのビルドインストール
sudo apt install postgresql-16-pgvector
テーブル設計
-- ベクトルカラムを持つテーブル
CREATE TABLE glossary_embeddings (
id TEXT PRIMARY KEY,
term TEXT NOT NULL,
category TEXT,
embedding vector(1536), -- OpenAI text-embedding-3-small の次元数
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- HNSWインデックス(推奨)
CREATE INDEX ON glossary_embeddings
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- IVFFlatインデックス(大規模データ向け)
-- CREATE INDEX ON glossary_embeddings
-- USING ivfflat (embedding vector_cosine_ops)
-- WITH (lists = 100);
類似検索クエリ
-- コサイン類似度で上位5件取得(<=> は距離なので小さいほど類似)
SELECT
id,
term,
category,
1 - (embedding <=> '[0.1,0.2,0.5]'::vector) AS cosine_similarity
FROM glossary_embeddings
ORDER BY embedding <=> '[0.1,0.2,0.5]'::vector
LIMIT 5;
-- L2距離での検索
SELECT id, term, embedding <-> '[0.1,0.2,0.5]'::vector AS l2_distance
FROM glossary_embeddings
ORDER BY l2_distance
LIMIT 5;
Drizzle ORM での利用
import { pgTable, text, customType } from "drizzle-orm/pg-core";
const vector = customType<{ data: number[]; driverData: string }>({
dataType(config: { dimensions: number }) {
return `vector(${config.dimensions})`;
},
toDriver(value: number[]): string {
return JSON.stringify(value);
},
fromDriver(value: string): number[] {
return JSON.parse(value);
}
});
export const glossaryEmbeddings = pgTable("glossary_embeddings", {
id: text("id").primaryKey(),
term: text("term").notNull(),
embedding: vector("embedding", { dimensions: 1536 })
});
pgvector vs Qdrant の使い分け
| 基準 | pgvector | Qdrant |
|---|---|---|
| インフラ追加 | 不要(既存PG) | Dockerコンテナ追加 |
| SQLとのJOIN | 可能 | 不可(別途API呼び出し) |
| スケーラビリティ | 中(PostgreSQL依存) | 高(専用最適化) |
| ハイブリッド検索 | 限定的 | Dense+Sparse対応 |
| 管理コスト | 低 | 中 |
| 最大推奨ベクトル数 | 〜100万件 | 数億件対応 |
jisaku.comでの運用: 用語集・記事の類似検索にQdrantを採用(11,800件規模での高速検索)。pgvectorはPostgreSQLに統合された軽量用途向けに利用。