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

QBit тип данных

Experimental feature. Learn more.

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

примечание

Тип данных QBit и связанные с ним функции расстояния в настоящее время являются экспериментальными. Чтобы активировать их, сначала выполните команду SET allow_experimental_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: