pgvectorによるベクトル検索
pgvector拡張で埋め込みを保存し、ivfflat / HNSWによる近似最近傍検索を実行します。
「pgvectorによるベクトル検索」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
ベクトルは何に使うのか
埋め込みは意味をベクトルとして表現します。同じトピックについて書かれた2つのドキュメントは、似たベクトルになります。ベクトル検索は、セマンティック検索、RAG(検索拡張生成)、レコメンデーションを支えます。
pgvectorを有効にする
この拡張は広く利用でき、RDS、Cloud SQL、Supabaseには組み込みで用意されています。
CREATE EXTENSION vector;ベクトル列
埋め込みモデルの次元数を指定して列を定義します。
CREATE TABLE docs (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
body TEXT NOT NULL,
embedding vector(1536)
);
-- 1536 is OpenAI text-embedding-3-small dimension; varies by model.埋め込みを挿入する
配列リテラルとしてベクトルを挿入します。
INSERT INTO docs (title, body, embedding)
VALUES ('SQL Course', 'Learn SQL', '[0.013, -0.024, ...]');距離演算子
pgvectorには次の3つがあります。
<->— ユークリッド距離(L2距離)<#>— 負の内積<=>— コサイン距離(埋め込みで最も一般的)
最近傍検索
クエリベクトルに最も近いドキュメントを検索します。
SELECT id, title, 1 - (embedding <=> $1) AS similarity
FROM docs
ORDER BY embedding <=> $1
LIMIT 10;IVFFlatインデックス
大規模なデータセットでは、近似最近傍(ANN)インデックスを構築します。
CREATE INDEX docs_embedding_idx
ON docs USING IVFFLAT (embedding vector_cosine_ops)
WITH (lists = 100);
-- Tune lists by row count: rule of thumb sqrt(N).
-- Set probes per query for accuracy:
SET ivfflat.probes = 10;HNSWインデックス(PG 16以降)
多くの場合、IVFFlatよりも再現率とレイテンシーに優れています。
CREATE INDEX docs_embedding_hnsw
ON docs USING HNSW (embedding vector_cosine_ops);
SET hnsw.ef_search = 100;フィルター付きベクトル検索
ベクトルによる検索と構造化データのフィルターを組み合わせます。
SELECT id, title
FROM docs
WHERE language = 'en'
AND created_at >= NOW() - INTERVAL '30 days'
ORDER BY embedding <=> $1
LIMIT 10;
-- For best perf, partial index on the filter.RAGパターン
埋め込みによって関連するドキュメントをN件取得し、LLMにコンテキストとして渡します。
-- 1. Embed user query
-- 2. SELECT top-N docs by cosine
-- 3. Send docs + query to LLM
-- 4. Return LLM's answer to userハイブリッド検索
ベクトル検索と字句検索(tsvector)を組み合わせると、最良の結果が得られます。どちらか一方だけでは、すべてを捉えられません。
SELECT id, title,
0.6 * (1 - (embedding <=> $1)) + 0.4 * ts_rank(search_doc, $2) AS score
FROM docs
WHERE embedding <=> $1 < 0.7
OR search_doc @@ $2
ORDER BY score DESC LIMIT 10;次元数の選択
埋め込みを大きくすると精度は上がりますが、ストレージ使用量が増え、処理も遅くなります。多くのアプリでは384〜768次元のモデルで十分に動作します。モデルを選んだら、そのモデルを使い続けてください。
まとめ
pgvectorによって、Postgresで本格的なベクトル検索を利用できます。
- vector(N)列型
- IVFFlat / HNSWインデックス
- 埋め込み用の<=>によるコサイン距離
- 高い再現率を得るためのFTSとのハイブリッド検索
クイックチェック
OpenAIの埋め込みを使って意味的類似度で検索しています。通常、どのpgvector距離演算子を使いますか?
よくある質問
「pgvectorによるベクトル検索」レッスンは無料ですか?
はい。「pgvectorによるベクトル検索」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「pgvectorによるベクトル検索」で何を学びますか?
pgvector拡張で埋め込みを保存し、ivfflat / HNSWによる近似最近傍検索を実行します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「pgvectorによるベクトル検索」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。