AI

オープンソースベクターデータベース比較: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"])

機能比較表

比較項目QdrantWeaviateChroma
言語実装RustGoPython
スケーラビリティ★★★★★★★★★☆★★★☆☆
セットアップの容易さ★★★★☆★★★☆☆★★★★★
ハイブリッド検索⚠️
マルチベクター
GraphQL API
ビルトインベクタライザー
量子化(メモリ削減)
分散クラスター
LangChain統合
LlamaIndex統合
ライセンスApache 2.0BSD 3-ClauseApache 2.0
GitHub Stars21k+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(拡張)

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。