0Pricing
AI Engineering Academy · レッスン

Vector Storeの選定とベンチマーク

コスト、レイテンシ、フィルタリング機能、運用の複雑さの観点からPinecone、pgvector、Chroma、Weaviate、Qdrantを比較し、用途に適したツールを選びます。

「Vector Storeの選定とベンチマーク」はCoddyKit上の無料AI Engineering Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Engineering Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Engineering Academyコースには全4レッスンが含まれています。

ベクトルストアの全体像

ベクトルデータベースのエコシステムは、ここ数年で急速に拡大しました。選択肢には、Pineconeのような用途特化型のクラウドサービス、pgvectorのような PostgreSQL 拡張、Chroma、Qdrant、Weaviateのようなオープンソースサーバー、そしてFAISSのようなインメモリライブラリがあります。データをインデックス化した後の移行にはコストがかかるため、適切なツールを選ぶことが重要です。

評価する主な観点

ベクトルストアを比較するときは、5 つの観点を評価します。対象規模でのクエリレイテンシ、バッチ取り込み時のインデックス作成スループット、メタデータによる事前フィルタリングのフィルタリング機能、運用の複雑さ(マネージド型かセルフホスト型か)、そして保存・クエリする100 万ベクトルあたりのコストです。すべての観点で優れた単一のツールはありません。

Pinecone:マネージド運用の手軽さ

Pineconeは、インフラ管理が一切不要な完全マネージド型のクラウドベクトルデータベースです。高同時実行ワークロードに適しており、スパース・デンスのハイブリッド検索をネイティブにサポートし、規模を問わず一貫して 1 桁台のミリ秒でクエリを処理できます。一方で、セルフホスト型の選択肢より高価であり、すべてのデータが Pinecone のクラウドに保存されるため、ベンダーロックインが発生するというコストがあります。

import pinecone

pc = pinecone.Pinecone(api_key='YOUR_API_KEY')
index = pc.Index('my-index')

# Query with metadata filter
results = index.query(
    vector=[0.1, 0.2, 0.3],
    top_k=10,
    filter={'category': {'$eq': 'finance'}},
    include_metadata=True
)

pgvector:PostgreSQL の埋め込み

pgvectorは、vectorデータ型と、HNSW または IVFFlat アルゴリズムを使った近似最近傍(ANN)インデックスによって PostgreSQL を拡張します。埋め込みをリレーショナルデータと同じデータベースに保存できるため、すでに PostgreSQL を運用している場合に適しています。追加のインフラなしで、ベクトル検索と構造化フィルターを SQL で強力に結合できます。

-- Create table with embedding column
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    category TEXT,
    embedding vector(1536)
);

-- Create HNSW index for fast ANN search
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops);

-- Query nearest neighbors with SQL filter
SELECT content, 1 - (embedding <=> '[0.1,0.2,...]')
FROM documents
WHERE category = 'finance'
ORDER BY embedding <=> '[0.1,0.2,...]'
LIMIT 10;

Chroma:開発者に優しいローカルファースト

Chromaは、迅速なプロトタイピング向けに設計されたオープンソースの埋め込みデータベースです。ローカル開発ではプロセス内で実行できるためサーバーが不要で、本番環境向けの永続サーバーモードもサポートしています。非常にシンプルな APIを備えているため LangChain のチュートリアルで広く使われていますが、大規模環境では制限があります。分散モードがなく、フィルタリング機能も Pinecone や Qdrant より弱い点です。

import chromadb

client = chromadb.PersistentClient(path='./chroma_db')
collection = client.get_or_create_collection('my_docs')

# Add documents
collection.add(
    documents=['text one', 'text two'],
    metadatas=[{'source': 'doc1'}, {'source': 'doc2'}],
    ids=['id1', 'id2']
)

# Query
results = collection.query(
    query_texts=['search query'],
    n_results=5
)

Qdrant:フィルタリングとペイロード検索

Qdrantは Rust で記述されたオープンソースのベクトルデータベースで、複雑なメタデータフィルタリングを得意とします。ANN 検索後にフィルターを適用するデータベースとは異なり、Qdrant はスコアリング前にペイロードフィールドで候補ベクトルを事前フィルタリングします。フィルターの選択性が高い場合に、これによって精度が大幅に向上します。ディスク上の HNSW インデックスもサポートしているため、RAM に収まらないデータセットにも適しています。

from qdrant_client import QdrantClient
from qdrant_client.models import Filter, FieldCondition, MatchValue

client = QdrantClient(url='http://localhost:6333')

# Search with payload filter
results = client.search(
    collection_name='documents',
    query_vector=[0.1, 0.2, 0.3],
    query_filter=Filter(
        must=[
            FieldCondition(
                key='category',
                match=MatchValue(value='finance')
            )
        ]
    ),
    limit=10
)

Weaviate:GraphQL とマルチモーダル

Weaviateは、独自のGraphQL APIと、マルチモーダルオブジェクト(テキスト、画像、音声)の組み込みサポートを備えたオープンソースのベクトルデータベースです。モジュールを介して埋め込みモデルのプロバイダーと直接統合できるため、生のテキストを取り込み、Weaviate に埋め込み API を自動で呼び出させることができます。ただし、この利便性の代わりに、Chroma や Qdrant よりセットアップが複雑になります。

