Перейти к основному содержанию
Набор данных dbpedia содержит 1 миллион статей из Википедии и их векторные эмбеддинги, сгенерированные с помощью модели text-embedding-3-large от OpenAI. Этот набор данных отлично подходит для знакомства с векторными эмбеддингами, поиском по сходству векторов и Generative AI. Мы используем этот набор данных, чтобы продемонстрировать приближённый поиск ближайших соседей в ClickHouse и простое, но мощное Q&A-приложение.

Сведения о наборе данных

Набор данных содержит 26 файлов Parquet, размещённых на huggingface.co. Файлы называются 0.parquet, 1.parquet, …, 25.parquet. Чтобы посмотреть несколько строк из набора данных в качестве примера, перейдите на эту страницу Hugging Face.

Создайте таблицу

Создайте таблицу dbpedia для хранения идентификатора статьи, заголовка, текста и эмбеддинг-вектора:

Загрузите таблицу

Чтобы загрузить данные из всех файлов Parquet, выполните следующую команду оболочки:
Либо можно выполнить отдельные SQL-команды, как показано ниже, чтобы загрузить каждый из 25 файлов Parquet:
Убедитесь, что в таблице dbpedia отображается 1 миллион строк:
Рекомендуем к прочтению: “Векторные эмбеддинги ” — руководство OpenAPI Семантический поиск (также называемый поиском по сходству) с использованием векторных эмбеддингов включает следующие шаги:
  • Принять от пользователя поисковый запрос на естественном языке, например “Расскажи мне о живописных железнодорожных путешествиях”, “Детективные романы, действие которых происходит в Европе” и т. д.
  • Сгенерировать эмбеддинг-вектор для поискового запроса с помощью LLM-модели
  • Найти в наборе данных ближайших соседей для эмбеддинг-вектора поискового запроса
Ближайшие соседи — это документы, изображения или другой контент, наиболее релевантный запросу пользователя. Полученные результаты служат ключевым входом для Retrieval Augmented Generation (RAG) в приложениях Generative AI. Поиск KNN (k - ближайших соседей) или поиск полным перебором заключается в вычислении расстояния от каждого вектора в наборе данных до искомого эмбеддинг-вектора с последующей сортировкой по расстоянию, чтобы получить ближайших соседей. Для набора данных dbpedia быстрый способ наглядно продемонстрировать семантический поиск — использовать эмбеддинг-векторы из самого набора данных в качестве поисковых векторов. Например:
Query
Response
Запишите задержку выполнения запроса, чтобы мы могли сравнить её с задержкой выполнения ANN-запроса (с использованием векторного индекса). Также запишите задержку выполнения запроса при холодном файловом кэше ОС и с max_threads=1, чтобы оценить реальное использование вычислительных ресурсов и пропускной способности хранилища (экстраполируйте это на продакшн-набор данных с миллионами векторов!)

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

Выполните следующий SQL-запрос, чтобы задать и создать индекс векторного сходства для столбца vector:
Параметры и особенности производительности при создании индекса и выполнении поиска описаны в документации. Создание и сохранение индекса может занять несколько минут в зависимости от количества доступных ядер процессора и пропускной способности хранилища. Approximate Nearest Neighbours (ANN) — это группа методов (например, специальные структуры данных, такие как графы и случайные леса), которые находят результаты значительно быстрее, чем точный векторный поиск. Точность результатов обычно “достаточно высока” для практического применения. Многие приближённые методы предоставляют параметры, позволяющие настраивать компромисс между точностью результатов и временем поиска. После построения индекса векторного сходства запросы векторного поиска будут автоматически использовать этот индекс:
Query
Response

Генерация эмбеддингов для поискового запроса

В запросах поиска по сходству, рассмотренных выше, в качестве вектора поиска используется один из существующих векторов в таблице dbpedia. В реальных приложениях вектор поиска должен генерироваться для пользовательского запроса, который может быть сформулирован на естественном языке. Вектор поиска следует генерировать с помощью той же LLM-модели, которая использовалась для создания эмбеддинг-векторов для набора данных. Ниже приведён пример Python-скрипта, демонстрирующий, как программно вызывать API OpenAI для генерации эмбеддинг-векторов с использованием модели text-embedding-3-large. Затем поисковый эмбеддинг-вектор передаётся в качестве аргумента в функцию cosineDistance() в запросе SELECT. Для запуска скрипта необходимо, чтобы API-ключ OpenAI был задан в переменной окружения OPENAI_API_KEY. API-ключ OpenAI можно получить после регистрации на https://platform.openai.com.

Демо-приложение Q&A

В приведённых выше примерах были показаны семантический поиск и извлечение документов с использованием ClickHouse. Далее представлен очень простой, но весьма перспективный пример приложения с генеративным ИИ. Приложение выполняет следующие шаги:
  1. Принимает от пользователя тему в качестве входных данных
  2. Генерирует эмбеддинг-вектор для темы, вызывая API OpenAI с моделью text-embedding-3-large
  3. Извлекает наиболее релевантные статьи/документы из Википедии, используя поиск по векторному сходству в table dbpedia
  4. Принимает от пользователя вопрос в свободной форме на естественном языке, относящийся к теме
  5. Использует Chat API OpenAI gpt-3.5-turbo, чтобы ответить на вопрос на основе сведений из документов, извлечённых на шаге #3. Документы, извлечённые на шаге #3, передаются в Chat API как контекст и являются ключевым связующим звеном в генеративном ИИ.
Ниже сначала приведена пара примеров диалогов при запуске Q&A-приложения, а затем — код для Q&A-приложения. Для запуска приложения необходимо, чтобы в переменной окружения OPENAI_API_KEY был задан API-ключ OpenAI. API-ключ OpenAI можно получить после регистрации на https://platform.openai.com.
Код:
Последнее изменение 2 июля 2026 г.