地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【LLM】ベクトルデータベースとは

ベクトルデータベースとは

ベクトルデータベースは、データをベクトル(多次元の数値データ)として保存・検索・処理するためのデータベースです。特に、近似最近傍探索(Approximate Nearest Neighbor, ANN)に特化しており、高次元空間におけるデータの類似性検索を効率的に行うのが特徴。

www.elastic.co

近似最近傍探索(Approximate Nearest Neighbor Search, ANN)は、データ空間の中で、与えられたクエリに最も近いデータポイントを厳密にではなく、近似的に素早く探すための技術。特に、高次元データ(次元が非常に多いデータ)に対して効率的に動作するように設計されているらしい。

ja.wikipedia.org

代表的な利用ケース

  • 画像検索: 類似画像検索システムでは、画像をベクトル表現し、そのベクトル間の距離を計算して類似画像を見つけます
  • 音楽検索: 楽曲をベクトル化し、似た楽曲を素早く見つけるためにANNを使用します
  • 自然言語処理 (NLP): 単語や文をベクトル化して、意味的に似たテキストを高速に検索します(例: Word2VecやBERTの類似検索)
  • 推薦システム: ユーザーの嗜好や行動データをもとに、類似のアイテムやユーザーを見つけ、レコメンデーションを行います

ベクトルデータベースが必要な理由

ベクトルデータベースが必要とされる主な理由は、高次元データの類似性検索を効率的に行うためです。従来のリレーショナルデータベースでは、単純な数値や文字列の比較は得意ですが、ベクトルのような多次元データに対して効果的な類似性検索は難しいです。ここでベクトルデータベースの役割が重要になる。

MySQLでもベクトルデータを扱うことはできますが、効率やスケーラビリティの面でベクトルデータベースの方が大きな利点を持っていり。特に、大規模なベクトルデータセットの類似性検索やリアルタイム検索が必要な場合、専用のベクトルデータベースを使う方が有利となるらしい。とはいえMySQL 9.0からはベクトルデータ型をサポートするらしくこの辺もMySQLで完結する世界がくるかもしれない。(高次元になればなるほどデータサイズは大きくなるだろうしbuffer poolとかにどう使われるかは気になるところではある)

forest.watch.impress.co.jp

ソリューション例

sqlite-vss

github.com

sqlite-vss は、SQLite 向けの拡張機能で、ベクトル検索を効率的に行うための機能を提供している。具体的には、Facebook が開発した高速ベクトル検索ライブラリの Faiss に基づいて構築されており、高次元ベクトルデータを保存する。

pgvector

github.com

pgvector は、PostgreSQLにベクトル類似検索の機能を追加するためのオープンソース拡張機能。ベクトルデータをPostgreSQL内に保存し、他のデータと一緒に効率的に管理・検索できるように設計されている。

faiss

github.com

高次元ベクトルの類似検索やクラスタリングを効率的に行うためのライブラリです。主にC++で実装されており、Pythonのラッパーも提供されている。Faissは、数百万から数十億に及ぶベクトルのセットで検索を実行でき、特に大規模データに適した検索アルゴリズムを備えている。

chroma

github.com

オープンソースのベクトルデータベースで、特にAIアプリケーション向けに設計されています。特に、埋め込み(embedding)データの管理やクエリを行うために最適化されています。Chromaは、大規模言語モデル(LLM)やその他の機械学習モデルで生成されたベクトルデータを効率的に保存し、類似検索を行うことが可能となっている。

milvus

milvus.io

兆ものベクトルデータセットを管理でき、複数のベクトル検索インデックスと組み込みフィルタリングをサポートするオープンソースのベクトルデータベース。

Pinecone

www.pinecone.io

機械学習アプリケーション用に設計されたベクトルデータベース。 高速でスケーラブルであり、様々な機械学習アルゴリズムをサポートしている。 Pineconeは、密なベクトルの効率的な類似性検索のためのライブラリであるFaissの上に構築されている。