import weaviate

client = weaviate.Client('http://localhost:8080')

# Near-text search using built-in vectorizer
result = client.query.get(
    'Document', ['content', 'category']
).with_near_text(
    {'concepts': ['financial analysis']}
).with_where({
    'path': ['category'],
    'operator': 'Equal',
    'valueString': 'finance'
}).with_limit(10).do()

FAISS:大規模インメモリ検索

FAISS(Facebook AI Similarity Search)は、Python バインディングを備えた C++ ライブラリで、非常に高速なインメモリベクトル検索を提供します。データベースではないため永続化機能やサーバーはありませんが、GPU アクセラレーションにより、1 台のマシンで数十億規模の類似度検索を処理できます。スタック全体を管理でき、読み取り中心のオフラインバッチ検索ワークロードには FAISS が適しています。

import faiss
import numpy as np

dimension = 1536
vectors = np.random.random((100000, dimension)).astype('float32')

# Normalize for cosine similarity
faiss.normalize_L2(vectors)

# Build HNSW index
index = faiss.IndexHNSWFlat(dimension, 32)  # M=32 neighbors
index.add(vectors)

# Search
query = np.random.random((1, dimension)).astype('float32')
faiss.normalize_L2(query)
D, I = index.search(query, k=10)  # top-10 results

ベンチマークテストの構築

確信を持って選択する唯一の方法は、自分のデータでベンチマークを実施することです。適切なベンチマークでは、(1) データセット全体のインデックス作成時間、(2) 同時負荷時における p50、p95、p99 パーセンタイルのクエリレイテンシ、(3) ANN の結果と総当たりによる正確な結果を比較した recall@K、(4) 対象規模でのメモリ使用量とコストを測定します。各候補ストアに対して同じクエリを実行してください。

import time
import numpy as np

def benchmark_store(store, queries, k=10):
    latencies = []
    for q in queries:
        start = time.perf_counter()
        store.search(q, k)
        latencies.append(time.perf_counter() - start)
    latencies.sort()
    n = len(latencies)
    print(f'p50: {latencies[n//2]*1000:.1f}ms')
    print(f'p95: {latencies[int(n*0.95)]*1000:.1f}ms')
    print(f'p99: {latencies[int(n*0.99)]*1000:.1f}ms')

再現率とレイテンシのトレードオフの測定

ANN インデックスでは、再現率と速度のバランスを取ります。HNSW のef_searchパラメーターを大きくすると、より正確な近傍を見つけられますが、時間が長くかかります。異なるパラメーター設定でrecall@10(真の上位 10 近傍のうち返された割合)を測定し、再現率とレイテンシの関係をグラフ化します。本番システムの多くは 95~99% の再現率を目標にします。再現率が 90% を下回ると、クエリが高速でもユーザーに無関係なチャンクが返される可能性があります。

def compute_recall(approx_ids, exact_ids):
    '''Compute recall@K for one query'''
    return len(set(approx_ids) & set(exact_ids)) / len(exact_ids)

def benchmark_recall(index, brute_force, queries, k=10):
    recalls = []
    for q in queries:
        approx = index.search(q, k)
        exact = brute_force.search(q, k)
        recalls.append(compute_recall(approx, exact))
    print(f'Mean recall@{k}: {sum(recalls)/len(recalls):.3f}')

選択のための判断フレームワーク

次の判断ツリーを使います。インフラ管理を一切行いたくなく、予算に制約がない場合はPineconeを選びます。すでに PostgreSQL を運用しており、データセットが 1,000 万ベクトル未満ならpgvectorを追加します。複雑なペイロードフィルタリングを伴うオープンソースのセルフホスト環境にはQdrantを選びます。迅速なプロトタイピングとローカル開発にはChromaから始め、後から移行します。数十億規模のオフラインバッチ処理にはFAISSを使用します。

理解度チェック

このレッスンで学んだ AI Engineering の概念について、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、Pinecone、pgvector、Chroma、Qdrant、Weaviate、FAISS を含むベクトルストアの全体像、レイテンシ、スループット、フィルタリング、複雑さ、コストという5 つの評価軸、そしてインフラと規模の要件に基づいて適切なストアを選ぶための実践的な判断フレームワークを学びました。次は、RAG が解決するために生み出された問題について掘り下げます。

よくある質問

「Vector Storeの選定とベンチマーク」レッスンは無料ですか?

はい。「Vector Storeの選定とベンチマーク」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Engineering Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Engineering Academyコースには全4レッスンが含まれています。

「Vector Storeの選定とベンチマーク」で何を学びますか?

コスト、レイテンシ、フィルタリング機能、運用の複雑さの観点からPinecone、pgvector、Chroma、Weaviate、Qdrantを比較し、用途に適したツールを選びます。 ブラウザで直接実行するハンズオンコードでAI Engineering Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Engineering Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Engineering Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Vector Storeの選定とベンチマーク」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Engineering Academyレッスンでコードを書いて実行できますか?

はい。すべてのAI Engineering Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Vector Databaseが必要な理由
  2. Pineconeを始める
  3. pgvector:PostgreSQLでEmbeddingを扱う
  4. Vector Storeの選定とベンチマーク
← AI Engineering Academyに戻る