メインコンテンツへスキップ
Laion-400M データセットには、英語の画像キャプションが付いた4億枚の画像が含まれています。現在では、Laion はさらに大規模なデータセットも提供していますが、扱い方はほぼ同じです。 このデータセットには、画像の URL、画像と画像キャプションそれぞれの埋め込み、画像と画像キャプションの類似度スコアに加え、メタデータ (画像の幅/高さ、ライセンス、NSFW フラグなど) が含まれています。このデータセットを使って、ClickHouse の近似最近傍探索を実演できます。

データの準備

生データでは、埋め込みとメタデータはそれぞれ別のファイルに保存されています。データ準備の手順では、データをダウンロードし、ファイルを結合して、 CSV に変換し、ClickHouse にインポートします。この処理には、次の download.sh スクリプトを使用できます。
スクリプト process.py は次のように定義されています。
データ準備パイプラインを開始するには、次を実行します。
データセットは 410 個のファイルに分割されており、各ファイルには約 100 万行が含まれています。より小さいデータの一部で作業したい場合は、seq 0 9 | ... のように範囲を調整してください。 (上記の Python スクリプトは非常に遅く (ファイルごとに約 2〜10 分) 、大量のメモリを消費し (ファイルごとに 41 GB) 、生成される CSV ファイルも大きい (各 10 GB) ため、注意してください。十分な RAM がある場合は、-P1 の値を増やして並列度を上げてください。それでも遅すぎる場合は、より良いインジェスト手順を検討してください。たとえば、.npy ファイルを Parquet に変換し、その後のすべての処理を ClickHouse で行う方法があります。)

テーブルを作成する

まずは索引なしでテーブルを作成するには、次を実行します。
CSVファイルをClickHouseにインポートするには、次の手順に従います。
id カラムはあくまで説明用であり、スクリプトによって重複する値が設定される点に注意してください。 ブルートフォースで近似ベクトル検索を実行するには、次を実行します。
target は 512 要素の配列で、クライアントパラメータです。 このような配列を簡単に取得する方法は、記事の最後で紹介します。 ここではひとまず、ランダムな LEGO セット画像の埋め込みを target として実行できます。 結果

ベクトル類似度索引を使って近似ベクトル類似度検索を実行する

それでは、テーブルに 2 つのベクトル類似度索引を定義します。
索引の作成と検索に関するパラメータおよびパフォーマンス上の考慮事項は、ドキュメントで説明されています。 上記の索引定義では、距離指標として”コサイン距離”を使用する HNSW 索引を指定しており、パラメータ “hnsw_max_connections_per_layer” は 64、パラメータ “hnsw_candidate_list_size_for_construction” は 256 に設定されています。 この索引では、メモリ使用量を最適化するため、量子化に半精度の brain float (bfloat16) を使用します。 索引を構築して実体化するには、次のステートメントを実行します:
索引の構築と保存には、行数や HNSW 索引のパラメータによって、数分から数時間かかることがあります。 ベクトル検索を実行するには、同じクエリをもう一度実行するだけです。
結果
ベクトル索引を使って最近傍を取得したことで、クエリのレイテンシは大幅に低下しました。 ベクトル類似度索引を使用するベクトル類似度検索では、総当たり検索の結果とわずかに異なる結果が返される場合があります。 HNSW パラメータを慎重に選定し、索引の品質を評価することで、HNSW 索引はリコールを 1 に近い値 (総当たり検索と同等の精度) まで高められる可能性があります。

UDFを使用した埋め込みの作成

通常は、新しい画像や新しい画像キャプションの埋め込みを作成し、データ内で類似する画像/画像キャプションのペアを検索したいものです。クライアントを離れることなく target ベクトルを作成するには、UDF を使用できます。データの作成時と検索用の新しい埋め込みの作成時には、同じモデルを使用することが重要です。以下のスクリプトでは、データセットでも使用されている ViT-B/32 モデルを利用します。

テキスト埋め込み

まず、次の Python スクリプトを ClickHouse のデータパス内の user_scripts/ ディレクトリに保存し、実行可能にします (chmod +x encode_text.py) 。 encode_text.py:
次に、ClickHouseのサーバー設定ファイルで <user_defined_executable_functions_config>/path/to/*_function.xml</user_defined_executable_functions_config> として参照されている場所に、encode_text_function.xml を作成します。
これで、次のように簡単に使えます。
初回の実行はmodelの読み込みがあるため遅くなりますが、2回目以降は高速に実行されます。その後、出力を SET param_target=... にコピーすれば、クエリを簡単に記述できます。あるいは、encode_text() 関数を cosineDistance 関数のargumentとして直接使用することもできます:
encode_text() UDF 自体が、埋め込みベクトルを計算して出力するまでに数秒かかる場合があることに注意してください。

画像の埋め込み

画像の埋め込みも同様に作成できます。ローカルのファイルとして保存された画像の埋め込みを生成できる Python スクリプトも用意しています。 encode_image.py
encode_image_function.xml
検索に使用するサンプル画像を取得します:
次に、次のクエリを実行して上の画像の埋め込みを生成します:
検索クエリ全体は次のとおりです:
最終更新日 2026年7月2日