Перейти к основному содержимому
Перейти к основному содержимому

Тип данных QBit

Beta feature. Learn more.

Тип данных QBit реорганизует хранение векторов для более быстрых приближённых поисков. Вместо того чтобы хранить элементы каждого вектора вместе, он группирует одинаковые позиции двоичных разрядов по всем векторам. Это позволяет хранить векторы с полной точностью и при этом выбирать тонкий уровень квантования во время поиска: читать меньше битов для уменьшения числа операций ввода-вывода (I/O) и ускорения вычислений или больше битов для повышения точности. Вы получаете преимущества по скорости за счёт уменьшения объёма передаваемых данных и вычислений благодаря квантованию, при этом все исходные данные остаются доступны при необходимости.

Примечание

Тип данных QBit и связанные с ним функции расстояния находятся в статусе Beta. Чтобы их включить, сначала выполните SET enable_qbit_type = 1. Если вы столкнётесь с проблемами, пожалуйста, создайте issue в репозитории ClickHouse.

Чтобы объявить столбец типа QBit, используйте следующий синтаксис:

column_name QBit(element_type, dimension)
  • element_type – тип каждого элемента вектора. Допустимые типы: BFloat16, Float32 и Float64
  • dimension – количество элементов в каждом векторе

Создание QBit

Использование типа QBit при определении столбца таблицы:

CREATE TABLE test (id UInt32, vec QBit(Float32, 8)) ENGINE = Memory;
INSERT INTO test VALUES (1, [1, 2, 3, 4, 5, 6, 7, 8]), (2, [9, 10, 11, 12, 13, 14, 15, 16]);
SELECT vec FROM test ORDER BY id;
┌─vec──────────────────────┐
│ [1,2,3,4,5,6,7,8]        │
│ [9,10,11,12,13,14,15,16] │
└──────────────────────────┘

Подстолбцы QBit

QBit реализует механизм доступа к подстолбцам, который позволяет обращаться к отдельным битовым плоскостям хранимых векторов. К каждой битовой позиции можно обратиться с помощью синтаксиса .N, где N — это номер битовой позиции:

CREATE TABLE test (id UInt32, vec QBit(Float32, 8)) ENGINE = Memory;
INSERT INTO test VALUES (1, [0, 0, 0, 0, 0, 0, 0, 0]);
INSERT INTO test VALUES (1, [-0, -0, -0, -0, -0, -0, -0, -0]);
SELECT bin(vec.1) FROM test;
┌─bin(tupleElement(vec, 1))─┐
│ 00000000                  │
│ 11111111                  │
└───────────────────────────┘

Количество доступных подстолбцов зависит от типа элемента:

  • BFloat16: 16 подстолбцов (1–16)
  • Float32: 32 подстолбца (1–32)
  • Float64: 64 подстолбца (1–64)

Функции векторного поиска

Это функции вычисления расстояния, используемые при поиске по векторному сходству и использующие тип данных QBit: