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

# Можно ли использовать ClickHouse для векторного поиска?

> Узнайте, как использовать ClickHouse для векторного поиска, включая хранение эмбеддингов и поиск с помощью функций расстояния, таких как косинусное сходство.

{frontMatter.description}

<div id="clickhouse-for-vector-search">
  ## ClickHouse для векторного поиска!
</div>

Да, ClickHouse поддерживает векторный поиск.

Основные преимущества использования ClickHouse для векторного поиска по сравнению с более специализированными векторными базами данных:

* Возможность использовать фильтрацию и полнотекстовый поиск ClickHouse, чтобы сузить датасет перед выполнением поиска.
* Возможность выполнять аналитику по вашим датасетам.
* Возможность выполнять `JOIN` с уже имеющимися данными.
* Не нужно управлять еще одной базой данных и усложнять инфраструктуру.

Ниже — краткое руководство по использованию ClickHouse для векторного поиска.

<div id="1-create-embeddings">
  ## 1. Создайте эмбеддинги
</div>

Ваши данные (документы, изображения или структурированные данные) нужно преобразовать в *эмбеддинги*. Мы рекомендуем создавать эмбеддинги с помощью [OpenAI Embeddings API](https://platform.openai.com/docs/api-reference/embeddings) или открытой Python-библиотеки [SentenceTransformers](https://www.sbert.net/).

Эмбеддинг можно представить как большой массив чисел с плавающей запятой, который представляет ваши данные. [Ознакомьтесь с этим руководством от OpenAI, чтобы узнать больше об эмбеддингах](https://platform.openai.com/docs/guides/embeddings/what-are-embeddings).

<div id="2-store-the-embeddings">
  ## 2. Сохраните эмбеддинги
</div>

После того как вы сгенерировали эмбеддинги, их нужно сохранить в ClickHouse. Каждый эмбеддинг следует хранить в отдельной строке; при необходимости можно также добавить метаданные для фильтрации, агрегаций или аналитики. Вот пример таблицы, в которой можно хранить изображения с подписями:

```sql theme={null}
CREATE TABLE images
(
	`_file` LowCardinality(String),
	`caption` String,
	`image_embedding` Array(Float32)
)
ENGINE = MergeTree;
```

<div id="3-search-for-related-embeddings">
  ## 3. Поиск похожих эмбеддингов
</div>

Допустим, вы хотите найти в своем наборе данных изображения собак. Для этого можно использовать функцию расстояния, например `cosineDistance`, чтобы взять эмбеддинг изображения собаки и найти похожие изображения:

```sql theme={null}
SELECT
    _file,
	caption,
	cosineDistance(
        -- Эмбеддинг вашего «входного» изображения собаки
        [0.5736801028251648, 0.2516217529773712, ...,  -0.6825592517852783],
        image_embedding
    ) AS score
FROM images
ORDER BY score ASC
LIMIT 10
```

Этот запрос возвращает имена `_file` и `caption` 10 изображений, которые, скорее всего, связаны с предоставленным вами изображением собаки.

<div id="further-reading">
  ## Дополнительные материалы
</div>

Более подробное руководство по векторному поиску в ClickHouse см. здесь:

* [Точный и приближённый векторный поиск](/ru/reference/engines/table-engines/mergetree-family/annindexes)
