ベクトルDBを新たに導入する必要、本当にありますか?
AIアプリケーション開発において、「Embeddings(埋め込みベクトル)を保存するなら専用のベクトルDBが必要」という常識が広まっています。
Pinecone、Weaviate、Qdrant...これらは確かに強力ですが、以下のような問題もあります:
- 新しいインフラの学習コスト
- 別サービスの管理負担
- データの分散(リレーショナルデータとベクトルデータが別々)
pgvectorなら、PostgreSQL一つで全て解決します。
最短で課題解決する一冊
この記事の内容と高い親和性が確認できたベストマッチです。早めにチェックしておきましょう。
pgvectorとは?
pgvectorは、PostgreSQLにベクトル型とベクトル演算機能を追加するオープンソース拡張です。
主な機能
- vector型: 高次元ベクトル(最大16,000次元)を格納
- 類似度検索: L2距離、内積、コサイン類似度をサポート
- インデックス: IVFFlat、HNSWによる高速化
- RDB統合: JOINやトランザクションが使える
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
実践:AIチャットボットのナレッジベース構築
OpenAI Embeddingsとpgvectorを組み合わせて、RAG(Retrieval Augmented Generation)システムを作ってみましょう。
1. pgvectorのインストール
-- PostgreSQL拡張のインストール
CREATE EXTENSION vector;2. テーブル作成
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536), -- OpenAI Embeddings (text-embedding-3-small) は1536次元
metadata JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
-- 高速化のためのインデックス(HNSW)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops);3. Embeddingsの保存(Python例)
import openai
import psycopg2
from psycopg2.extras import execute_values
# OpenAI APIでEmbeddingsを生成
def get_embedding(text: str):
response = openai.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
# PostgreSQLに保存
conn = psycopg2.connect("postgresql://user:pass@localhost/mydb")
cur = conn.cursor()
documents = [
"PostgreSQLはオープンソースのRDBMSです。",
"pgvectorを使うとベクトル検索が可能になります。",
"RAGはLLMの回答精度を向上させる手法です。"
]
for doc in documents:
embedding = get_embedding(doc)
cur.execute(
"INSERT INTO documents (content, embedding) VALUES (%s, %s)",
(doc, embedding)
)
conn.commit()4. 類似度検索の実行
def search_similar(query: str, limit: int = 3):
query_embedding = get_embedding(query)
cur.execute("""
SELECT
content,
1 - (embedding <=> %s::vector) AS similarity
FROM documents
ORDER BY embedding <=> %s::vector
LIMIT %s
""", (query_embedding, query_embedding, limit))
return cur.fetchall()
# 検索実行
results = search_similar("ベクトルデータベースについて教えて")
for content, similarity in results:
print(f"類似度: {similarity:.3f} - {content}")出力例:
類似度: 0.912 - pgvectorを使うとベクトル検索が可能になります。
類似度: 0.834 - PostgreSQLはオープンソースのRDBMSです。
類似度: 0.756 - RAGはLLMの回答精度を向上させる手法です。さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
LangChainとの統合
LangChainのベクトルストアとしてpgvectorを使用できます。
from langchain_openai import OpenAIEmbeddings
from langchain_postgres.vectorstores import PGVector
# 接続情報
connection_string = "postgresql://user:pass@localhost/mydb"
# ベクトルストアの初期化
vectorstore = PGVector(
collection_name="my_docs",
connection_string=connection_string,
embeddings=OpenAIEmbeddings()
)
# ドキュメントの追加
vectorstore.add_texts([
"pgvectorはPostgreSQLの拡張機能です。",
"HNSWインデックスで高速検索が可能です。"
])
# 類似検索
docs = vectorstore.similarity_search("PostgreSQLの拡張", k=2)
for doc in docs:
print(doc.page_content)さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
パフォーマンスチューニング
インデックスの選択
-- IVFFlat(メモリ効率重視)
CREATE INDEX ON documents
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
-- HNSW(速度重視、推奨)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);クエリの最適化
-- プリウォーム(インデックスをメモリに載せる)
SELECT pg_prewarm('documents_embedding_idx');
-- 検索精度の調整(HNSWの場合)
SET hnsw.ef_search = 100; -- 大きいほど精度向上、速度低下まとめ
pgvectorを使えば、既存のPostgreSQLインフラを活用しながら、最新のAI機能を実装できます。
- リレーショナルデータとベクトルデータを同じDB内でJOIN
- トランザクション保証
- 運用ノウハウの再利用
「ベクトルDBは別サービス」という思い込みを捨て、PostgreSQLの可能性を再発見してみませんか?
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
![標準SQL+データベース入門 ——RDBとDB設計、基本の力[MySQL/PostgreSQL/MariaDB/SQL Server対応]](https://m.media-amazon.com/images/I/51FLS9XpmUL._SL500_.jpg)
![Ansible実践ガイド 第4版[基礎編] impress top gearシリーズ](https://m.media-amazon.com/images/I/516W+QJKg1L._SL500_.jpg)



