本文へスキップ
BecomeCoder

RAGコース · 第3章 ベクトルと検索 · レッスン13

ベクトルDBの位置づけ ― FAISS / Chroma / pgvector

ローカル実施

導入

文書が数百件程度なら、レッスン11のように「毎回すべての文書とコサイン類似度を計算する」全件検索でも十分速く動きます。しかし文書が数万〜数百万件になると、この方式は遅くなりすぎます。そこで登場するのが、専用の**ベクトルDB(ベクトルデータベース)**です。

説明

ベクトルDBは、**近似最近傍探索(ANN: Approximate Nearest Neighbor)**というアルゴリズムを使って、全件を厳密に比較しなくても「だいたい上位に近い」結果を高速に返します。厳密な最良解ではなく近似解を返す代わりに、圧倒的な速さを手に入れる、というトレードオフです。

代表的な選択肢を役割で整理すると、次のようになります。

種類代表例特徴
ライブラリ(組み込み)FAISSMeta製。ライブラリとして自分のアプリに組み込む。高速で、ローカル環境でも動く。
手軽な組み込み型DBChromaセットアップが簡単で、小〜中規模のRAGプロトタイプによく使われる。
既存DBの拡張機能pgvectorPostgreSQLの拡張機能。すでに使っている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がサポートしている。