ベクトル検索に ClickHouse を使おう!
はい、ClickHouse はベクトル検索に対応しています。
より特化したベクトルデータベースと比べて、ベクトル検索に ClickHouse を使う主な利点は次のとおりです。
- 検索前に、ClickHouse のフィルタリング機能や全文検索機能でデータセットを絞り込めます。
- データセットに対して分析を実行できます。
- 既存のデータに対して
JOINを実行できます。 - 新たなデータベースを別途管理して、インフラストラクチャを複雑にする必要がありません。
以下では、ベクトル検索に ClickHouse を使う方法を簡単なチュートリアルで紹介します。
埋め込みを作成する
データ (ドキュメント、イメージ、または構造化データ) は、埋め込み に変換する必要があります。埋め込みの作成には、OpenAI Embeddings API またはオープンソースの Python ライブラリ SentenceTransformers を使用することを推奨します。
埋め込みは、データを表す多数の浮動小数点数の配列と考えることができます。詳しくは、埋め込みについて詳しく学べる OpenAI のガイド を参照してください。
埋め込みを保存する
埋め込みを生成したら、それらを ClickHouse に保存する必要があります。各埋め込みは個別の行に保存し、フィルタリング、集計、分析のためのメタデータを含めることができます。以下は、キャプション付きのイメージを保存できるテーブルの例です。
CREATE TABLE images
(
`_file` LowCardinality(String),
`caption` String,
`image_embedding` Array(Float32)
)
ENGINE = MergeTree;関連する埋め込みを検索する
データセット内で犬の写真を検索したいとします。cosineDistance のような距離関数を使えば、犬のイメージの埋め込みを使って、関連するイメージを検索できます。
SELECT
_file,
caption,
cosineDistance(
-- 入力した犬の写真の埋め込み
[0.5736801028251648, 0.2516217529773712, ..., -0.6825592517852783],
image_embedding
) AS score
FROM images
ORDER BY score ASC
LIMIT 10このクエリは、指定した犬のイメージに関連している可能性が最も高い上位 10 件のイメージについて、_file 名と caption を返します。
参考資料
ClickHouse を使用したベクトル検索の詳細なチュートリアルについては、以下を参照してください。