コンテンツにスキップ
LinkedInX

ベクトルDBの選び方

約10分

対象読者: RAGのインフラを設計したい方、ベクトルDBの選定で迷っている方
前提知識: RAGとは埋め込みとベクトル表現 の基本を把握していること

ベクトルデータベース(Vector Database)とは、テキストや画像を数値ベクトルとして保存し、「意味的に近いベクトル」を高速に検索するためのデータベースです。RAGでは、文書を埋め込みモデルでベクトル化した後、それをベクトルDBに保存し、質問時に類似した文書を取得します。

埋め込み で説明したように、文書は数百〜数千次元のベクトルに変換されます。文書が1万件あれば、1万本のベクトルが存在します。質問するたびに、この1万本のベクトル全てとの距離を計算することは現実的ではありません。

ベクトルDBは、ANN(Approximate Nearest Neighbor、近似最近傍探索)という技術を使って、厳密ではないが十分に正確な最近傍ベクトルを高速(ミリ秒単位)で見つけます。数百万件のベクトルに対しても実用的な速度で検索できます。

graph LR
    A["文書(テキスト)"] --> B["埋め込みモデル"]
    B --> C["ベクトル"]
    C --> D["ベクトルDB(ANNインデックス)"]
    E["ユーザーの質問"] --> F["埋め込みモデル"]
    F --> G["クエリベクトル"]
    G --> D
    D --> H["類似度上位K件"]
    H --> I["LLMへ渡す"]

ベクトルDBは、提供形態によって大きく4つに分類できます。

サービス提供者がインフラを管理するため、セットアップが簡単です。スケーリングやバックアップも自動化されています。

代表例: Pinecone

2. オープンソース・スタンドアロン型

Section titled “2. オープンソース・スタンドアロン型”

自前でホスティングできるオープンソースのベクトルDB。クラウド版も提供されています。

代表例: Weaviate、Qdrant

3. 埋め込み型(ローカル・インプロセス)

Section titled “3. 埋め込み型(ローカル・インプロセス)”

追加のサーバーが不要で、アプリケーションプロセス内またはローカルで動きます。プロトタイプや小規模開発に向いています。

代表例: Chroma、Faiss

既存のリレーショナルDBにベクトル検索機能を追加します。

代表例: pgvector(PostgreSQL 拡張)

名前種類ホスティングハイブリッド検索メタデータフィルタスケーリング無料枠
Chroma埋め込み型ローカル / セルフホスト限定的あり小〜中規模完全無料(OSS)
Pineconeマネージドクラウド(AWS/GCP)ありあり大規模対応あり(Starter)
WeaviateOSS / マネージドセルフ / クラウド組み込みあり大規模対応あり(クラウド)
QdrantOSS / マネージドセルフ / クラウドありあり大規模対応あり(クラウド)
pgvectorSQLエクステンションPostgreSQL サーバー手動実装PostgreSQL のSQLで対応中〜大規模PostgreSQL 自体は無料
Faissライブラリプロセス内(ライブラリ)なしなしオフライン・研究向け完全無料(OSS)

Chroma は、ローカル環境でファイルに保存するか、メモリ上で動くシンプルなベクトルDBです。公式ドキュメントでは、埋め込み・メタデータ保存・ベクトル検索・全文検索などを備える AI 向けデータ基盤として説明されています。[1]

# pip install chromadb
import chromadb

# ローカルに永続化する場合
client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_or_create_collection("documents")

# 文書の追加
collection.add(
    documents=["RAGとは検索拡張生成のことです", "埋め込みはテキストをベクトルに変換します"],
    metadatas=[{"source": "intro.md"}, {"source": "embeddings.md"}],
    ids=["doc1", "doc2"]
)

# 検索
results = collection.query(
    query_texts=["RAGの仕組みを教えて"],
    n_results=2
)
print(results["documents"])

向いている場面: プロトタイプ開発、ローカルでの実験、数千〜数万件規模

Pinecone は、マネージド型のベクトルデータベースで、セマンティック検索、全文検索、ハイブリッド検索、メタデータフィルタ、リランキングなどの機能を提供しています。[2]

# pip install pinecone
from pinecone import Pinecone, ServerlessSpec

pc = Pinecone(api_key="YOUR_API_KEY")  # PINECONE_API_KEY 環境変数を使用

