Tasuke HubLearn · Solve · Grow
#PostgreSQL

PostgreSQL × AI時代の必須拡張「pgvector」で実現するベクトル検索とRAG

専用ベクトルDBは不要?PostgreSQLのpgvector拡張を使えば、既存のRDBでAI Embeddingsの保存・類似検索が可能に。LangChainとの統合例も含めて解説します。

時計のアイコン26 November, 2025
TH

Tasuke Hub管理人

東証プライム市場上場企業エンジニア

情報系修士卒業後、大手IT企業にてフルスタックエンジニアとして活躍。 Webアプリケーション開発からクラウドインフラ構築まで幅広い技術に精通し、 複数のプロジェクトでリードエンジニアを担当。 技術ブログやオープンソースへの貢献を通じて、日本のIT技術コミュニティに積極的に関わっている。

🎓情報系修士🏢東証プライム上場企業💻フルスタックエンジニア📝技術ブログ執筆者

ベクトルDBを新たに導入する必要、本当にありますか?

AIアプリケーション開発において、「Embeddings(埋め込みベクトル)を保存するなら専用のベクトルDBが必要」という常識が広まっています。

Pinecone、Weaviate、Qdrant...これらは確かに強力ですが、以下のような問題もあります:

  • 新しいインフラの学習コスト
  • 別サービスの管理負担
  • データの分散(リレーショナルデータとベクトルデータが別々)

pgvectorなら、PostgreSQL一つで全て解決します。

ベストマッチ

最短で課題解決する一冊

この記事の内容と高い親和性が確認できたベストマッチです。早めにチェックしておきましょう。

pgvectorとは?

pgvectorは、PostgreSQLにベクトル型とベクトル演算機能を追加するオープンソース拡張です。

主な機能

  1. vector型: 高次元ベクトル(最大16,000次元)を格納
  2. 類似度検索: L2距離、内積、コサイン類似度をサポート
  3. インデックス: IVFFlat、HNSWによる高速化
  4. 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 - RAGLLMの回答精度を向上させる手法です。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

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の可能性を再発見してみませんか?

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

この記事をシェア

続けて読みたい記事

編集部がピックアップした関連記事で学びを広げましょう。

#RisingWave

RisingWave入門:PostgreSQL互換のストリーム処理データベースを使ってみる【2025年版】

2025/9/19
#Cursor

【2025年最新】AIがコードを書く時代!Cursor Composerで実現する超高速開発

2025/11/26
#PostgreSQL

PostgreSQL遅いクエリ完全解決ガイド【2025年実務トラブルシューティング決定版】

2025/8/17
#Svelte

Svelte 5 Runes実践ガイド:$stateと$effectで実現する新しいリアクティビティ【2025年版】

2025/9/19
#サプライチェーン

【2025年版】AIで実現するサプライチェーン可視化

2025/11/23
#API

GraphQL vs REST【2025実運用比較】:性能・保守・セキュリティ・コストの意思決定ガイド

2025/9/13