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 |