# インデックスの作成(初回のみ)
pc.create_index(
    name="rag-documents",
    dimension=1536,  # text-embedding-3-small の次元数
    metric="cosine",
    spec=ServerlessSpec(cloud="aws", region="us-east-1")
)

index = pc.Index("rag-documents")

# ベクトルの追加
index.upsert(vectors=[
    {"id": "doc1", "values": embedding_vector, "metadata": {"source": "intro.md"}},
])

# 検索
results = index.query(vector=query_vector, top_k=5, include_metadata=True)

向いている場面: 本番環境、チームでの開発、インフラ管理コストを下げたい場合

Weaviate — ハイブリッド検索が強い

Section titled “Weaviate — ハイブリッド検索が強い”

Weaviate は、BM25 + ベクトル検索のハイブリッド検索を扱えるオープンソースのベクトルDBです。[3]

# pip install weaviate-client
import weaviate

client = weaviate.connect_to_local()  # ローカルDockerの場合

collection = client.collections.get("Documents")

# ハイブリッド検索(BM25 + ベクトル)
results = collection.query.hybrid(
    query="Pythonでファイルを読み込む方法",
    alpha=0.5,   # 0=BM25のみ, 1=ベクトルのみ
    limit=5
)

for obj in results.objects:
    print(obj.properties["content"][:100])

向いている場面: ハイブリッド検索が必要、セルフホストで大規模運用、Dockerでのセットアップが可能

Qdrant は Rust で実装されたオープンソースのベクトルDBです。フィルタリングとベクトル検索を組み合わせた検索機能を提供しています。[4]

# pip install qdrant-client
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct

client = QdrantClient(":memory:")  # メモリモード(開発用)
# client = QdrantClient(url="http://localhost:6333")  # ローカルサーバー

# コレクション作成
client.create_collection(
    collection_name="documents",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)

# ベクトルの追加
client.upsert(
    collection_name="documents",
    points=[
        PointStruct(
            id=1,
            vector=embedding_vector,
            payload={"source": "intro.md", "content": "RAGとは..."}
        )
    ]
)

# 検索
results = client.search(
    collection_name="documents",
    query_vector=query_vector,
    limit=5
)

向いている場面: 高いスループットが必要、Rustベースの安定性を重視、セルフホスト運用

pgvector — PostgreSQL ユーザーに最適

Section titled “pgvector — PostgreSQL ユーザーに最適”

pgvector は、既存の PostgreSQL データベースにベクトル検索を追加する拡張機能です。L2距離、内積、コサイン距離などの距離関数と、exact / approximate nearest neighbor search をサポートしています。[5]

-- pgvector 拡張を有効化
CREATE EXTENSION IF NOT EXISTS vector;

-- ベクトルカラムを持つテーブルを作成
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    source VARCHAR(255),
    embedding vector(1536)  -- text-embedding-3-small の次元数
);

-- インデックスを作成(HNSW)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops);
# pip install psycopg2-binary pgvector
from pgvector.psycopg2 import register_vector
import psycopg2

conn = psycopg2.connect("postgresql://user:password@localhost/dbname")
register_vector(conn)

cursor = conn.cursor()

# ベクトル検索(上位5件)
cursor.execute(
    "SELECT content, source, 1 - (embedding <=> %s::vector) AS similarity "
    "FROM documents ORDER BY embedding <=> %s::vector LIMIT 5",
    (query_vector, query_vector)
)
results = cursor.fetchall()

向いている場面: 既存の PostgreSQL インフラを活用したい、SQLでの複雑なフィルタリングが必要、データの一元管理を重視

Faiss(Facebook AI Similarity Search)は Meta が開発した、密ベクトルの類似検索・クラスタリング向けライブラリです。[6]

# pip install faiss-cpu
import faiss
import numpy as np

dimension = 1536
index = faiss.IndexFlatIP(dimension)  # 内積ベースの検索

# ベクトルを正規化してから追加(コサイン類似度のため)
vectors = np.array([embedding_vector]).astype("float32")
faiss.normalize_L2(vectors)
index.add(vectors)

# 検索
query = np.array([query_vector]).astype("float32")
faiss.normalize_L2(query)
distances, indices = index.search(query, k=5)

