生成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
日本語圏で導入が進む Milvus、Qdrant、pgvector を比較します(2025年7月時点)。
項目 | Milvus | Qdrant | pgvector |
---|---|---|---|
開発元 | Zilliz | Qdrant Team | PostgreSQL Community |
GitHub Stars (2025/07) | 35k+ | 24.5k+ | 16k+ |
ライセンス | Apache 2.0 | Apache 2.0 | PostgreSQL |
主なインデックス | HNSW / IVF+PQ / DiskANN | HNSW / GPU‑HNSW / Scalar Quantization / Product Quantization | IVFFlat / HNSW |
GPU サポート | ○(検索・学習) | ○(オンプレ)/Cloud β ※Search-only | ― |
スケール | 水平分割(分散) | 水平分割・レプリカ ※ GA | PostgreSQL クラスタ |
クラウド | Zilliz Cloud Serverless | Qdrant 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 Pricing/Qdrant 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 やクラウド版へ移行するステップアップ方式が安全です。
増え続けるベクトルに備えて、レイテンシ と 運用コスト を常に計測し、最適なアーキテクチャを選定しましょう。