Подготовка данных
download.sh:
process.py определяется следующим образом:
seq 0 9 | ....
(Приведённый выше скрипт Python очень медленный (~2–10 минут на файл), потребляет много памяти (41 ГБ на файл), а итоговые CSV-файлы получаются большими (по 10 ГБ каждый), поэтому будьте осторожны. Если у вас достаточно оперативной памяти, увеличьте значение -P1, чтобы повысить параллелизм. Если и этого недостаточно, подумайте о более эффективной процедуре ингестии — например, можно преобразовать файлы .npy в Parquet, а затем выполнять всю остальную обработку в ClickHouse.)
Создание таблицы
id приведён здесь лишь для наглядности и заполняется скриптом неуникальными значениями.
Выполните векторный поиск по сходству методом полного перебора
target — это массив из 512 элементов и клиентский параметр.
Удобный способ получения таких массивов будет показан в конце статьи.
Пока же в качестве target можно использовать эмбеддинг случайного изображения набора LEGO.
Результат
Выполните приблизительный поиск по векторному сходству с помощью индекса векторного сходства
Создание эмбеддингов с помощью пользовательских функций (UDF)
target, не выходя из клиента. Важно использовать одну и ту же модель как для создания данных, так и для создания новых эмбеддингов для поиска. В следующих скриптах используется модель ViT-B/32, на которой также основан набор данных.
Текстовые эмбеддинги
user_scripts/ в каталоге с данными ClickHouse и сделайте его исполняемым (chmod +x encode_text.py).
encode_text.py:
encode_text_function.xml по пути, указанному в <user_defined_executable_functions_config>/path/to/*_function.xml</user_defined_executable_functions_config> в файле конфигурации сервера ClickHouse.
SET param_target=... и легко писать запросы. Либо функцию encode_text() можно напрямую использовать в качестве аргумента функции cosineDistance:
encode_text() может потребоваться несколько секунд, чтобы вычислить и вернуть эмбеддинг-вектор.
Эмбеддинги изображений
encode_image.py
encode_image_function.xml