Saltar al contenido principal

Introducción

El conjunto de datos LAION 5b contiene 5,85 mil millones de embeddings de imagen y texto, además de los metadatos de imagen asociados. Los embeddings se generaron con el modelo Open AI CLIP ViT-L/14. La dimensión de cada vector de embedding es 768. Este conjunto de datos puede utilizarse para modelar aspectos de diseño, dimensionamiento y rendimiento de una aplicación real de búsqueda vectorial a gran escala. El conjunto de datos puede utilizarse tanto para la búsqueda de texto a imagen como para la búsqueda de imagen a imagen.

Detalles del conjunto de datos

El conjunto de datos completo está disponible como una combinación de archivos npy y Parquet en the-eye.eu ClickHouse ha puesto a disposición un subconjunto de 100 millones de vectores en un bucket de S3. El bucket de S3 contiene 10 archivos Parquet; cada archivo Parquet contiene 10 millones de filas. Recomendamos a los usuarios que primero realicen un ejercicio de dimensionamiento para estimar los requisitos de almacenamiento y memoria de este conjunto de datos, consultando la documentación.

Pasos

1

Crear tabla

Cree la tabla laion_5b_100m para almacenar los embeddings y sus atributos asociados:
CREATE TABLE laion_5b_100m
(
    id UInt32,
    image_path String,
    caption String,
    NSFW Nullable(String) default 'unknown',
    similarity Float32,
    LICENSE Nullable(String),
    url String,
    key String,
    status LowCardinality(String),
    width Int32,
    height Int32,
    original_width Int32,
    original_height Int32,
    exif Nullable(String),
    md5 String,
    vector Array(Float32) CODEC(NONE)
) ENGINE = MergeTree ORDER BY (id)
El id es simplemente un entero incremental. Los atributos adicionales pueden usarse en predicados para entender la búsqueda por similitud vectorial combinada con el posfiltrado/prefiltrado, como se explica en la documentación
2

Cargar datos

Para cargar el conjunto de datos de todos los archivos Parquet, ejecute la siguiente instrucción SQL:
INSERT INTO laion_5b_100m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_*.parquet');
La carga de 100 millones de filas en la tabla tardará unos minutos.Como alternativa, se pueden ejecutar sentencias SQL individuales para cargar un número determinado de archivos / filas.
INSERT INTO laion_5b_100m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_part_1_of_10.parquet');
INSERT INTO laion_5b_100m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_part_2_of_10.parquet');

3

Realiza una búsqueda de similitud vectorial por fuerza bruta

La búsqueda KNN (k - Nearest Neighbours) o búsqueda por fuerza bruta consiste en calcular la distancia de cada vector del conjunto de datos al vector de embedding de búsqueda y luego ordenar las distancias para obtener los vecinos más cercanos. Podemos utilizar uno de los vectores del propio conjunto de datos como vector de búsqueda. Por ejemplo:
Query
SELECT id, url 
FROM laion_5b_100m
ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_100m WHERE id = 9999) ) ASC
LIMIT 20

The vector in the row with id = 9999 is the embedding for an image of a Deli restaurant.
Response
┌───────id─┬─url───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 1. │     9999 │ https://certapro.com/belleville/wp-content/uploads/sites/1369/2017/01/McAlistersFairviewHgts.jpg                                                                                                                                  │
 2. │ 60180509 │ https://certapro.com/belleville/wp-content/uploads/sites/1369/2017/01/McAlistersFairviewHgts-686x353.jpg                                                                                                                          │
 3. │  1986089 │ https://www.gannett-cdn.com/-mm-/ceefab710d945bb3432c840e61dce6c3712a7c0a/c=30-0-4392-3280/local/-/media/2017/02/14/FortMyers/FortMyers/636226855169587730-McAlister-s-Exterior-Signage.jpg?width=534&height=401&fit=crop │
 4. │ 51559839 │ https://img1.mashed.com/img/gallery/how-rich-is-the-mcalisters-deli-ceo-and-whats-the-average-pay-of-its-employees/intro-1619793841.jpg                                                                                           │
 5. │ 22104014 │ https://www.restaurantmagazine.com/wp-content/uploads/2016/04/Largest-McAlisters-Deli-Franchisee-to-Expand-into-Nebraska.jpg                                                                                                      │
 6. │ 54337236 │ http://www.restaurantnews.com/wp-content/uploads/2015/11/McAlisters-Deli-Giving-Away-Gift-Cards-With-Win-One-Gift-One-Holiday-Promotion.jpg                                                                                       │
 7. │ 20770867 │ http://www.restaurantnews.com/wp-content/uploads/2016/04/McAlisters-Deli-Aims-to-Attract-New-Franchisees-in-Florida-as-Chain-Enters-New-Markets.jpg                                                                               │
 8. │ 22493966 │ https://www.restaurantmagazine.com/wp-content/uploads/2016/06/McAlisters-Deli-Aims-to-Attract-New-Franchisees-in-Columbus-Ohio-as-Chain-Expands-feature.jpg                                                                       │
 9. │  2224351 │ https://holttribe.com/wp-content/uploads/2019/10/60880046-879A-49E4-8E13-1EE75FB24980-900x675.jpeg                                                                                                                                │
