RAG(検索拡張生成)システムを構築する際、避けて通れないのが「ベクトルデータベース」の選定です。
この記事では、主要なベクトルデータベース7種類(Chroma、FAISS、Pinecone、Qdrant、Milvus、Weaviate、pgvector)の特徴を整理し、目的別の選び方をわかりやすく解説します。
ベクトルデータベースとは
ベクトルデータベースとは、テキストや画像などの非構造化データを数値ベクトル(Embedding)として保存し、類似度検索を高速に実行するために設計された専用のデータベースです。
通常のデータベース(RDB)では、「名前 = 田中」のように完全一致で検索しますが、ベクトルデータベースでは「意味的に似ているデータ」を探します。 たとえば、「犬の散歩コース」というクエリに対して「ペットと歩けるおすすめの公園」という文書がヒットする、といった検索が可能です。
なぜRAGにベクトルデータベースが必要なのか
RAGでは、ユーザーの質問に関連する情報をデータベースから検索し、それをLLMに渡して回答を生成します。 このとき「意味的に近い情報」を高速に見つける役割を担うのがベクトルデータベースです。
RAGパイプラインにおけるベクトルデータベースの位置づけは次のとおりです。
- ドキュメントの登録: テキストをチャンク分割し、Embeddingモデルでベクトル化してベクトルDBに保存
- 検索(Retrieval): ユーザーの質問をベクトル化し、類似するベクトルをDBから検索
- 回答生成: 検索結果をLLMに渡し、回答を生成
ベクトルデータベースの性能がそのまま検索精度やレスポンス速度に直結するため、RAGの品質を左右する重要なコンポーネントです。
ベクトルインデックスとベクトルデータベースの違い
混同されやすい概念として「ベクトルインデックス(ライブラリ)」と「ベクトルデータベース」があります。
| 比較項目 | ベクトルインデックス(例: FAISS) | ベクトルデータベース(例: Pinecone) |
|---|---|---|
| 主な役割 | 類似度検索アルゴリズムの提供 | データの保存・管理・検索を統合 |
| データの永続化 | なし(自分で実装が必要) | あり(組み込み済み) |
| CRUD操作 | 限定的 | 完全対応(追加・更新・削除) |
| メタデータフィルタリング | なし | あり |
| スケーラビリティ | 手動で構築が必要 | 組み込み済み |
| 適したユースケース | 研究・プロトタイプ | 本番環境・プロダクション |
FAISSは厳密には「ライブラリ」ですが、RAGの文脈でよく比較対象にあがるため、本記事では合わせて解説します。
主要ベクトルデータベース7選の特徴
Chroma
Chromaは、Apache 2.0ライセンスのオープンソースのベクトルデータベースで、「AIのための検索エンジン」を標榜しています。
GitHub: https://github.com/chroma-core/chroma
主な特徴:
- セットアップが非常に簡単:
pip install chromadbだけで、すぐに使い始められます - Embeddingの自動生成: テキストを渡すだけで内蔵のEmbeddingモデルが自動的にベクトル化してくれます
- 多彩な検索方式: Dense(ベクトル)検索、Sparse(スパース)検索、ハイブリッド検索、全文検索、正規表現検索に対応
- マルチモーダル対応: テキストだけでなく画像や音声の検索にも対応
- Chroma Cloud: マネージドのサーバーレスクラウドサービスも提供
import chromadb
# クライアントの作成(インメモリ)
client = chromadb.Client()
# コレクションの作成
collection = client.create_collection(name="my_docs")
# ドキュメントの追加(Embeddingは自動生成)
collection.add(
documents=["RAGは検索拡張生成の略です", "ベクトルDBは類似度検索に使います"],
ids=["doc1", "doc2"]
)
# クエリ(類似検索)
results = collection.query(query_texts=["RAGとは何ですか?"], n_results=1)
print(results["documents"]) # => [['RAGは検索拡張生成の略です']]向いているユースケース: プロトタイプ開発、小〜中規模のRAGアプリ、手軽に始めたい初心者
FAISS
FAISS(Facebook AI Similarity Search)は、Meta(旧Facebook)が開発した、高速な類似度検索とクラスタリングのためのC++ライブラリです。Pythonラッパーも提供されています。
GitHub: https://github.com/facebookresearch/faiss
主な特徴:
- 圧倒的な検索速度: C++で実装され、AVX512やSIMD命令セットに最適化。数十億ベクトル規模の検索にも対応
- GPU対応: NVIDIAのGPUアクセラレーションに対応し、CPUインデックスのドロップインリプレースとして使用可能
- 豊富なインデックス: IVF、HNSW、PQ(プロダクト量子化)などの多数のアルゴリズムを選択可能
- MITライセンス: 商用利用も自由
import faiss
import numpy as np
# ベクトルの次元数
d = 384
# サンプルデータ(1000件 × 384次元)
vectors = np.random.random((1000, d)).astype("float32")
# インデックスの作成(L2距離)
index = faiss.IndexFlatL2(d)
index.add(vectors)
# 検索(上位5件)
query = np.random.random((1, d)).astype("float32")
distances, indices = index.search(query, k=5)
print(indices) # => 類似ベクトルのインデックス番号注意点: FAISSはあくまで「ライブラリ」であり、データの永続化やメタデータ管理は自分で実装する必要があります。LangChainやLlamaIndexのベクトルストアとして組み込む形で使われることが多いです。
向いているユースケース: 大規模ベクトルの高速検索、研究・実験、既存システムへの組み込み
Pinecone
Pineconeは、ベクトルデータベース専業のクラウドサービスです。インフラ管理が不要なフルマネージド型で、APIを叩くだけで利用できます。
GitHub(公式SDK): https://github.com/pinecone-io/pinecone-python-client
主な特徴:
- 完全マネージド: インフラの構築・管理・スケーリングが全て自動化されており、運用の手間がゼロ
- サーバーレスアーキテクチャ: ストレージとコンピュートが分離され、使った分だけ課金。コスト効率に優れる
- 高いスケーラビリティ: 数十億ベクトルまで自動スケール
- メタデータフィルタリング: ベクトル検索とメタデータによる条件絞り込みを組み合わせた検索が可能
- Namespace(名前空間): インデックス内をテナントごとに分離するマルチテナント機能
from pinecone import Pinecone
# クライアントの初期化
pc = Pinecone(api_key="YOUR_API_KEY")
# インデックスへの接続
index = pc.Index("my-index")
# ベクトルのアップサート
index.upsert(vectors=[
{"id": "doc1", "values": [0.1, 0.2, ...], "metadata": {"category": "RAG"}},
{"id": "doc2", "values": [0.3, 0.4, ...], "metadata": {"category": "LLM"}}
])
# ベクトル検索(メタデータフィルター付き)
results = index.query(
vector=[0.1, 0.2, ...],
top_k=5,
filter={"category": {"$eq": "RAG"}}
)料金体系:
- 無料プラン: 2GBストレージ、サーバーレスインデックス
- Starterプラン: 月額$33〜(100GBストレージ)
- Enterpriseプラン: カスタム見積もり
向いているユースケース: 本番運用のRAGシステム、インフラ管理を避けたいチーム、エンタープライズ
Qdrant
Qdrant(クアドラント)は、Rustで実装されたオープンソースのベクトルデータベースです。高いパフォーマンスとメモリ効率が特長です。
GitHub: https://github.com/qdrant/qdrant
主な特徴:
- Rust製で高速・省メモリ: Rustの安全性とパフォーマンスを活かした実装
- Dense & Sparseベクトル対応: ベクトル検索とスパースベクトル(BM25相当のキーワード検索)の両方をネイティブサポート
- 高度なフィルタリング: HNSWグラフにPayload Index(メタデータインデックス)を統合し、フィルタリングと類似度検索を1パスで実行
- 柔軟なデプロイ: ローカル、Docker、Kubernetes、Qdrant Cloudから選択可能
- マルチテナンシー: Namespace的な分離をサポート
- 豊富なSDK: Python、TypeScript、Rust、Go、.NET、Javaの公式クライアント
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
# クライアントの作成
client = QdrantClient(url="http://localhost:6333")
# コレクションの作成
client.create_collection(
collection_name="my_docs",
vectors_config=VectorParams(size=384, distance=Distance.COSINE)
)
# ベクトルの追加
client.upsert(
collection_name="my_docs",
points=[
PointStruct(id=1, vector=[0.1, 0.2, ...], payload={"text": "RAGの解説"}),
PointStruct(id=2, vector=[0.3, 0.4, ...], payload={"text": "LLMの基礎"}),
]
)
# 検索
results = client.query_points(
collection_name="my_docs",
query=[0.1, 0.2, ...],
limit=5
)向いているユースケース: 高パフォーマンスが求められるRAGシステム、ハイブリッド検索、本番環境
Milvus
Milvus(ミルバス)は、Linux Foundation傘下のオープンソースプロジェクトで、大規模な分散ベクトルデータベースです。マネージドクラウド版としてZilliz Cloudも提供されています。
GitHub: https://github.com/milvus-io/milvus
主な特徴:
- 超大規模対応: 数十億〜数百億ベクトル規模のデータを安定して処理可能
- 3つのデプロイモード: Milvus Lite(Python組み込み)、Standalone(単一Docker)、Distributed(Kubernetes分散)
- 豊富なインデックス: HNSW、IVF、FLAT、SCANN、DiskANNなど、用途に応じたインデックスを選択可能。GPU(NVIDIA CAGRA)にも対応
- 全文検索: BM25ベースの全文検索をネイティブサポート。ハイブリッド検索が容易
- 多言語SDK: Python、Go、Java、Node.js、C#の公式SDK
- 性能: C++で書かれたコア検索エンジンにより、FAISS比で30〜70%高いパフォーマンスを実現(公式発表)
from pymilvus import MilvusClient
# クライアントの作成(Milvus Lite: ローカルファイル保存)
client = MilvusClient("milvus_demo.db")
# コレクションの作成
client.create_collection(
collection_name="my_docs",
dimension=384
)
# データの追加
client.insert(
collection_name="my_docs",
data=[
{"id": 1, "vector": [0.1, 0.2, ...], "text": "RAGの解説"},
{"id": 2, "vector": [0.3, 0.4, ...], "text": "LLMの基礎"}
]
)
# 検索
results = client.search(
collection_name="my_docs",
data=[[0.1, 0.2, ...]],
limit=5,
output_fields=["text"]
)向いているユースケース: 大規模な本番RAGシステム、エンタープライズ向け、分散環境が必要な場合
Weaviate
Weaviate(ウィービエイト)は、AIとの連携を重視したオープンソースのベクトルデータベースです。Embeddingモデルやリランキングモデルとの統合が組み込まれています。
GitHub: https://github.com/weaviate/weaviate
主な特徴:
- モジュール型アーキテクチャ: OpenAI、Cohere、Hugging FaceなどのEmbeddingモデルをモジュールとして統合。ベクトル化をWeaviate側で自動実行できる
- セマンティック+ハイブリッド検索: BM25によるキーワード検索とベクトル検索を組み合わせたハイブリッド検索を標準サポート
- RAG統合(Generative Search): 検索結果をそのままLLMに渡して回答生成を行う「Generative Search」機能を内蔵
- Weaviate Agents: エージェントワークフロー構築のためのプリビルトサービスを提供
- 豊富なデプロイ選択肢: Weaviate Cloud(マネージド)、Docker、Kubernetes、Embedded(Python/JS組み込み)
import weaviate
# クライアントの作成
client = weaviate.connect_to_local()
# コレクションの作成(text2vec-openai モジュール連携)
collection = client.collections.create(
name="MyDocs",
vectorizer_config=weaviate.classes.config.Configure.Vectorizer.text2vec_openai()
)
# データの追加(Embeddingは自動生成)
collection.data.insert({"content": "RAGは検索拡張生成の略です"})
# セマンティック検索
results = collection.query.near_text(query="RAGとは?", limit=5)向いているユースケース: AIモデルとの統合を重視するアプリ、エージェントシステム、マルチモーダル検索
pgvector
pgvectorは、PostgreSQLにベクトル類似度検索機能を追加する拡張モジュール(Extension)です。既存のPostgreSQL環境をそのまま活用できる点が最大の特長です。
GitHub: https://github.com/pgvector/pgvector
主な特徴:
- PostgreSQLそのまま: 既存のテーブル、SQL、トランザクション(ACID)、レプリケーション、JOINなどPostgreSQLの全機能と共存
- 多様な距離関数: L2(ユークリッド)、コサイン、内積、L1、ハミング、ジャカードをサポート
- インデックス: HNSW(推奨)とIVFFlatの2つの近似最近傍検索インデックスを提供
- ハイブリッド検索: PostgreSQLの全文検索(tsvector)と組み合わせたハイブリッド検索が可能
- 幅広い言語対応: PostgreSQLクライアントが使えるすべての言語から利用可能
- 最大16,000次元: 1ベクトルあたり最大16,000次元まで格納可能
-- 拡張モジュールの有効化
CREATE EXTENSION vector;
-- テーブルの作成(384次元のベクトルカラム)
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
content TEXT,
embedding vector(384)
);
-- ベクトルの挿入
INSERT INTO documents (content, embedding)
VALUES ('RAGの解説', '[0.1, 0.2, ...]');
-- コサイン距離で類似検索(上位5件)
SELECT content, embedding <=> '[0.1, 0.2, ...]' AS distance
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5;
-- HNSWインデックスの作成
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);向いているユースケース: 既存のPostgreSQL環境がある場合、RDBとベクトル検索を統合したい場合、追加インフラを増やしたくない場合
比較表:7つのベクトルデータベースを一覧で比較
| 比較項目 | Chroma | FAISS | Pinecone | Qdrant | Milvus | Weaviate | pgvector |
|---|---|---|---|---|---|---|---|
| 種別 | DB | ライブラリ | マネージドDB | DB | DB | DB | PostgreSQL拡張 |
| 開発元 | Chroma | Meta | Pinecone | Qdrant | Zilliz (LF AI) | Weaviate | Andrew Kane |
| ライセンス | Apache 2.0 | MIT | プロプライエタリ | Apache 2.0 | Apache 2.0 | BSD-3 | PostgreSQL |
| 実装言語 | Python/Rust | C++ | – | Rust | Go/C++ | Go | C |
| データ永続化 | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
| メタデータフィルタ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅(SQL) |
| 全文検索 | ✅ | ❌ | ❌ | ✅ | ✅(BM25) | ✅(BM25) | ✅(tsvector) |
| ハイブリッド検索 | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| GPU対応 | ❌ | ✅ | – | ❌ | ✅ | ❌ | ❌ |
| マネージドクラウド | ✅ | ❌ | ✅ | ✅ | ✅(Zilliz Cloud) | ✅ | ✅ |
| 分散処理 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 無料枠 | ✅ | ✅(OSS) | ✅(2GB) | ✅ | ✅(OSS) | ✅ | ✅(OSS) |
| セットアップ難易度 | ★☆☆ | ★★☆ | ★☆☆ | ★★☆ | ★★☆ | ★★☆ | ★☆☆ |
| 最大ベクトル規模 | 小〜中 | 数十億 | 数十億 | 数億 | 数百億 | 数億 | 数億(PGスケール) |
比較ポイント別の選び方ガイド
ベクトルデータベース選定で重要な比較ポイントを軸に、最適な選択肢を整理します。
ポイント①:導入の手軽さ
「まずは試してみたい」「プロトタイプを素早く作りたい」という場合は、以下がおすすめです。
- Chroma:
pip install chromadbの1行で始められ、テキストを渡すだけでEmbeddingも自動生成。最も手軽 - Pinecone: クラウドサービスなのでインフラ構築不要。APIキーを取得すればすぐ使える
- pgvector: 既にPostgreSQLを使っているなら、
CREATE EXTENSION vector;だけで有効化
ポイント②:スケーラビリティ(大規模データへの対応)
数百万〜数十億ベクトルを扱う本番環境の場合は、以下がおすすめです。
- Milvus: Kubernetes上の分散アーキテクチャで数百億ベクトルに対応。最もスケーラブル
- Pinecone: サーバーレス設計でオートスケーリング。運用負荷なしで大規模対応
- FAISS: ライブラリ自体は数十億ベクトルに対応するが、インフラの構築・運用は自分で行う必要がある
ポイント③:検索品質(ハイブリッド検索)
ベクトル検索(意味検索)とキーワード検索を組み合わせて検索精度を高めたい場合は、以下がおすすめです。
- Qdrant: Dense + Sparseのハイブリッド検索をネイティブサポート。フィルタリングも高性能
- Weaviate: BM25 + ベクトル検索のハイブリッド検索を標準搭載
- Milvus: BM25全文検索をネイティブサポートし、リランキング機能も内蔵
- pgvector: PostgreSQLの全文検索(tsvector)と組み合わせ、RRF(Reciprocal Rank Fusion)による統合も可能
ポイント④:運用コスト・料金
コストを抑えたい場合は、以下がおすすめです。
- FAISS / Chroma / pgvector: オープンソースで利用料は無料。インフラ費用(サーバー代)のみ
- Pinecone: 無料枠あり。従量課金のため、小規模なら低コストだが大規模になるとコストが増加
- Qdrant / Milvus / Weaviate: OSSとして無料利用可能。マネージドクラウド版は従量課金
ポイント⑤:既存システムとの統合
既存のデータベースやインフラと連携したい場合は、以下がおすすめです。
- pgvector: PostgreSQLの1テーブルにベクトルカラムを追加するだけ。既存のRDBスキーマ、トランザクション、JOINをそのまま活用可能
- Weaviate: OpenAI・Cohere・Hugging Faceなど外部AIモデルとの統合がモジュールとして組み込み済み
- Milvus: Apache Spark連携、VTSによる他DBからのデータ移行ツールが充実
まとめ
ベクトルデータベースは、RAGシステムの検索精度と応答速度を左右する重要なコンポーネントです。 本記事で紹介した7つのベクトルデータベースには、それぞれ明確な強みがあります。
まずはChromaやFAISSで小さく試し、要件が固まったらQdrant・Milvus・Pineconeなどの本番向けDBに移行する、というステップを踏むのがおすすめです。