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

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

# Датасет LAION 5B

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

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

Полный датасет доступен в виде набора файлов `npy` и `Parquet` на [the-eye.eu](https://the-eye.eu/public/AI/cah/laion5b/)

ClickHouse также предоставил подмножество из 100 миллионов векторов в бакете `S3`.
Бакет `S3` содержит 10 файлов `Parquet`, каждый из которых включает 10 миллионов строк.

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

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

<Steps>
  <Step>
    ### Создание таблицы

    Создайте таблицу `laion_5b_100m` для хранения эмбеддингов и связанных с ними атрибутов:

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

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

  <Step>
    ### Загрузите данные

    Чтобы загрузить данные из всех файлов `Parquet`, выполните следующий оператор SQL:

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

    Загрузка 100 миллионов строк в таблицу займет несколько минут.

    Либо можно выполнить отдельные SQL-команды, чтобы загрузить определенное количество файлов / строк.

    ```sql theme={null}
    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');
    ⋮
    ```
  </Step>

  <Step>
    ### Выполнение полного перебора для векторного поиска по сходству

    Поиск KNN (k ближайших соседей), или метод полного перебора, предполагает вычисление расстояния от каждого вектора в наборе данных
    до искомого эмбеддинг-вектора с последующей сортировкой расстояний для нахождения ближайших соседей. В качестве вектора поиска
    можно использовать один из векторов самого набора данных. Например:

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

    Вектор в строке с id = 9999 — это эмбеддинг для изображения ресторана Deli.
    ```

    ```response title="Response" highlight={24} theme={null}
    ┌───────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&amp;height=401&amp;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&amp;width=80&amp;height=80&amp;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 rows in set. Elapsed: 3.968 sec. Processed 100.38 million rows, 320.81 GB (25.30 million rows/s., 80.84 GB/s.)
    ```

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

  <Step>
    ### Создайте индекс векторного сходства

    Выполните следующий SQL, чтобы задать и построить индекс векторного сходства для столбца `vector` таблицы `laion_5b_100m`:

    ```sql theme={null}
    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;
    ```

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

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

  <Step>
    ### Выполните ANN-поиск

    После построения индекса векторного сходства запросы векторного поиска будут автоматически использовать этот индекс:

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

    ```

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

  <Step>
    ### Генерация эмбеддинг-векторов для поискового запроса

    Эмбеддинг-векторы набора данных `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)

    # Поиск изображений, содержащих одновременно собаку и кошку
    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()

        # Укажите здесь учётные данные 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)

        # Запись результатов в простую HTML-страницу, которую можно открыть в браузере. Некоторые URL могут оказаться недействительными.
        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-fix-nav-issues/ddNWBC5mE_w-syUp/images/getting-started/example-datasets/laion5b_visualization_1.png?fit=max&auto=format&n=ddNWBC5mE_w-syUp&q=85&s=8f53253f5302cdc505813b2d307aee39" alt="Результаты поиска по векторному сходству" size="md" width="3400" height="1794" data-path="images/getting-started/example-datasets/laion5b_visualization_1.png" />
  </Step>
</Steps>
