RAG ベクトルDB選定実践:Pinecone vs Weaviate vs Milvus 徹底比較
RAG システムのドキュメントは 200 万件しかないのに、P99 レイテンシが 800ms まで跳ね上がる——典型的な選定ミスです。チームは Chroma で 2 週間でプロトタイプを組みましたが、データ量が 100 万を超えるとレイテンシは 20ms から一気に上昇。別ソリューションへの移行にさらに 3 週間。エクスポート、ベクトル再構築、インデックス設定の各段階でつまずきました。
ベクトル DB を正しく選べば、RAG システムは半分成功したも同然です。検索段階が AI が「正しい」情報を見つけられるかを決め、生成段階はその上で「良い」回答を出します。検索が崩れれば、プロンプトやモデルをいくら調整しても無駄です。
本記事では Pinecone、Weaviate、Milvus の 3 製品を、性能ベンチマーク・料金モデル・適用シーンの観点で比較します。読み終えれば、自分のシナリオに何を選ぶべきか、実コストも含めた判断フレームが持てます。
第 1 章:なぜベクトル DB 選定がこれほど重要なのか
1.1 RAG におけるベクトル DB の位置づけ
よくある誤解は、ベクトル DB が Embedding を置く「倉庫」に過ぎないというものです。本質的な価値は保存ではなく、「意味的類似性」の高速検索にあります。
従来 DB は WHERE id = 100 のような完全一致が得意です。RAG が解くのは別の問題です。ユーザーが「Python コードの性能を最適化する方法」と聞いたら、キーワード一致ではなく意味的に最も関連する文書を見つける必要があります。ベクトル DB はテキスト・画像・音声を高次元ベクトル(例:OpenAI text-embedding-3-small の 1536 次元)に変換し、ANN(近似最近傍)で百万〜億規模から「最も近い」候補を素早く取り出します。
ANN の核心はリコール率とクエリレイテンシのトレードオフです。全ベクトル距離の厳密計算は高コスト——1536 次元 100 万ベクトルの全走査は数十秒かかります。HNSW、IVF、PQ などの ANN は「近似」でミリ秒級に抑え、代わりに一部の関連結果を取りこぼす可能性があります。製品ごとにこの曲線上の折衷が異なり、RAG の検索精度に直結します。
1.2 選定ミスの実コスト
私たちの失敗例は典型です。Chroma はローカル開発向き——pip install chromadb で 5 分起動。しかし 100 万ドキュメント超で単一マシンの限界が露呈。マルチマシン拡張は自前運用、移行、インデックス再構築、ロードバランスがすべて手作業です。
もう一つの落とし穴は Pinecone のコスト暴走です。無料枠は 100 万ベクトルまで魅力的。有料に移るとストレージとクエリ回数の二重課金で想定外になりがち。法律 AI の知人は 5,000 万ドキュメント・1 日 10 万クエリで月 $3,000 超——当初見積もり $500 を大きく上回りました。
選定ミスは技術問題であると同時に、お金の問題でもあります。
1.3 2026 年のベクトル DB 地図
市場は概ね「三強争覇 + 新勢力」の構図です。
三大主力:
- Pinecone:フルマネージド Serverless。すぐ使える。2026 年の Serverless で参入障壁はさらに低下。
- Weaviate:モジュール設計。グラフ DB 能力内蔵。ハイブリッド検索(キーワード + ベクトル)が強い。
- Milvus:分散クラウドネイティブ。GPU 加速。億規模をミリ秒で。大規模向け。
新勢力:
- pgvector:PostgreSQL 拡張。既存 PG 利用なら追加コストほぼゼロ。軽量・小規模向け。
- Qdrant:OSS、性能良好。自ホストなら Milvus より軽量なコスパ路線。
本記事は前三製品を中心に比較します。ゼロ運用マネージドから大規模自ホストまで主流需要をカバーするためです。pgvector と Qdrant は特殊シーンで触れます。
第 2 章:3 製品の核心差分
2.1 アーキテクチャ:3 つの思想
Milvus:分散クラウドネイティブ
Milvus は「大規模のために生まれた」設計です。Kubernetes デプロイ、多レプリカ同期、水平拡張が前提。コーディネーター(スケジュール)、データノード(保存)、クエリノード(検索)と役割分担が明確です。
本番運用には専門的な SRE 能力が必要です。Kubernetes、クラスタ設定、GPU パラメータ調整の理解が求められます。一度安定すれば 1,000 万から 100 億ベクトルまでノード追加で拡張でき、アーキテクチャ変更は不要。公式推奨:本番は最低 3 ノード、1 ノード 16GB メモリ以上。億規模では GPU(NVIDIA A100 級)を推奨。
Pinecone:フルマネージド Serverless
Pinecone は「手間ゼロ」を極限まで。サーバー管理、インデックス設定、スケールも不要——登録、インデックス作成、API 呼び出しの 3 ステップ。2026 年 Serverless は実使用量課金で、アイドル時コストも最小。
代償は柔軟性の制約です。垂直拡張のみ——容量上限はクラウド側依存。Milvus のようにノード追加の水平拡張はできません。HNSW の M や ef などの深いチューニングも限定的で、プリセットから選ぶ形です。検索性能を細かく最適化したい場合は「縛られている」と感じるかもしれません。
Weaviate:モジュール設計 + グラフ DB 系譜
Weaviate はベクトル DB とグラフ DB を融合。各ベクトルにオブジェクト属性(テキスト、画像、メタデータ)を持たせ、オブジェクト間の意味関係も定義できます。ナレッジグラフ系では類似ベクトル検索に加え、関係チェーンを辿る検索が可能です。
モジュール性も強みです。Embedding モジュールで OpenAI、Cohere、ローカルモデルに接続。ベクトル化モジュールはカスタム可能。マルチモーダル(テキストで画像検索)も標準対応。自ホスト、Weaviate Cloud、ハイブリッドとデプロイも柔軟。ただし設定項目が多く、Pinecone より学習コストは高めです。
2.2 性能ベンチマーク:実データ比較
下表は Tencent Cloud 2025 年比較評価と IoT Digital Twin PLM 2026 ベンチマークを基にしています。条件:1536 次元(OpenAI text-embedding-3-small)、HNSW インデックス、リコール率 95%。
| 製品 | 単一インデックス容量 | レイテンシ(P99) | ハイブリッド検索 | 分散対応 | GPU 加速 |
|---|---|---|---|---|---|
| Milvus | 100 億級 | <50ms | 対応 | 対応 | 対応 |
| Weaviate | 1,000 億級 | <150ms | 対応 | 対応 | 非対応 |
| Pinecone | 10 億級 | <100ms | 対応 | 自動スケール | 非対応 |
重要な観察:
-
レイテンシ差は顕著:Milvus GPU 加速で P99 <50ms。Weaviate の約 3 倍速。リアルタイム Q&A やカスタマーサポートなど速度敏感シーンではユーザーが体感します。
-
容量上限が異なる:Weaviate は 1,000 億級を公称しますが、10 億超で性能低下が目立ちます。Milvus は億規模で安定。分散とシャーディングの恩恵です。Pinecone 10 億上限は中小規模には十分ですが、大企業級では不足する場合があります。
-
ハイブリッド検索が標準化:3 製品ともベクトル + キーワードに対応。Weaviate はグラフ DB 系譜により意味関係モデルが自然で、複雑な意味シーンでは純ベクトルより 5〜10% 精度向上(Tencent Cloud 評価)。
2.3 料金モデル:実コストを計算する
各社の課金方式は異なります。主要プランのコスト構成を整理しました。
Pinecone:
- 無料枠:100 万ベクトル、ストレージ $0、クエリ回数に上限
- 有料:$70/月〜(10 億ベクトルストレージ込み)、超過分はクエリ課金
- 式:
Cost = $70 + (クエリ数 × $0.0001/回)(無料枠超過後)
Weaviate:
- クラウド:$0.01/GB/月(ストレージ)、クエリ無制限
- 式:
Cost = (ベクトル数 × 1536 次元 × 4 バイト ÷ 1GB) × $0.01 × 月数 - 自ホスト:OSS 無料、サーバー費用は自負
Milvus:
- OSS:自ホスト無料
- クラウド(Tencent Cloud/AWS):ノード課金、高スペックノード約 $2,000/月
- 式:
Cost = ノード数 × $2,000/月 + GPU コスト(必要時)
実例:5,000 万ベクトル、1 日 10 万クエリ、1536 次元。
| プラン | 月コスト目安 | 説明 |
|---|---|---|
| Pinecone 有料 | $70 + 10 万×30×$0.0001 = $370 | クエリ課金。高頻度だと高コスト |
| Weaviate クラウド | 5,000 万×1536×4÷1024³ × $0.01 ≈ $3 | ストレージ課金、クエリ無制限で激安 |
| Milvus 自ホスト | サーバー $500 + GPU $1,000 = $1,500 | 長期利用で摊薄可能。運用人件費は別 |
Weaviate のストレージ課金は高頻度クエリで圧倒的コスパです。ただし自ホストの運用コストを忘れがち——Kubernetes 経験者の採用は年俸最低 $50k 級です。
第 3 章:シーン別選定デシジョンツリー
「最良」はなく「最適」だけ。データ量とチーム規模で判断します。
3.1 迅速プロトタイプ(<100 万ベクトル)
推奨:Pinecone 無料枠 または Chroma ローカル
プロダクト検証、社内デモ、成長速度不明なら Pinecone 無料枠を優先。理由はシンプル:運用ゼロ、5 分統合、無料枠で足りる。Chroma も可ですが、100 万超で移行が painful になります。
起動速度比較:
Pinecone:
from pinecone import Pinecone
pc = Pinecone(api_key="your-api-key")
index = pc.Index("my-index") # インデックスはクラウド側で作成済み
Chroma:
import chromadb
client = chromadb.Client() # ローカルメモリモード
collection = client.create_collection("my-collection")
どちらも起動は速いですが、Pinecone はクラウド永続化、Chroma ローカルはプロセス再起動でデータ消失。セッション跨ぎの永続化が必要なら Pinecone 無料枠が適します。
3.2 本番・中小規模(100 万〜1 億ベクトル)
推導:Pinecone 有料 または Weaviate クラウド
運用コストと検索精度の 2 軸で選びます。専任 SRE がいなければマネージド優先。Pinecone と Weaviate Cloud はどちらも運用不要。課金モデル差は大きい:高頻度クエリは Weaviate(ストレージ課金)、低頻度は Pinecone(ストレージ + クエリ)。
法律 AI や医療 Q&A など精度重視なら Weaviate のハイブリッド検索。Tencent Cloud 評価では複雑な意味シーンで純ベクトルより 5〜10% 向上。グラフ能力でナレッジグラフ検索も——類似文書だけでなく意味関係チェーンも辿れます。
コスト試算式:
月コスト = (ベクトル数 × 次元 × 4 バイト ÷ 1GB) × ストレージ単価 × 月数
+ (1 日平均クエリ × 30 × クエリ単価)
Weaviate のクエリ単価は 0。Pinecone は約 $0.0001/回。自分の数字を入れると差は大きいです。
3.3 大規模エンタープライズ(>1 億ベクトル)
推奨:Milvus 自ホスト + Kubernetes
億規模ではマネージドのコスパが崩れます。Pinecone 10 億上限不足、Weaviate クラウドも億級ストレージ課金は高額。Milvus 自ホストが最適——OSS 無料、GPU 加速、水平拡張。
前提は運用チームです。Milvus デプロイには:
- Kubernetes クラスタ(最低 3 ノード)
- GPU サーバー(NVIDIA A100 級)
- インデックスパラメータ調整とレイテンシチューニング
運用人件費を軽視しないでください。Kubernetes 経験がなければ採用・研修コストが 1〜2 ヶ月単位でかかります。長期・データ成長確実なプロジェクトでは総コストはマネージドより低くなりがちですが、初期投資は大きいです。
3.4 特殊シーン
マルチモーダル(テキスト→画像、画像→画像):Weaviate
CLIP 等のマルチモーダル Embedding モジュール内蔵。画像アップロード→自動ベクトル化→テキストと同一インデックス検索。Milvus も可能ですがベクトル化は自前設定。Pinecone はマルチモーダル非対応——ベクトルは自前生成が必要。
ナレッジグラフ + RAG:Weaviate
オブジェクト間関係(例:会社-従業員-プロジェクト)を定義し、関係を辿って関連エンティティを検索。Milvus と Pinecone は純ベクトルのみ。
軽量 / 既存 PostgreSQL:pgvector
既存 PG 利用で百万級以内なら追加コストほぼゼロ。CREATE EXTENSION vector; で ANN 検索可能。専用ベクトル DB より性能は劣り、百万超でレイテンシが目立ちます。
第 4 章:LangChain 連携実践コード
3 製品の LangChain 連携サンプルです。初期化・ベクトル追加・クエリの 3 ステップを含み、すぐ実行できます。
4.1 Pinecone + LangChain
# 依存関係インストール
# pip install pinecone-client langchain-openai
from pinecone import Pinecone
from langchain_openai import OpenAIEmbeddings
from langchain_pinecone import PineconeVectorStore
# Pinecone 初期化
pc = Pinecone(api_key="your-pinecone-api-key")
index_name = "rag-demo"
# インデックス作成(初回のみ)
if index_name not in pc.list_indexes().names():
pc.create_index(
name=index_name,
dimension=1536, # OpenAI text-embedding-3-small
metric="cosine",
spec={"serverless": {"cloud": "aws", "region": "us-east-1"}}
)
index = pc.Index(index_name)
# LangChain ベクトルストア初期化
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = PineconeVectorStore(
index=index,
embedding=embeddings,
text_key="text"
)
# ドキュメント追加
from langchain.schema import Document
docs = [
Document(page_content="Python 性能Tips:リスト内包表記でループ代替", metadata={"source": "blog"}),
Document(page_content="NumPy ベクトル演算は純 Python より 100 倍速", metadata={"source": "blog"}),
]
vectorstore.add_documents(docs)
# 類似検索
results = vectorstore.similarity_search("Python 性能", k=3)
for doc in results:
print(doc.page_content)
4.2 Weaviate + LangChain
# 依存関係インストール
# pip install weaviate-client langchain-openai
import weaviate
from langchain_openai import OpenAIEmbeddings
from langchain_weaviate import WeaviateVectorStore
# Weaviate 初期化(クラウド例)
client = weaviate.connect_to_wcs(
cluster_url="your-cluster-url.weaviate.network",
auth_credentials=weaviate.auth.AuthApiKey("your-weaviate-api-key"),
)
# LangChain ベクトルストア初期化
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = WeaviateVectorStore(
client=client,
index_name="RagDemo",
text_key="content",
embedding=embeddings,
)
# ドキュメント追加
from langchain.schema import Document
docs = [
Document(page_content="RAG 検索精度はベクトル DB 選定に依存", metadata={"category": "tech"}),
Document(page_content="Weaviate ハイブリッド検索で意味検索精度向上", metadata={"category": "tech"}),
]
vectorstore.add_documents(docs)
# ハイブリッド検索(ベクトル + キーワード)
results = vectorstore.similarity_search(
query="RAG 検索",
k=3,
)
for doc in results:
print(doc.page_content)
client.close() # 接続クローズ
4.3 Milvus + LangChain
# 依存関係インストール
# pip install pymilvus langchain-openai
from pymilvus import MilvusClient
from langchain_openai import OpenAIEmbeddings
from langchain_milvus import Milvus
# Milvus 初期化(ローカル例)
client = MilvusClient(uri="http://localhost:19530")
# collection 作成
collection_name = "rag_demo"
if client.has_collection(collection_name):
client.drop_collection(collection_name)
client.create_collection(
collection_name=collection_name,
dimension=1536,
)
# LangChain ベクトルストア初期化
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Milvus(
embedding_function=embeddings,
collection_name=collection_name,
connection_args={"uri": "http://localhost:19530"},
)
# ドキュメント追加
from langchain.schema import Document
docs = [
Document(page_content="Milvus GPU 加速で億級ベクトルをミリ秒検索", metadata={"gpu": True}),
Document(page_content="分散アーキテクチャで 100 億ベクトルまで水平拡張", metadata={"scale": "large"}),
]
vectorstore.add_documents(docs)
# 類似検索
results = vectorstore.similarity_search("大規模ベクトル検索", k=3)
for doc in results:
print(doc.page_content)
4.4 移行パス:Chroma からマネージドへ
Chroma プロトタイプから本番へ移行する 3 ステップ:
Step 1:Chroma データエクスポート
import chromadb
client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_collection("my_collection")
# 全ベクトル取得
results = collection.get(include=["embeddings", "metadatas", "documents"])
vectors = results["embeddings"]
metadatas = results["metadatas"]
documents = results["documents"]
Step 2:ターゲット DB へ一括インポート
# Pinecone へインポート
from langchain.schema import Document
docs = [
Document(page_content=documents[i], metadata=metadatas[i])
for i in range(len(documents))
]
pinecone_store.add_documents(docs) # 一括アップロード
Step 3:インデックス再構築と検証
# 検索結果の一貫性確認
chroma_results = collection.query(query_texts=["test query"], n_results=5)
pinecone_results = pinecone_store.similarity_search("test query", k=5)
# リコール率を比較し移行成功を確認
移行時間目安:100 万ベクトルを Chroma から Pinecone へ約 2〜3 時間(帯域依存)。低トラフィック時間帯を推奨。
第 5 章:まとめと選定表
5.1 選定デシジョン表
| シーン | データ量 | チーム規模 | 推奨 | 理由 |
|---|---|---|---|---|
| プロトタイプ | <100 万 | 1〜2 人 | Pinecone 無料枠 | 運用ゼロ、即起動、無料枠十分 |
| 本番・中小 | 100 万〜1 億 | 3〜5 人、SRE なし | Weaviate クラウド | ハイブリッド精度高、ストレージ課金で安い |
| 本番・高頻度 | 100 万〜1 億 | 3〜5 人 | Weaviate クラウド | クエリ無制限、高頻度で最高コスパ |
| 本番・低頻度 | 100 万〜1 億 | 3〜5 人 | Pinecone 有料 | クエリ課金、低頻度ならコントロール可 |
| 大規模エンタープライズ | >1 億 | 5 人+ SRE | Milvus 自ホスト | GPU 加速、水平拡張、長期コスト低 |
| マルチモーダル | 不限 | 不限 | Weaviate | マルチモーダル内蔵、すぐ使える |
| ナレッジグラフ RAG | 不限 | 不限 | Weaviate | グラフ系譜、意味関係モデル |
| 軽量 / 既存 PG | <100 万 | 不限 | pgvector | 追加コストほぼゼロ |
5.2 3 ステップ選定フロー
-
データ量と成長見通しを評価
- 現時点のドキュメント数は?
- 1 年後の見込みは?
- 線形成長か指数成長か?
-
実コストを計算
月コスト = ストレージ + クエリ + 運用上記の式でマネージドと自ホストを比較。運用コストを忘れずに——マネージドは SRE 節約、自ホストは長期摊薄。
-
小規模テストで検証
- 10% データでプロトタイプ
- P99 レイテンシ、リコール率、QPS を計測
- 期待値を満たしてから全量移行
5.3 よくある 3 つの選定ミス
ミス 1:価格だけ見て運用コストを無視
OSS を「無料」で選びがちですが、自ホスト人件費は見落とされがち。Kubernetes SRE の年俸 $50k+、既存チーム研修は 1〜2 ヶ月。マネージドは一見高くても、節約した運用コストを足し算してください。
ミス 2:ベクトル次元の性能影響を軽視
text-embedding-3-large は 3072 次元——small(1536 次元)の 2 倍。次元が高いほどレイテンシとストレージが増えます。Embedding モデルを先に決め、DB が高次元をサポートするか確認を。
ミス 3:必要な Embedding モデル非対応を後から発覚
Pinecone はベクトル保存のみ——Embedding は自前生成が必要。Weaviate は OpenAI、Cohere、ローカルモデル等のベクトル化モジュール内蔵。「ドキュメント投入で自動ベクトル化」が必要なら選定時に確認を。
標準答案はありません。シーンを明確に、実コストを計算し、小規模検証の後に本番へ。本記事が選定の落とし穴を減らす助けになれば幸いです。
実戦で他の課題に当たったら、ぜひコメントで共有してください——私もまだ試行錯誤の最中です。
FAQ
Pinecone、Weaviate、Milvus のうちレイテンシが最も低いのは?
高頻度クエリで最も安いのは?
運用チームがない場合はどれを選ぶ?
Chroma からの移行にどれくらいかかる?
ベクトル次元はどう選ぶ?
ナレッジグラフ + RAG ならどれ?
9分で読めます · 公開日: 2026年4月27日 · 更新日: 2026年6月15日
RAG エンジニアリング実践ガイド
検索からこのページに来た場合は、前後の記事もあわせて読むと同じテーマの理解がかなり早く深まります。
前の記事
RAG + Agent:次世代 AI アプリケーションのアーキテクチャ
従来型 RAG から Agentic RAG へのアーキテクチャ進化を解説。10 種類の RAG パターン、フレームワーク選定の比較、エンタープライズ導入ロードマップ、AI カスタマーサポートの実践事例まで網羅
第 1 / 6 記事
次の記事
RAG システム最適化の実践:検索精度と生成品質のバランス術
RAG の検索が不正確なときどうする?本記事は Query 処理、ハイブリッド検索、リランキング、チャンク戦略、評価ループの 5 大要素を体系的に分解し、精度とレイテンシのバランス判断フレームを提供します。
第 3 / 6 記事
関連記事
RAG クエリルーティング実践:マルチベクトルストア連携とインテリジェント検索分散
RAG クエリルーティング実践:マルチベクトルストア連携とインテリジェント検索分散
RAG クエリルーティング実践:複数ベクトル DB の連携とスマートな検索振り分け
RAG クエリルーティング実践:複数ベクトル DB の連携とスマートな検索振り分け
Hyper の会社ブレイン:AI Agent の知識ベースはどう設計すべきか
コメント
GitHubアカウントでログインしてコメントできます