ベクトルデータベース、本当に必要なのか - AI時代の新しい悩み
ベクトルデータベース、本当に必要なのか
AI時代の新しい課題
MSA設計にChatGPTを活用した話を書いたことがありますが、AIを業務で使えば使うほど、自然とベクトルデータベースへの関心が湧いてきました。
RAG(Retrieval-Augmented Generation)を実装するには、ドキュメントをエンベディングベクトルに変換して保存し、類似ベクトルを検索できる必要があります。そのための専用DBがベクトルデータベースです。
Pinecone、Weaviate、Milvus、Chroma…選択肢はかなりあります。でもこれが本当に必要なのか悩みました。
既存のDBでも対応できるのでは?
実はPostgreSQLにもpgvectorという拡張があります。既存のRDBでベクトル検索ができるのです。
-- pgvector使用例
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536)
);
-- コサイン類似度で類似ドキュメントを検索
SELECT content
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5;
すでにPostgreSQLを使っているなら、別途ベクトルDBを導入するよりpgvectorを追加する方がずっとシンプルです。インフラをもう一つ管理する必要がありませんから。
それでも専用DBが必要なケース
でもデータが数百万、数千万件になると話が変わります。
専用ベクトルDBはANN(Approximate Nearest Neighbor)検索に最適化されています。HNSW、IVFなどのインデックスアルゴリズムが標準搭載されており、大量のベクトルでも高速に類似検索ができます。
pgvectorもインデックスをサポートしていますが、数千万件以上のベクトルでは専用DBとの性能差が大きいとされています。
メタデータフィルタリングとベクトル検索を同時に行うハイブリッド検索も、専用DBの方が有利です。
現実的な判断基準
私が出した結論はこうです。
ベクトルデータが10万件以下 → pgvectorで十分。別途インフラの運用コストの方がもったいない。
10万〜100万件 → pgvectorで始めて、性能が不足してきたら専用DBを検討。
100万件以上 → 専用ベクトルDBを考慮。Pineconeのようなマネージドサービスが楽で、自分で運用するならMilvusやWeaviate。
ほとんどのプロジェクトは実は最初のケースに該当します。AIサービスを作るからといってすぐPineconeに課金する前に、既存のDBで十分かどうかまず確認するのが正しいです。
もう一つの「適正技術」の問題
これは結局、適正技術選択の問題です。
クラウド vs オンプレミスの時もそうでしたし、MySQL UUID活用の時もそうでした。新しい技術が出てくると「これを使うべきか?」という悩みが生まれますが、答えはいつも「状況による」です。
ベクトルDBが流行っているからといって無条件に導入すればオーバーエンジニアリングですし、必要なのに使わなければ非効率です。現在のデータ規模と要件を冷静に見て判断するのが開発者の役割です。
でもこの「冷静な判断」というのは言うのは簡単ですが、新しい技術を見ると使いたくなるのが開発者の本能ですからね…