データの準備
download.sh スクリプトを使用できます。
process.py は次のように定義されています。
seq 0 9 | ... のように範囲を調整してください。
(上記の Python スクリプトは非常に遅く (ファイルごとに約 2〜10 分) 、大量のメモリを消費し (ファイルごとに 41 GB) 、生成される CSV ファイルも大きい (各 10 GB) ため、注意してください。十分な RAM がある場合は、-P1 の値を増やして並列度を上げてください。それでも遅すぎる場合は、より良いインジェスト手順を検討してください。たとえば、.npy ファイルを Parquet に変換し、その後のすべての処理を ClickHouse で行う方法があります。)
テーブルを作成する
id カラムはあくまで説明用であり、スクリプトによって重複する値が設定される点に注意してください。
ブルートフォースでベクトル類似度検索を実行する
target は 512 要素の配列で、クライアントパラメータです。
このような配列を簡単に取得する方法は、記事の最後で紹介します。
ここではひとまず、ランダムな LEGO セット画像の埋め込みを target として実行できます。
結果
ベクトル類似度索引を使って近似ベクトル類似度検索を実行する
UDFを使用した埋め込みの作成
target ベクトルを作成するには、UDF を使用できます。データの作成時と検索用の新しい埋め込みの作成時には、同じモデルを使用することが重要です。以下のスクリプトでは、データセットでも使用されている ViT-B/32 モデルを利用します。
テキスト埋め込み
user_scripts/ ディレクトリに保存し、実行可能にします (chmod +x encode_text.py) 。
encode_text.py:
<user_defined_executable_functions_config>/path/to/*_function.xml</user_defined_executable_functions_config> として参照されている場所に、encode_text_function.xml を作成します。
SET param_target=... にコピーすれば、クエリを簡単に記述できます。あるいは、encode_text() 関数を cosineDistance 関数のargumentとして直接使用することもできます:
encode_text() UDF 自体が、埋め込みベクトルを計算して出力するまでに数秒かかる場合があることに注意してください。
画像の埋め込み
encode_image.py
encode_image_function.xml