Vector Database
ベクトルデータベースは、埋め込みベクトルをIDやメタデータとともに保存し、高速な最近傍探索のためにインデックス化します。RAGや画像検索の検索レイヤーです。
ベクトルデータベースは、モデルがテキスト、画像、音声、動画から生成する数値ベクトルである埋め込みを、各アイテムのIDやメタデータとともに保存し、数百万から数十億個のアイテムを対象に「保存済みベクトルのうち、これに最も近いものはどれか」というクエリにミリ秒単位で回答します。ベクトルデータベースは、ベクトル検索インデックスを、挿入、更新、削除、メタデータによるフィルタリング、永続化、アクセス制御、マシン間のレプリケーションといったデータベース機能で拡張します。ベクトルデータベースは、検索拡張生成(RAG)、セマンティック検索、レコメンデーションシステムの検索処理を提供します。
ベクトルデータベースの仕組み#
書き込み処理では、データベースの外部または内部にある埋め込みモデルが各アイテムをベクトルに変換し、データベースはそのベクトルを、ソースファイル、日付、カメラ、顧客などのIDやメタデータペイロードとともに保存します。保存済みのすべてのベクトルとクエリを比較する方法は正確ですが、大規模では低速なため、データベースは近似最近傍(ANN)インデックスを構築します。HNSWは、各ベクトルを階層グラフ内の近傍と結び、検索時に貪欲法でグラフをたどります。転置ファイル(IVF)インデックスは、k-meansクラスタリングでベクトルをグループ化し、クエリに最も近いクラスターだけを検索します。また、プロダクト量子化などのベクトル量子化手法は、各ベクトルを数バイトに圧縮します。読み取り処理では、同じモデルでクエリを埋め込み、コサイン類似度、内積、ユークリッド距離などの指標で比較し、データベースは上位k件のID、スコア、ペイロードを返します。多くのシステムでは、これらをキーワード検索の結果とハイブリッド検索で統合します。
この例では、Pythonプロセス内でメモリ上に動作するオープンソースのベクトルデータベースChromaを使用します。
import chromadb
# メモリ内クライアント。chromadb.PersistentClient(path="db")を使うと、データはディスクに保存されます
client = chromadb.Client()
collection = client.create_collection("inspection_notes")
# Chromaは、デフォルトの埋め込みモデルで各ドキュメントを埋め込み、ベクトルをインデックス化します
collection.add(
ids=["n1", "n2", "n3"],
documents=[
"Hairline crack found near the weld on bracket B7",
"Paint scratch on the left door panel",
"Porosity in the weld seam of the frame rail",
],
metadatas=[{"line": "A"}, {"line": "B"}, {"line": "B"}],
)
# 1つの生産ラインに限定した最近傍検索
results = collection.query(query_texts=["welding defects"], n_results=1, where={"line": "B"})
print(results["ids"][0], results["documents"][0])クエリはメモ n3 を返します。これはラインBの溶接部の気孔です。メタデータフィルターにより、ラインAの亀裂に関するメモは検索対象から除外されますが、そのテキストは「溶接欠陥」に同じくらい近いものです。
ベクトルデータベースと関連システムの比較#
- FAISSなどのベクトル検索ライブラリ:HNSW、IVF、プロダクト量子化を含むプロセス内インデックスを提供しますが、サーバー、メタデータストレージ、レプリケーションはありません。複数のベクトルデータベースがこれらを基盤にしています。
- 専用ベクトルデータベース:マネージドサービスのPineconeや、オープンソースプロジェクトのMilvus、Qdrant、Weaviate、Chromaなどがあり、当初から埋め込みを中心に設計されています。
- pgvectorなどのベクトル拡張機能:HNSWおよびIVFFlatインデックスを備えたベクトル列をPostgreSQLに追加し、埋め込みをリレーショナルデータの隣に保存します。Elasticsearch、OpenSearch、MongoDB Atlas、Redisも、キーワード検索と並ぶ同様のベクトルフィールドを提供します。
- 特徴量ストア:トレーニングと推論のために、エンティティキーを使ってモデル入力特徴量を提供します。類似度ではなく、IDでレコードを検索します。
- データレイク:画像やログなどの生ファイルを保持し、ベクトルデータベースはIDまたはパスでそれらを参照します。
実際のアプリケーション#
- AIエージェントのメモリ:RAGパイプラインとエージェントは、ドキュメントのチャンクや過去の会話を保存し、大規模言語モデルが必要に応じて取得できるようにします。
- 小売のビジュアル検索:「類似商品を探す」機能では、すべての商品写真を埋め込み、閲覧中の商品に最も近いアイテムを返します。
- 異常検知:最近傍の保存済みデータがすべて遠く離れている新しいサンプルを、取引やセンサーの読み取り値などの異常として検出します。
画像コレクションでは、ベクトルを生成するためのビジョンモデルが必要です。Ultralytics YOLO26はmodel.embed()を通じてこの機能を提供します。各画像にモデルを実行し、最後から2番目の層からプーリングした特徴ベクトルを返すため、画像パスや撮影メタデータとともに保存して、近似重複検出や類似画像検索に利用できます。これは、Ultralytics Platformの類似画像を検索のような検索を支える機能です。
サイズ設定とチューニング#
インデックス設定では、再現率と推論レイテンシの間でトレードオフが生じます。HNSWの検索幅(ef_search)とIVFで検索するクラスター数(nprobe)は、どちらもクエリを遅くする代わりに、正しい近傍をより多く見つけます。そのため、チームはサンプルクエリでの厳密検索と比較しながら設定を調整します。メモリ使用量がハードウェアコストを左右します。768次元のfloat32埋め込み100万件には、インデックスのオーバーヘッドを除いて3.07 GB(1,000,000 x 768 x 4 bytes)が必要です。ベクトルをint8スカラー量子化すると768 MBに減り、Matryoshka埋め込みは次元数を切り詰めて、さらに容量を削減できます。










