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

> Датасет с 10 миллионами векторов из датасета LAION 5B

# Датасет 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">
  ## Введение
</div>

[Датасет LAION 5b](https://laion.ai/blog/laion-5b/) содержит 5,85 миллиарда эмбеддингов пар «изображение—текст» и
связанные с ними метаданные изображений. Эмбеддинги были сгенерированы с помощью модели `Open AI CLIP` [ViT-L/14](https://huggingface.co/sentence-transformers/clip-ViT-L-14). Размерность каждого эмбеддинг-вектора — `768`.

Этот датасет можно использовать для моделирования вопросов проектирования, подбора размера и производительности
крупномасштабного приложения векторного поиска из реального мира. Датасет можно использовать как для поиска
изображений по тексту, так и для поиска изображений по изображению.

<div id="dataset-details">
  ## Сведения о датасете
</div>

Полный датасет можно скачать с помощью [opendatalab/laion5b-downloader](https://github.com/opendatalab/laion5b-downloader).

ClickHouse также предоставил подмножество из 10 миллионов векторов в публичном бакете `S3`.
Подмножество хранится в одном файле `Parquet`.

Мы рекомендуем пользователям сначала оценить требуемые ресурсы, чтобы определить требования к хранилищу и памяти для этого датасета, обратившись к [документации](/ru/reference/engines/table-engines/mergetree-family/annindexes).

<div id="steps">
  ## Шаги
</div>

<Steps>
  <Step title="Создать таблицу" id="create-table">
    Создайте таблицу `laion_5b_10m` для хранения эмбеддингов и связанных с ними атрибутов:

    ```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)
    ```

    `id` — это просто последовательное целое число. Дополнительные атрибуты можно использовать в предикатах, чтобы изучить
    поиск по сходству векторов в сочетании с постфильтрацией/префильтрацией, как описано в [документации](/ru/reference/engines/table-engines/mergetree-family/annindexes)
  </Step>

  <Step title="Загрузить данные" id="load-table">
    Чтобы загрузить набор данных, выполните следующий 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);
    ```

    Загрузка 10 миллионов строк в таблицу займет несколько минут.
  </Step>

  <Step title="Выполните поиск векторного сходства полным перебором" id="run-a-brute-force-vector-similarity-search">
    Поиск методом k ближайших соседей (KNN) или полный перебор предполагает вычисление расстояния от каждого вектора в наборе данных
    до поискового эмбеддинг-вектора с последующей сортировкой расстояний для определения ближайших соседей. В качестве поискового вектора можно использовать один из векторов
    самого набора данных. Например:

    ```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.
    ```

    Зафиксируйте время выполнения запроса, чтобы затем сравнить его со временем выполнения ANN-запроса (с использованием векторного индекса).
    На 10 миллионах строк выполнение приведённого выше запроса без векторного индекса может занять от нескольких секунд до нескольких минут.
  </Step>

  <Step title="Создайте индекс векторного сходства" id="build-vector-similarity-index">
    Выполните следующий SQL-запрос, чтобы создать и построить индекс векторного сходства для столбца `vector` таблицы `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;
    ```

    Параметры и особенности производительности при создании индекса и поиске по нему описаны в [документации](/ru/reference/engines/table-engines/mergetree-family/annindexes).
    В приведённом выше операторе для гиперпараметров HNSW `M` и `ef_construction` используются значения 64 и 512 соответственно.
    Необходимо тщательно подобрать оптимальные значения этих параметров, оценивая время построения индекса и качество результатов поиска,
    соответствующие выбранным значениям.

    Построение и сохранение индекса для подмножества из 10 миллионов строк может занять значительное время в зависимости от количества доступных ядер CPU и пропускной способности хранилища.
  </Step>

  <Step title="Выполните ANN-поиск" id="perform-ann-search">
    После создания индекса векторного сходства запросы векторного поиска будут автоматически использовать его:

    ```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

    ```

    Первоначальная загрузка векторного индекса в память может занять от нескольких секунд до нескольких минут.
  </Step>

  <Step title="Создайте эмбеддинги для поискового запроса" id="generating-embeddings-for-search-query">
    Эмбеддинг-векторы набора данных `LAION 5b` были сгенерированы с использованием модели `OpenAI CLIP` `ViT-L/14`.

    Ниже приведён пример скрипта на Python, показывающий, как программно генерировать
    эмбеддинг-векторы с помощью API `CLIP`. Затем поисковый эмбеддинг-вектор
    передаётся в качестве аргумента функции [`cosineDistance()`](/ru/reference/functions/regular-functions/distance-functions#cosineDistance) в SELECT-запросе.

    Чтобы установить пакет `clip`, обратитесь к [репозиторию OpenAI на 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>")
    ```

    Результат поиска показан ниже:

    <Image img="https://mintcdn.com/private-7c7dfe99-trino-dialect/pOHtM6L6ptAMkHyp/images/getting-started/example-datasets/laion5b_visualization_1.webp?fit=max&auto=format&n=pOHtM6L6ptAMkHyp&q=85&s=90c8177597f8ab17704aaf9c49523b8e" alt="Результаты поиска по векторной схожести" size="md" width="3400" height="1794" data-path="images/getting-started/example-datasets/laion5b_visualization_1.webp" />
  </Step>
</Steps>
