Vector Database徹底入門 ─ Milvus・Qdrant・pgvectorの選び方とAI検索実装ガイド

Vector Database徹底入門 ─ Milvus・Qdrant・pgvectorの選び方とAI検索実装ガイド

生成AI時代の検索体験を支えるのがベクターデータベースです。この記事では Milvus・Qdrant・pgvector の特徴を比較し、用途別の選定ポイントと Python での実装手順を分かりやすく解説します。

目次

ベクターデータベースがAI検索を支える理由

生成AIの普及で、ユーザーは「キーワード検索」よりも自然文で質問し即答を得る体験を求めています。

テキストや画像を 512〜1536 次元 の数値列―ベクトル―へ変換し、高速に類似度計算を行う ベクターデータベース がその裏側を支えています。

最近はクラウド上で 数十億ベクトル を扱う事例が増え、レコメンドや RAG(Retrieval‑Augmented Generation)の心臓部になりました。

ベクターデータベースとは?類似度検索専用のストレージ

ベクターデータベースは多次元ベクトルを格納し 近似最近傍検索(ANN) を高速化するデータベースです。

リレーショナル DB の B+ 木はキー検索に最適ですが、多次元ベクトルのコサイン類似度計算には不向きです。そのため HNSW、IVF+PQ、DiskANN など専用インデックスが実装されます。

主要 ANN アルゴリズム

  • HNSW:スモールワールド・グラフで高精度と高速化を両立。
  • IVF+PQ:クラスタ分割 + 量子化でメモリ消費を削減。
  • DiskANN:SSD に退避したベクトルでも高速検索。
    対応距離関数は Cosine / L2 / 内積(MIPS)。
    ※ PostgreSQL Flexible Server で利用する場合は 最大 16k 次元 の制限あり。

主要 3 製品の特徴比較:Milvus・Qdrant・pgvector

日本語圏で導入が進む MilvusQdrantpgvector を比較します(2025年7月時点)。

項目MilvusQdrantpgvector
開発元ZillizQdrant TeamPostgreSQL Community
GitHub Stars
(2025/07)
35k+24.5k+16k+
ライセンスApache 2.0Apache 2.0PostgreSQL
主なインデックスHNSW / IVF+PQ / DiskANNHNSW / GPU‑HNSW / Scalar Quantization / Product QuantizationIVFFlat / HNSW
GPU サポート○(検索・学習)○(オンプレ)/Cloud β
※Search-only
スケール水平分割(分散)水平分割・レプリカ
※ GA
PostgreSQL クラスタ
クラウドZilliz Cloud ServerlessQdrant Cloud
※日本リージョンは予定
Supabase / Neon など
導入難度Docker・Helm
スタンドアロン可
※HA なし
Docker 単体で数分CREATE EXTENSION

Milvus:大規模・GPU ワークロードに最適

Milvus は2019年にOSS化され、2025年6月には GitHub ★35k を突破しました。DiskANN と GPU インデックスを併用することで、数十億ベクトル を扱っても P95 レイテンシ 50 ms 以下を達成します。

公式比較では100万クエリあたり 0.148〜0.178 USD が目安ですが、あくまで概算でありリージョン・vCU 数で変動します。

Qdrant:Rust 製エンジン、GPU 対応を強化

Qdrant は Rust 製シングルバイナリが特徴で、docker run qdrant/qdrant で起動できます。v1.13.0 で GPU‑HNSW が GA(オンプレ版)となり、Cloud では β提供中です。

水平スケールとレプリカも GA 化され、GitHub ★は 24.5k 超。日本リージョンの Cloud は「今後公開予定」と公式がアナウンスしています。

pgvector:PostgreSQL にシームレス統合

pgvector は 2021 年に初版が登場した PostgreSQL 拡張です。v0.5.0 以降は HNSW に対応しますが、初期インデックス作成はmaintenance_work_mem=4GB、ワーカー並列 max_parallel_workers=4 などを設定しないと数時間を要する場合があります。

目安として必要メモリは
行数 × 次元数 × 4 byte
前後で線形に増えるため、

1,000 万行 × 1,536 次元
なら約 60 GB 以上を確保すると安全です。数百万ベクトル規模なら運用コストを最小限に抑えられます。

クラウド料金の考え方

Zilliz Cloud Serverless では 1 M × 768 次元(約 5 GB)まで無料枠があり、以降は vCU 従量課金です。Qdrant Cloud はストレージ容量とリクエスト数で課金されます。

料金は vCU 数・リージョン・データ保持期間によって大きく変動するため、ここでは 目安 を示さず「公式料金ページで最新を確認する」ことを推奨します。
参考:Zilliz PricingQdrant Pricing

Python で始める AI 検索実装ガイド(OpenAI SDK v1.93)

① ベクトル化(埋め込み生成)

from openai import OpenAI
import numpy as np
client = OpenAI(api_key="YOUR_KEY")
resp = client.embeddings.create(
    model="text-embedding-3-small",
    input="吾輩は猫である"
)
vec = np.array(resp.data[0].embedding, dtype=np.float32)

② Qdrant へアップロード

from qdrant_client import QdrantClient, models
client = QdrantClient(url="http://localhost:6333")
client.upsert(
    collection_name="books",
    points=[models.PointStruct(id=1, vector=vec.tolist(), payload={"title":"吾輩は猫である"})]
)

③ 類似検索

query_vec = ...  # 同じモデルでエンコード
res = client.search(collection_name="books", query_vector=query_vec, limit=5)
for hit in res:
    print(hit.payload["title"], hit.score)

④ 精度チューニング

HNSW なら ef_search、IVF+PQ なら nprobe が主要パラメータです。Recall@k や NDCG を指標に、レスポンスタイムと精度のバランスを探りましょう。

まとめ:小さく始めて拡張する

ベクターデータベースは「意味的な近さ」をミリ秒で返すための専門ストレージです。まずはローカルで pgvector や Qdrant を試し、スケール要件が見えたら Milvus やクラウド版へ移行するステップアップ方式が安全です。

増え続けるベクトルに備えて、レイテンシ運用コスト を常に計測し、最適なアーキテクチャを選定しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次