> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Conjunto de dados com 10 milhões de vetores do LAION 5B

# conjunto de dados LAION 5B

export const Image = ({img, alt, size = "lg", background}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  const backgroundColor = background === "white" ? "white" : background === "black" ? "rgb(31 31 28)" : undefined;
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} style={{
    backgroundColor
  }} />
      </Frame>
    </div>;
};

<div id="introduction">
  ## Introdução
</div>

O [conjunto de dados LAION 5b](https://laion.ai/blog/laion-5b/) contém 5,85 bilhões de embeddings de imagem-texto e
metadados de imagem associados. Os embeddings foram gerados usando o modelo `Open AI CLIP` [ViT-L/14](https://huggingface.co/sentence-transformers/clip-ViT-L-14). A
dimensão de cada vetor de embedding é `768`.

Esse conjunto de dados pode ser usado para modelar aspectos de projeto, dimensionamento e desempenho de uma aplicação real de
busca vetorial em grande escala. Ele pode ser usado tanto para buscas de texto para imagem quanto de imagem para imagem.

<div id="dataset-details">
  ## Detalhes do conjunto de dados
</div>

O conjunto de dados completo pode ser baixado usando [opendatalab/laion5b-downloader](https://github.com/opendatalab/laion5b-downloader).

O ClickHouse disponibilizou um subconjunto de 10 milhões de vetores em um bucket `S3` público.
O subconjunto é armazenado em um arquivo `Parquet`.

Recomendamos que os usuários façam primeiro uma análise de dimensionamento para estimar os requisitos de armazenamento e memória desse conjunto de dados consultando a [documentação](/pt-BR/reference/engines/table-engines/mergetree-family/annindexes).

<div id="steps">
  ## Etapas
</div>

<Steps>
  <Step title="Criar tabela" id="create-table">
    Crie a tabela `laion_5b_10m` para armazenar os embeddings e os atributos associados:

    ```sql theme={null}
    CREATE TABLE laion_5b_10m
    (
        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)
    ```

    O `id` é apenas um número inteiro sequencial. Os atributos adicionais podem ser usados em predicados para compreender
    a busca por similaridade vetorial combinada com pós-filtragem/pré-filtragem, conforme explicado na [documentação](/pt-BR/reference/engines/table-engines/mergetree-family/annindexes)
  </Step>

  <Step title="Carregar dados" id="load-table">
    Para carregar o conjunto de dados, execute a seguinte instrução SQL:

    ```sql theme={null}
    INSERT INTO laion_5b_10m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_part_1_of_10.parquet', NOSIGN);
    ```

    O carregamento de 10 milhões de linhas na tabela levará alguns minutos.
  </Step>

  <Step title="Execute uma busca de similaridade de vetores por força bruta" id="run-a-brute-force-vector-similarity-search">
    A busca KNN (k - vizinhos mais próximos) ou por força bruta consiste em calcular a distância entre cada vetor do conjunto de dados
    e o vetor de embedding da busca e, em seguida, ordenar as distâncias para obter os vizinhos mais próximos. Podemos usar um dos vetores
    do próprio conjunto de dados como vetor de busca. Por exemplo:

    ```sql title="Query" theme={null}
    SELECT id, url 
    FROM laion_5b_10m
    ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_10m WHERE id = 9999) ) ASC
    LIMIT 20

    The vector in the row with id = 9999 is the embedding for an image of a Deli restaurant.
    ```

    Anote a latência da consulta para podermos compará-la com a latência da consulta com ANN (usando índice vetorial).
    Com 10 milhões de linhas, a consulta acima, sem um índice vetorial, pode levar alguns segundos ou minutos para ser concluída.
  </Step>

  <Step title="Crie um índice de similaridade vetorial" id="build-vector-similarity-index">
    Execute o SQL a seguir para definir e criar um índice de similaridade de vetores na coluna `vector` da tabela `laion_5b_10m`:

    ```sql theme={null}
    ALTER TABLE laion_5b_10m ADD INDEX vector_index vector TYPE vector_similarity('hnsw', 'cosineDistance', 768, 'bf16', 64, 512);

    ALTER TABLE laion_5b_10m MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2;
    ```

    Os parâmetros e as considerações de desempenho para a criação e a busca de índices são descritos na [documentação](/pt-BR/reference/engines/table-engines/mergetree-family/annindexes).
    A instrução acima usa os valores 64 e 512, respectivamente, para os hiperparâmetros HNSW `M` e `ef_construction`.
    Você precisa selecionar cuidadosamente os valores ideais desses parâmetros, avaliando o tempo de criação do índice e a qualidade dos resultados de busca
    correspondentes aos valores selecionados.

    A criação e o salvamento do índice podem levar bastante tempo para o subconjunto de 10 milhões de linhas, dependendo do número de núcleos de CPU disponíveis e da largura de banda de armazenamento.
  </Step>

  <Step title="Realizar pesquisa ANN" id="perform-ann-search">
    Depois que o índice de similaridade vetorial for criado, as consultas de busca vetorial usarão o índice automaticamente:

    ```sql title="Query" theme={null}
    SELECT id, url 
    FROM laion_5b_10m
    ORDER BY cosineDistance( vector, (SELECT vector FROM laion_5b_10m WHERE id = 9999) ) ASC
    LIMIT 20

    ```

    O carregamento inicial do índice vetorial na memória pode levar alguns segundos/minutos.
  </Step>

  <Step title="Gere embeddings para a consulta de pesquisa" id="generating-embeddings-for-search-query">
    Os vetores de embedding do conjunto de dados `LAION 5b` foram gerados usando o modelo `ViT-L/14` do `OpenAI CLIP`.

    Um exemplo de script em Python é fornecido abaixo para demonstrar como gerar programaticamente
    vetores de embedding usando as APIs do `CLIP`. Em seguida, o vetor de embedding de
    busca é passado como argumento para a função [`cosineDistance()`](/pt-BR/reference/functions/regular-functions/distance-functions#cosineDistance) na consulta `SELECT`.

    Para instalar o pacote `clip`, consulte o [repositório do OpenAI no GitHub](https://github.com/openai/clip).

    ```python theme={null}
    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)

    # Search for images that contain both a dog and a cat
    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()

        # Pass ClickHouse credentials here
        chclient = clickhouse_connect.get_client()

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

        # Write the results to a simple HTML page that can be opened in the browser. Some URLs may have become obsolete.
        print("<html>")
        for r in result.result_rows:
            print("<img src = ", r[1], 'width="200" height="200">')
        print("</html>")
    ```

    O resultado da busca acima é exibido abaixo:

    <Image img="https://mintcdn.com/private-7c7dfe99-detect-table-modification/bx6sZ_fx0ABo_aFe/images/getting-started/example-datasets/laion5b_visualization_1.webp?fit=max&auto=format&n=bx6sZ_fx0ABo_aFe&q=85&s=842074a2dda9e847838902129fa55df5" alt="Resultados da Busca por Similaridade Vetorial" size="md" width="3400" height="1794" data-path="images/getting-started/example-datasets/laion5b_visualization_1.webp" />
  </Step>
</Steps>
