VectorDB(ベクトルデータベース)

数値ベクトル形式のデータ、つまり埋め込みを効率的に保存し、類似データを素早く見つけることに特化したデータベース

VectorDB(ベクトルデータベース) は、近年 AI、機械学習、LLM(大規模言語モデル) の分野で非常に重要な役割を担うデータベースである。
簡単に言えば、数値ベクトル形式のデータ(=埋め込み)を効率的に保存し、類似データを素早く見つけることに特化したデータベースである。


VectorDBとは

VectorDBは、ベクトル(Vector)データの保存、検索、比較に最適化されたDBである。
通常、テキスト、画像、音声、コードなどの非構造化データを**埋め込み(embedding)**モデルによって固定長のベクトル(数値配列)に変換し、 それらのベクトルをVectorDBに保存する。

例えば:

"今日の天気はどう?"  ->  [0.12, -0.08, 0.56, ... , 0.33]
"今、雨が降っている?" ->  [0.11, -0.07, 0.57, ... , 0.31]

この2つのベクトルは意味的に似ているため、ベクトル間の距離(distance) が非常に近い。
VectorDBは、このような「類似度ベース検索」を高速に実行できるように作られたシステムである。


VectorDBの主な機能

機能 説明
埋め込み保存 テキストや画像などから生成したベクトルを保存
類似度検索(Similarity Search) クエリベクトルと最も似ているベクトル(=データ)を素早く見つける
メタデータフィルタリング ベクトルとともにタグ、カテゴリーなどの付加情報を保存し、検索時にフィルタリング可能
クラスタリング/分類 意味的に似ているベクトルをグループ化したり、カテゴリー別に分類したりする
LLM連携 LLMの「context」や「memory」機能の実装によく使われる(例: RAG構造)

VectorDBが重要な理由

大規模言語モデル(例: GPT、Claude、Geminiなど)は、**一度に処理できる入力量(Context length)**に制限がある。
そのため、すべての情報をLLMに入れることはできない。

このときVectorDBは次のように使われる。

ユーザーの質問 -> 埋め込みに変換 -> VectorDBで関連文書を検索 ->
結果をLLMに質問とともに渡して回答を生成(この構造をRAG、Retrieval-Augmented Generationという)

つまり、VectorDBはLLMの外部記憶装置のように動作する。


代表的なVectorDB製品

製品名 特徴
Pinecone 完全マネージド型、API中心、RAGに特化
Weaviate オープンソース + GraphQL API対応、Hybrid Search可能
Milvus 大規模データ処理に強い、オープンソース
Qdrant Rustベース、高性能 + 使いやすいREST/gRPC API
FAISS Metaが作ったライブラリ(DBというより検索エンジンに近い)
Chroma Pythonと相性がよく、LangChainなどと連携しやすい
Redis Vector Search (Redis 7.2+) Redis内でベクトルインデックス機能を提供

VectorDB検索の核心概念

ベクトル類似度の計算方法

  • Cosine similarity(コサイン類似度): 各ベクトルの方向がどれほど似ているか
  • Euclidean distance(ユークリッド距離): 2つのベクトル間の直線距離
  • Dot product(内積): 主に学習済み埋め込みで使用

インデックス(Indexing)

ベクトルは通常、数千から数百万個保存されるため、 検索を高速化するために**近似最近傍探索(ANN, Approximate Nearest Neighbor)**アルゴリズムを使用する。

代表的なインデックスアルゴリズム:

  • HNSW (Hierarchical Navigable Small World)
  • IVF (Inverted File Index)
  • PQ (Product Quantization)

VectorDB + LLMの例(RAG構造)

flowchart LR
A[ユーザーの質問] --> B[埋め込み生成器]
B --> C[VectorDBで類似文書を検索]
C --> D[関連文書を返す]
D --> E[文書とともに質問をLLMへ渡す]
E --> F[正確で文脈のある回答を生成]

この構造により、ChatGPTに似た「知識ベースチャットボット」を自分で作ることができる。


実際の使用例(Python + Qdrant)

from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct

client = QdrantClient(":memory:")

# サンプルベクトルを保存
client.upsert(
    collection_name="docs",
    points=[
        PointStruct(id=1, vector=[0.1, 0.3, 0.5], payload={"text": "こんにちは"}),
        PointStruct(id=2, vector=[0.11, 0.29, 0.51], payload={"text": "はじめまして"})
    ]
)

# クエリベクトルと類似するデータを検索
hits = client.search(collection_name="docs", query_vector=[0.12, 0.28, 0.49], limit=2)
print(hits)

まとめ

項目 内容
目的 ベクトルベースの類似度検索およびAI応用
データ形式 高次元ベクトル(embedding)
主な活用先 RAG、推薦システム、画像検索、音声検索
核心技術 ANNインデックス、コサイン類似度、メタデータフィルター
代表製品 Pinecone, Qdrant, Milvus, Weaviate, Chroma