← PC・IT用語集へ戻る

ベクトルデータベース

Vector Database
ai data beginner
意味を数値化したベクトルを保存し、意味の近いものを高速に探せるようにしたデータベースのこと。
ベクトルデータベース (Vector Database)

概要(サマリー)

ベクトルデータベースとは、意味を数値化したベクトルを保存し、意味の近いものを高速に探せるようにしたデータベースのことである。

普通のデータベースが「IDが100番の行を出して」「名前が田中の人を探して」という一致を得意とするのに対し、ベクトルデータベースは「この文章に一番意味が近いものを5件出して」という近さを得意とする。図書館にたとえるなら、前者が請求番号で1冊を取り出す仕組み、後者が「この本と似た本」を棚全体から探す仕組みにあたる。

エンベディングで作った座標を保存する置き場であり、RAGを作るときの部品として登場することが多い。

詳細解説

なぜ専用のデータベースが要るのか

「近いものを探すだけなら、全部と比較すればいい」と思うかもしれない。実際、件数が少なければそれで足りる。

問題は件数が増えたときだ。1536次元のベクトルが10万件あると、1回の検索で10万回の距離計算が必要になる。100万件なら100万回である。これを検索のたびに行うと、応答が数秒〜数十秒かかってしまう。

ベクトルデータベースは、この総当たりを避けるための工夫を持っている。近そうな候補だけを絞り込んでから比較することで、件数が増えても現実的な速さを保つ。この絞り込みの仕組みが、通常のデータベースのインデックスにあたる役割を果たしている。

近似最近傍探索という考え方

その工夫の中心にあるのが「近似最近傍探索」と呼ばれる方法である。名前のとおり、厳密に一番近いものを探すのをあきらめる代わりに、圧倒的な速さを得る。

  • 厳密に探す: 100万件と全部比較する。正確だが遅い
  • 近似で探す: 「たぶんこのあたり」と当たりを付けて数千件だけ比較する。ごくまれに取りこぼすが、非常に速い

検索結果として「99%の確率で正しい上位5件」が一瞬で返るなら、実用上はそれで十分というわけである。多くのベクトルデータベースは、この精度と速度のバランスを設定で調整できるようになっている。

保存されるもの

ベクトルだけを保存しても使い物にならない。実際には3点をセットで保存する。

  • ベクトル: 意味の座標。検索に使う
  • 元のテキスト: 検索でヒットしたときに、実際に表示・利用する中身
  • メタデータ: ファイル名・URL・作成日・カテゴリなど、絞り込みや出典表示に使う情報

メタデータは軽視されがちだが重要である。「2025年以降の文書に限定して意味検索する」「特定のカテゴリだけから探す」といった絞り込みは、メタデータがあって初めてできる。RAGで出典を表示するときにも使う。

代表的なサービス・製品

用途と規模によって選択肢がある。

  • Pinecone: 運用不要のクラウドサービス。手軽に始められる
  • Qdrant / Weaviate / Milvus: オープンソース。自前で動かせる
  • Chroma: 軽量で、手元の開発や小規模用途に向く
  • pgvector: PostgreSQL拡張機能。既存のデータベースにベクトル検索を足せる
  • Supabase: pgvector を組み込んだ形で提供している

規模が小さいうちは、専用サービスを導入せず pgvector のように既存のデータベースへ機能を足す形で足りることも多い。数千件程度なら、ファイルに保存して全件比較するだけでも実用になる。「まずベクトルデータベースを選ぶ」のではなく、必要になってから選ぶほうが無駄がない。

基本的な使い方

操作は「入れる」と「近いものを探す」の2つが中心である。

# 1. 保存する(ベクトル・元テキスト・メタデータをセットで)
collection.add(
    ids=["doc-001"],
    embeddings=<a class="internal-link" href="https://noveblo.com/glossary/0.013, -0.027, 0.44, ....html" target="_blank" rel="noopener noreferrer">0.013, -0.027, 0.44, ...</a>,
    documents=["有給休暇は入社6か月後から10日付与される。"],
    metadatas=[{"source": "就業規則", "section": "第32条"}]
)

# 2. 意味が近いものを探す(質問文もベクトル化してから渡す)
hits = collection.query(
    query_embeddings=[question_vec],
    n_results=3,
    where={"source": "就業規則"}   # メタデータで絞り込める
)

n_results が取り出す件数、where がメタデータによる絞り込みである。この2つを調整するのが実務上のチューニングの中心になる。

