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 の使い分け

基準pgvectorQdrant
インフラ追加不要(既存PG)Dockerコンテナ追加
SQLとのJOIN可能不可(別途API呼び出し)
スケーラビリティ中(PostgreSQL依存)高(専用最適化)
ハイブリッド検索限定的Dense+Sparse対応
管理コスト低中
最大推奨ベクトル数〜100万件数億件対応

jisaku.comでの運用: 用語集・記事の類似検索にQdrantを採用(11,800件規模での高速検索)。pgvectorはPostgreSQLに統合された軽量用途向けに利用。

この記事について
カテゴリーAI・機械学習
難易度中級
作成日2026/6/7