10. │ 30779663 │ https://www.gannett-cdn.com/presto/2018/10/29/PMUR/685f3e50-cce5-46fb-9a66-acb93f6ea5e5-IMG_6587.jpg?crop=2166,2166,x663,y0&width=80&height=80&fit=bounds                                                             │
11. │ 54939148 │ https://www.priceedwards.com/sites/default/files/styles/staff_property_listing_block/public/for-lease/images/IMG_9674%20%28Custom%29_1.jpg?itok=sa8hrVBT                                                                          │
12. │ 95371605 │ http://www.restaurantmagazine.com/wp-content/uploads/2015/08/McAlisters-Deli-Signs-Development-Agreement-with-Kingdom-Foods-to-Grow-in-Southern-Mississippi.jpg                                                                   │
13. │ 79564563 │ https://www.restaurantmagazine.com/wp-content/uploads/2016/05/McAlisters-Deli-Aims-to-Attract-New-Franchisees-in-Denver-as-Chain-Expands.jpg                                                                                      │
14. │ 76429939 │ http://www.restaurantnews.com/wp-content/uploads/2016/08/McAlisters-Deli-Aims-to-Attract-New-Franchisees-in-Pennsylvania-as-Chain-Expands.jpg                                                                                     │
15. │ 96680635 │ https://img.claz.org/tc/400x320/9w3hll-UQNHGB9WFlhSGAVCWhheBQkeWh5SBAkUWh9SBgsJFxRcBUMNSR4cAQENXhJARwgNTRYcBAtDWh5WRQEJXR5SR1xcFkYKR1tYFkYGR1pVFiVyP0ImaTA                                                                        │
16. │ 48716846 │ http://tse2.mm.bing.net/th?id=OIP.nN2qJqGUJs_fVNdTiFyGnQHaEc                                                                                                                                                                      │
17. │  4472333 │ https://sgi.offerscdn.net/i/zdcs-merchants/05lG0FpXPIvsfiHnT3N8FQE.h200.w220.flpad.v22.bffffff.png                                                                                                                                │
18. │ 82667887 │ https://irs2.4sqi.net/img/general/200x200/11154479_OEGbrkgWB5fEGrrTkktYvCj1gcdyhZn7TSQSAqN2Yqw.jpg                                                                                                                                │
19. │ 57525607 │ https://knoji.com/images/logo/mcalistersdelicom.jpg                                                                                                                                                                               │
20. │ 15785896 │ https://www.groupnimb.com/mimg/merimg/mcalister-s-deli_1446088739.jpg                                                                                                                                                             │
    └──────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

20 filas en el conjunto. Transcurrido: 3.968 s. Se procesaron 100.38 millones de filas, 320.81 GB (25.30 millones de filas/s, 80.84 GB/s).
Tome nota de la latencia de la consulta para poder compararla con la latencia de la consulta de ANN (usando un índice vectorial). Con 100 millones de filas, la consulta anterior sin un índice vectorial podría tardar varios segundos o minutos en completarse.
4

Crear un índice de similitud vectorial

Ejecute el siguiente SQL para definir y crear un índice de similitud vectorial sobre la columna vector de la tabla laion_5b_100m:
ALTER TABLE laion_5b_100m ADD INDEX vector_index vector TYPE vector_similarity('hnsw', 'cosineDistance', 768, 'bf16', 64, 512);

ALTER TABLE laion_5b_100m MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2;
Los parámetros y las consideraciones de rendimiento para la creación de índices y la búsqueda se describen en la documentación. La sentencia anterior utiliza los valores 64 y 512, respectivamente, para los hiperparámetros HNSW M y ef_construction. Debe seleccionar cuidadosamente los valores óptimos de estos parámetros evaluando el tiempo de construcción del índice y la calidad de los resultados de búsqueda correspondientes a los valores seleccionados.La creación y el guardado del índice podrían tardar incluso varias horas para el conjunto de datos completo de 100 millones, según la cantidad de núcleos de CPU disponibles y el ancho de banda del almacenamiento.
5

Realizar una búsqueda ANN

Una vez creado el índice de similitud vectorial, las consultas de búsqueda vectorial usarán automáticamente el índice:
Query
SELECT id, url 
FROM laion_5b_100m
ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_100m WHERE id = 9999) ) ASC
LIMIT 20

La carga inicial del índice vectorial en memoria podría tardar unos segundos o minutos.
6

Generar embeddings para la consulta de búsqueda

Los vectores de embeddings del conjunto de datos LAION 5b se generaron con el modelo OpenAI CLIP ViT-L/14.A continuación, se proporciona un script de ejemplo en Python para mostrar cómo generar mediante programación vectores de embeddings con las API de CLIP. El vector de embeddings de búsqueda se pasa después como argumento a la función cosineDistance() en la consulta SELECT.Para instalar el paquete clip, consulta el repositorio de GitHub de OpenAI.
import torch
import clip
import numpy as np
import sys
import clickhouse_connect

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-L/14", device=device)

# Buscar imágenes que contengan tanto un perro como un gato
text = clip.tokenize(["a dog and a cat"]).to(device)

with torch.no_grad():
    text_features = model.encode_text(text)
    np_arr = text_features.detach().cpu().numpy()

    # Introduce aquí las credenciales de ClickHouse
    chclient = clickhouse_connect.get_client()

    params = {'v1': list(np_arr[0])}
    result = chclient.query("SELECT id, url FROM laion_5b_100m ORDER BY cosineDistance(vector, %(v1)s) LIMIT 100",
                            parameters=params)

    # Escribir los resultados en una página HTML simple que se pueda abrir en el navegador. Algunas URLs pueden haber quedado obsoletas.
    print("<html>")
    for r in result.result_rows:
        print("<img src = ", r[1], 'width="200" height="200">')
    print("</html>")
El resultado de la búsqueda anterior se muestra a continuación:
Última modificación el 10 de junio de 2026