通常のデータベースとの使い分け

置き換えるものではなく、役割が違う。

通常のデータベース ベクトルデータベース
得意な問い 条件に一致するものを出す 意味が近いものを出す
探し方 完全一致・範囲・部分一致 距離の計算
結果 条件に合う全件 近い順に上位N件
苦手なこと 表現の揺れ 型番や名前の完全一致

実務では併用する。ユーザー情報や注文履歴は通常のデータベース、文書の意味検索はベクトルデータベース、という分担になる。NoSQLと同じく、「万能の置き換え」ではなく用途特化の道具だと考えるのが正しい。

運用で気をつけること

  • モデルを変えたら作り直し: エンベディングのモデルを変更すると座標系が変わるため、保存済みの全ベクトルを再計算する必要がある
  • 元データの更新に追随する: 文書を書き換えたら、対応するベクトルも更新しないと古い内容がヒットし続ける
  • 費用: ベクトルは1件あたりのデータ量が大きい。100万件規模になると保存費用が無視できなくなる
  • 削除の反映: 元の文書を消したのにベクトルが残っていると、存在しない資料を根拠に回答してしまう

とくに2つ目と4つ目は、RAGの回答が「なぜか古い」「消したはずの情報を答える」という不具合の原因になりやすい。

AIコーディングとの関係

AIに「ベクトルデータベースを使った検索を作って」と頼むと、たいてい何らかの製品を勝手に選んでコードを書き始める。あとから移行するのは手間なので、先に指定したい。

  • 使う製品(あるいは「まずは外部サービスを使わない形で」と伝える)
  • 保存する件数の見込み(数千件なのか、100万件なのか)
  • 一緒に保存したいメタデータ
  • 絞り込み条件が必要かどうか

たとえば「記事500本ぶんの検索を作りたい。まずは外部サービスを使わず、SQLiteとファイルで完結する構成にして。元テキストとファイル名・更新日も一緒に保存し、日付で絞り込めるようにして」と伝えれば、規模に見合ったものが出てくる。

生成後に確認したいのは、削除と更新の処理があるかである。AIは「保存する」「検索する」のコードは書いてくれるが、更新と削除を書き忘れることが多い。これがないと、運用を始めた途端に古いデータが残り続ける。

よくある勘違い

ベクトルデータベースがないとRAGは作れない?

作れる。文書が数百件程度なら、ベクトルをファイルに保存して全件比較するだけで十分に速い。ベクトルデータベースが必要になるのは、総当たりでは間に合わない規模になってからである。最初から導入すると、運用の手間だけが増えることもある。

通常のデータベースの置き換え?

役割が違う。ユーザー管理や在庫管理のような、条件に一致するデータを正確に取り出す用途には向かない。既存のデータベースを置き換えるのではなく、意味検索という機能を足すために併用するものである。

ベクトルを入れれば意味検索の精度が出る?

精度を決めるのは、どのエンベディングモデルを使うか、文書をどう分割するか、という前段の設計である。ベクトルデータベースは保存と検索を速くする道具であって、意味の理解そのものはしていない。

検索結果は必ず一番近いものが返る?

多くの製品は近似最近傍探索を使うため、厳密な最上位が返る保証はない。実用上はほぼ問題にならないが、「必ず正確な順位が必要」な用途では設定を厳密側に寄せるか、件数を多めに取り出してから絞る必要がある。

まとめ

  • ベクトルデータベースは、意味を数値化したベクトルを保存し、近いものを高速に探すためのデータベースである
  • 全件比較を避ける近似最近傍探索により、件数が増えても現実的な速さを保つ
  • ベクトル・元テキスト・メタデータの3点をセットで保存する
  • 通常のデータベースの置き換えではなく、用途を分けて併用する
  • 数百件規模なら不要なこともある。必要になってから選べばよい

情報ソース

より詳しくAIに聞いてみよう

  • ベクトルデータベースが必要になるのはどれくらいの規模からか、判断の目安を教えてください。
  • 近似最近傍探索がなぜ速いのかを、初心者向けに仕組みから説明してください。
  • pgvector と専用のベクトルデータベースを比べたとき、それぞれどんな場合に向いていますか。
  • ベクトルデータベースで元データの更新・削除を反映し忘れると、どんな問題が起きますか。
  • AIに意味検索の実装を頼むとき、更新・削除処理まで含めてもらうにはどう指示すればよいですか。