В этом руководстве вы:
- Кратко познакомитесь с векторным поиском
- Узнаете о приближённом поиске ближайших соседей (ANN) и Hierarchical Navigable Small World (HNSW)
- Узнаете о Quantised Bit (QBit)
- Используете QBit для векторного поиска на наборе данных DBPedia
Кратко о векторном поиске
Что такое эмбеддинги
Приближённый поиск ближайших соседей (ANN)
Квантизация
- Хранить квантизованную копию рядом с исходным столбцом - Это удваивает объём хранилища, зато безопасно: мы всегда можем вернуться к полной точности
- Полностью заменить исходные значения (за счёт приведения при вставке) - Это экономит место и I/O, но обратного пути уже не будет
Hierarchical Navigable Small World (HNSW)
Сравнение подходов
Подробно о QBit
Quantised Bit (QBit)
BFloat16, Float32 и Float64, используя особенности представления чисел с плавающей запятой — в виде битов.
Вместо хранения каждого числа целиком QBit разбивает значения на битовые плоскости: все первые биты, все вторые биты, все третьи биты и так далее.
Этот подход устраняет главное ограничение традиционного квантования. Не нужно хранить дублирующиеся данные или рисковать тем, что значения потеряют смысл. Он также позволяет избежать узких мест HNSW, связанных с оперативной памятью, поскольку QBit работает напрямую с хранимыми данными, а не поддерживает индекс в памяти.
ОграничениеХотя QBit ускоряет векторный поиск, его вычислительная сложность по-прежнему составляет O(n). Иными словами, если ваш набор данных достаточно мал и индекс HNSW без проблем помещается в оперативной памяти, это всё ещё самый быстрый вариант.
Тип данных
FixedString(N): в виде строк фиксированной длины по N байт, последовательно расположенных в памяти без разделителей между ними. Затем все такие группы объединяются в один Tuple, который лежит в основе структуры QBit.
Пример: Если взять вектор из 8 элементов Float64, каждая группа будет содержать 8 бит. Поскольку Float64 состоит из 64 бит, в итоге получается 64 группы (по одной на каждый бит). Следовательно, внутренняя структура QBit(Float64, 8) выглядит как Tuple из 64 столбцов FixedString(1).
Вычисление расстояния
L2DistanceTransposed с параметром точности:
Оптимизация I/O
Оптимизация вычислений
Оптимизация BFloat16
Сложность Float64
Пример с DBpedia
Настройка
Поисковый запрос
Сравните производительность с полным перебором
Сравните производительность с полным перебором
Ключевая идея
Заключение
Адаптировано из поста в блоге Рауфса Дунамалиевса, опубликованного 28 октября 2025 года