向いている場面: オフライン環境、研究・実験用途、メタデータフィルタリングが不要なケース

プロトタイプを素早く作りたい

Section titled “プロトタイプを素早く作りたい”

Chroma から始めることをお勧めします。追加のサーバーセットアップが不要で、LangChain や LlamaIndex との統合も容易です。

pgvector が最も自然な選択です。新しいデータベースを導入せず、既存のバックアップ・権限管理・SQLクエリの仕組みをそのまま使えます。

本番環境でインフラ管理を避けたい

Section titled “本番環境でインフラ管理を避けたい”

Pinecone のマネージドサービスが選択肢になります。APIキーを設定するだけで動き始め、スケーリングは自動です。

ハイブリッド検索(BM25 + ベクトル)が必要

Section titled “ハイブリッド検索(BM25 + ベクトル)が必要”

Weaviate または Qdrant がハイブリッド検索を組み込みで提供しています。Elasticsearch に pgvector を組み合わせる構成も有力です。

セルフホストで大規模に使いたい

Section titled “セルフホストで大規模に使いたい”

Qdrant(Rust製で高速)または Weaviate(豊富な機能)が有力です。どちらもDocker/Kubernetes での運用が可能です。

文書が更新・削除された場合、対応するベクトルも更新・削除する必要があります。ほとんどのベクトルDBは upsert(更新または追加)と delete をサポートします。

# Chroma での削除例
collection.delete(ids=["doc1"])

# Pinecone での更新例(upsert = update or insert)
index.upsert(vectors=[
    {"id": "doc1", "values": new_embedding_vector, "metadata": {"source": "intro_v2.md"}}
])

バックアップと再インデックス

Section titled “バックアップと再インデックス”

埋め込みモデルを変更した場合や、チャンク戦略を変更した場合は、全ベクトルの再作成(再インデックス)が必要です。本番環境では、元の文書テキストを別途保存しておき、必要に応じて再ベクトル化できるようにしておきます。

後から別のベクトルDBに移行する場合、元の文書テキストとメタデータをエクスポートし、新しいDBで再インデックスします。ベクトルそのものは通常エクスポートする必要はなく、元テキストから再生成します。

  • ベクトルDBはベクトル同士の近さを高速に検索するためのデータベース
  • プロトタイプは Chroma、既存PostgreSQLがあれば pgvector、本番クラウドには Pinecone が実務的な出発点
  • ハイブリッド検索が必要な場合は Weaviate または Qdrant が強い
  • 文書の更新・削除・再インデックスの運用設計を最初から考えておく

Q: 通常のデータベース(MySQL、PostgreSQL)は使えませんか?

A: 通常のデータベースは高次元ベクトルの近傍探索に最適化されていないため、文書数が増えると検索速度が実用範囲を超えて低下します。PostgreSQL を使いたい場合は pgvector 拡張を使うことで、高速なベクトル検索が可能になります。

Q: 後から別のベクトルDBに移行できますか?

A: 可能です。ベクトルDBを変更する際は、元の文書テキストとメタデータを保存しておけば、新しいDBで再ベクトル化・再インデックスできます。LangChain や LlamaIndex などのフレームワークを使っている場合、ベクトルDB部分のみを差し替えることが比較的容易です。

Q: 無料で使えるベクトルDBはありますか?

A: Chroma(OSS)と Faiss(OSS)は完全無料で使えます。Pinecone・Weaviate・Qdrant のクラウド版は無料枠があります。pgvector は PostgreSQL を使えるならば追加コストなしで利用できます。コスト最小化を優先する場合は、Chroma + セルフホストまたは pgvector が選択肢になります。

Q: ベクトルDBに保存するデータは暗号化されますか?

A: マネージドサービス(Pinecone など)は通信の暗号化(TLS)と保存時の暗号化(at-rest encryption)を提供しています。セルフホストの場合は、インフラ側での暗号化設定が必要です。社内の機密情報を含む文書を扱う場合は、セキュリティポリシーに基づいてホスティング場所を選定してください。

  1. Chroma — Official Documentation
  2. Pinecone — Official Documentation
  3. Weaviate — Official Documentation
  4. Qdrant — Official Documentation
  5. pgvector — GitHub
  6. Faiss — GitHub
クイズ