オープンソースベクターデータベース比較:Qdrant vs Weaviate vs Chroma でRAG・AI検索を構築する
オープンソースラボ編集部 ・ 2026年6月13日
オープンソースベクターデータベース比較:Qdrant vs Weaviate vs Chroma でRAG・AI検索を構築する
LLMアプリケーション・RAG(Retrieval-Augmented Generation)・セマンティック検索に不可欠なベクターデータベースをオープンソースでセルフホストしましょう。Qdrant・Weaviate・Chromaはテキスト・画像の埋め込みベクトルを高速に検索できます。
ベクターデータベースが必要な理由
LLMは文書全体を「コンテキスト」として与えても、文脈の長さに制限があります。RAGは関連性の高い文書片だけを動的に取得してLLMに渡すことで、正確な回答を引き出す手法です。ベクターDBはこの「類似文書の高速検索」を担います。
- 意味的類似検索: 「ノートPC」で「MacBook」「laptop」も検索ヒット
- マルチモーダル: テキスト・画像・音声の埋め込みを混在管理
- 大規模対応: 数百万〜数億件のベクトルを高速インデックス
- フィルタリング: ベクター検索とメタデータフィルターを同時適用
主要ツールの概要
Qdrant
Rustで実装された高性能ベクターデータベースです。HNSW(Hierarchical Navigable Small World)アルゴリズムで近似最近傍検索を提供します。スカラー量子化・プロダクト量子化でメモリ使用量を削減できます。
# Qdrantを起動
docker run -d -p 6333:6333 -p 6334:6334 -v qdrant_storage:/qdrant/storage qdrant/qdrant
# UIは http://localhost:6333/dashboard でアクセス
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
from openai import OpenAI
qdrant = QdrantClient("http://localhost:6333")
openai_client = OpenAI()
# コレクション(インデックス)の作成
qdrant.create_collection(
collection_name="docs",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)
def embed(text: str) -> list[float]:
resp = openai_client.embeddings.create(
input=text,
model="text-embedding-3-small",
)
return resp.data[0].embedding
# ドキュメントを埋め込みベクトルに変換して保存
documents = [
{"id": 1, "text": "Qdrantは高性能なベクターデータベースです", "category": "intro"},
{"id": 2, "text": "RAGはLLMと検索を組み合わせた手法です", "category": "concept"},
{"id": 3, "text": "OpenAIのAPIでテキストを埋め込みベクトルに変換します", "category": "howto"},
]
points = [
PointStruct(
id=doc["id"],
vector=embed(doc["text"]),
payload={"text": doc["text"], "category": doc["category"]},
)
for doc in documents
]
qdrant.upsert(collection_name="docs", points=points)
# セマンティック検索
query = "LLMで文書を検索する方法"
results = qdrant.search(
collection_name="docs",
query_vector=embed(query),
query_filter={"must": [{"key": "category", "match": {"value": "howto"}}]},
limit=3,
)
for r in results:
print(f"score={r.score:.3f} {r.payload['text']}")
# LangChainとQdrantでRAGパイプラインを構築
from langchain_community.vectorstores import Qdrant
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import DirectoryLoader
# ドキュメントの読み込み・分割
loader = DirectoryLoader("./docs", glob="**/*.md")
documents = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)
# QdrantにEmbeddingを保存
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Qdrant.from_documents(
chunks,
embeddings,
url="http://localhost:6333",
collection_name="rag_docs",
)
# RAGチェーンの作成
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
llm = ChatOpenAI(model="claude-sonnet-4-6", temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
answer = qa_chain.run("Qdrantはどんな検索アルゴリズムを使っていますか?")
print(answer)
Weaviate
GraphQL/RESTベースのベクターデータベースです。テキスト・画像のベクタライザーをビルトインで持ち、埋め込みモデルを自動で適用できます。マルチモーダル検索・ハイブリッド検索(BM25+ベクター)が標準です。
import weaviate
import weaviate.classes as wvc
client = weaviate.connect_to_local()
# スキーマ(コレクション)の定義
articles = client.collections.create(
name="Article",
vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
generative_config=wvc.config.Configure.Generative.openai(),
properties=[
wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT),
wvc.config.Property(name="category", data_type=wvc.config.DataType.TEXT),
],
)
# データ挿入(Weaviateが自動でベクタライズ)
with articles.batch.dynamic() as batch:
batch.add_object({
"title": "RAGの仕組み",
"content": "RAGはRetrievalとGenerationを組み合わせた手法です",
"category": "ai",
})
# セマンティック検索
results = articles.query.near_text(
query="LLMで文書を検索する",
limit=5,
filters=wvc.query.Filter.by_property("category").equal("ai"),
)
# ハイブリッド検索(キーワード+ベクター)
hybrid_results = articles.query.hybrid(
query="RAG検索",
alpha=0.75, # 0=BM25のみ, 1=ベクターのみ
limit=5,
)
# Generative Search(RAG-in-DB)
gen_results = articles.generate.near_text(
query="RAGとは?",
limit=3,
grouped_task="この結果を日本語で200字以内にまとめてください",
)
print(gen_results.generated)
Chroma
Python/TypeScriptネイティブの軽量ベクターデータベースです。pip install chromadb一発でインストールでき、ローカル(永続化あり)・クライアントサーバーモード・インメモリの3モードで動作します。LangChain・LlamaIndexとの統合が最も簡単です。
import chromadb
from chromadb.utils import embedding_functions
# ローカル永続化モード
client = chromadb.PersistentClient(path="./chroma_db")
# OpenAI Embeddingを使用
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
api_key="your-api-key",
model_name="text-embedding-3-small",
)
collection = client.get_or_create_collection(
name="my_docs",
embedding_function=openai_ef,
)
# ドキュメントを追加(自動でEmbedding生成)
collection.add(
documents=["RAGはLLMと検索を組み合わせた手法です", "Chromaは軽量なベクターDBです"],
metadatas=[{"source": "article1"}, {"source": "article2"}],
ids=["doc1", "doc2"],
)
# 検索
results = collection.query(
query_texts=["ベクターデータベースとは"],
n_results=3,
where={"source": "article1"}, # メタデータフィルター
)
print(results["documents"])
機能比較表
| 比較項目 | Qdrant | Weaviate | Chroma |
|---|---|---|---|
| 言語実装 | Rust | Go | Python |
| スケーラビリティ | ★★★★★ | ★★★★☆ | ★★★☆☆ |
| セットアップの容易さ | ★★★★☆ | ★★★☆☆ | ★★★★★ |
| ハイブリッド検索 | ✅ | ✅ | ⚠️ |
| マルチベクター | ✅ | ✅ | ❌ |
| GraphQL API | ❌ | ✅ | ❌ |
| ビルトインベクタライザー | ❌ | ✅ | ❌ |
| 量子化(メモリ削減) | ✅ | ✅ | ❌ |
| 分散クラスター | ✅ | ✅ | ❌ |
| LangChain統合 | ✅ | ✅ | ✅ |
| LlamaIndex統合 | ✅ | ✅ | ✅ |
| ライセンス | Apache 2.0 | BSD 3-Clause | Apache 2.0 |
| GitHub Stars | 21k+ | 11k+ | 16k+ |
LLMツール・AI開発環境はLLMツールカテゴリ(/categories/llm-tools)で一覧でき、AI関連のナレッジ管理ツールはknowledgeカテゴリ(/categories/knowledge)でも探せます。
FAQ
Q. ベクターデータベースとPostgresのpgvectorはどう違いますか?
A. pgvectorはPostgreSQLの拡張でベクター検索を追加するものです。既存のPostgresDBにそのまま追加できる点が魅力ですが、専用ベクターDBと比べてスケール・検索性能・インデックスアルゴリズムの選択肢が限られます。数百万件以下・既存PostgreSQLに統合したい場合はpgvector、数千万件以上・ベクター検索が主要機能の場合は専用ベクターDBを選ぶのが一般的です。
Q. Chromaをプロダクションで使っても大丈夫ですか?
A. 小〜中規模(〜100万ベクター)のプロダクション利用は問題ありません。ただし分散クラスターに対応していないため、単一ノード以上にスケールする場合はQdrantかWeaviateへの移行が推奨されます。開発・プロトタイプ・スタートアップの初期段階ではChromaが最もシンプルで素早く始められます。
Q. ハイブリッド検索とはどういう意味ですか?
A. ハイブリッド検索は「キーワード検索(BM25)」と「ベクター検索(意味的類似)」を組み合わせた手法です。例: 「Qdrant HNSW」という検索語では、BM25が「Qdrant」「HNSW」というキーワードを含む文書を、ベクター検索が意味的に類似した文書をそれぞれスコアリングし、加重平均で最終スコアを決定します。キーワードと意味の両方を考慮するため、一般的にどちらか単独よりも高い検索品質が得られます。
Q. 埋め込みモデルはどれを選べばいいですか?
A. 用途と言語によって異なります。日本語対応: OpenAIのtext-embedding-3-small(費用対効果が高い)・text-embedding-3-large(高精度)・multilingual-e5-large(オープンソース)。英語特化ならtext-embedding-ada-002が今でも実績があります。コスト重視でオンプレ/セルフホストならHugging FaceのBGE(BAAI/bge-m3)・E5が選択肢です。ベクターの次元数(1536次元 vs 768次元)と精度・コストのトレードオフも考慮してください。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| RAGプロトタイプ・小規模 | Chroma |
| 大規模・本番ベクター検索 | Qdrant |
| マルチモーダル・ハイブリッド | Weaviate |
| 既存PostgreSQLに統合 | pgvector(拡張) |