導入
文書が数百件程度なら、レッスン11のように「毎回すべての文書とコサイン類似度を計算する」全件検索でも十分速く動きます。しかし文書が数万〜数百万件になると、この方式は遅くなりすぎます。そこで登場するのが、専用の**ベクトルDB(ベクトルデータベース)**です。
説明
ベクトルDBは、**近似最近傍探索(ANN: Approximate Nearest Neighbor)**というアルゴリズムを使って、全件を厳密に比較しなくても「だいたい上位に近い」結果を高速に返します。厳密な最良解ではなく近似解を返す代わりに、圧倒的な速さを手に入れる、というトレードオフです。
代表的な選択肢を役割で整理すると、次のようになります。
| 種類 | 代表例 | 特徴 |
|---|---|---|
| ライブラリ(組み込み) | FAISS | Meta製。ライブラリとして自分のアプリに組み込む。高速で、ローカル環境でも動く。 |
| 手軽な組み込み型DB | Chroma | セットアップが簡単で、小〜中規模のRAGプロトタイプによく使われる。 |
| 既存DBの拡張機能 | pgvector | PostgreSQLの拡張機能。すでに使っているRDBにベクトル検索を同居させられる。 |
| マネージドサービス | Pinecone、Weaviate など | インフラの管理をサービス側に任せられる。大規模・本番運用向け。 |
どれを選んでも、やることの骨格は同じです。文書を埋め込みモデルでベクトルに変換し、ベクトルDBに保存しておき、質問が来たら質問もベクトルに変換して、近いものを上位k件取り出す。レッスン11で作った MiniVectorStore の考え方を、大規模・高速に実現したものがベクトルDBだと考えてください。
flowchart LR doc["文書<br/>(チャンク)"] --> embed["埋め込みモデル<br/>(Voyage AI など)"] embed --> vec["ベクトル"] vec --> db["ベクトルDB<br/>(FAISS / Chroma / pgvector)"] query["質問文"] --> embed2["埋め込みモデル"] embed2 --> qvec["質問のベクトル"] qvec --> db db --> topk["近い順にtop-k件"]
もう1つ知っておきたいのが、多くのベクトルDBには「メタデータでの絞り込み(フィルタ)」機能があることです。たとえば「2024年以降の文書だけ」「カテゴリが”料金”のチャンクだけ」のように、ベクトルの近さに加えて条件を指定して検索を絞り込めます。これは複数の利用者やドキュメント種別を扱う本格的なRAGシステムで重要な機能で、後の章で詳しく扱います。
まとめ
- 文書量が増えると全件比較は遅くなるため、近似最近傍探索(ANN)で高速に上位を返すベクトルDBを使う。
- FAISS(ライブラリ)・Chroma(手軽な組み込み型)・pgvector(既存DBの拡張)・Pinecone/Weaviateなど(マネージド)が代表的な選択肢。
- どれも「埋め込み → ベクトルDBに保存 → 質問も埋め込み → 近い順にtop-k」という流れは共通。
- メタデータによる絞り込み(フィルタ)も多くのベクトルDBがサポートしている。