Skip to content

Quantization Config support#126

Open
maximbogatyrev wants to merge 1 commit intomasterfrom
feature/quantization-config
Open

Quantization Config support#126
maximbogatyrev wants to merge 1 commit intomasterfrom
feature/quantization-config

Conversation

@maximbogatyrev
Copy link
Copy Markdown

Добавлена поддержка quantization_config для HNSW-индексов и покрытие нового поведения тестами:

  • quantization-конфиг можно обновить через стандартное api добавления/обновления индексов (удалена аннотация Deprecated из соответствующих методов).
  • в аннотацию Hnsw добавлен блок QuantizationConfig
  • в HnswConfig добавлена вложенная модель QuantizationConfig
  • в HnswConfigs добавлено построение и валидация quantization-конфига из аннотаций
  • расширены unit-тесты для сканера аннотаций в ReindexAnnotationScannerHnswIndexTest
  • добавлены интеграционные тесты обновления quantization-конфига для builtin и cproto в HnswQuantizationConfigUpdateTest

По умолчанию quantization_config для HNSW не заполняется

@maximbogatyrev maximbogatyrev requested a review from steleal March 26, 2026 12:30
@@ -0,0 +1,198 @@
/*
* Copyright 2020 Restream
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Год актуальный можно указать здесь и прочих новых файлах)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно было бы заменить на 2020-present, я недавно у себя обновил шаблон заголовка с лицензией.
Потом прогнать mvn license:format чтобы обновить лицензию во всех файлах.

@MadSchemas MadSchemas self-requested a review March 26, 2026 13:37
*
* <p>Currently supported: {@code scalar_quantization_8_bit}.
*/
String quantizationType() default "";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если в будущем число вариантов квантизации будет больше одного, но останется небольшим - может, сразу сделать enum? Как Metric. Чтобы нельзя было присвоить неподходящее значение? Хотя, конечно, при расширении списка потребуется модификация кода коннектора, что неудобно...

Если это единственный вариант, и в будущем останется единственным - может, сделать булевым полем? isScalarQuantization8bit.

Copy link
Copy Markdown
Author

@maximbogatyrev maximbogatyrev Mar 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну у нас пока планов нет на добавление нового типа квантования. В ядре проверка захардкожена на строку "scalar_quantization_8_bit". Главное, что если в этом поле что-то приходит, то именно это значение. Так что, опять же, как удобнее

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bool точно не стоит, так как в перспективе их будет несколько


/**
* Quantile for scalar quantization.
*/
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавить бы в доку допустимые значения.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну, разве что вот в таком виде, возможно урезанном:
Quantile used to determine the clipping range of vector components before quantization. Allowed values range from 0.95 to 1.0. The default value is computed automatically based on the dimensionality of vectors in the index. It is recommended to change this parameter only if the distribution of vector component values is known and additional search quality tuning is required, for example to achieve the expected recall

/**
* Sample size for estimating quantile(s).
*/
int sampleSize() default 20_000;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Допустимые значения? Отрицательное можно?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

целые знаковые, от 1 до UINT64_MAX

/**
* Nested annotation representing {@code quantization_config} block.
*/
@interface QuantizationConfig {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Как вариант - вынести в отдельный класс.

Также, возможно, немного поменял бы имена.
Чтобы вместо quantizationConfig = @Hnsw.QuantizationConfig(quantizationType = "scalar_quantization_8_bit", quantile = 0.987f, sampleSize = 3000, quantizationThreshold = 5000)
было что-то вроде quantization = @Quantization(type = "scalar_quantization_8_bit", quantile = 0.987f, sampleSize = 3000, threshold = 5000)

Правда, тогда будет рассинхрон с HnswConfig, а тот менять нельзя, т.к. имена полей сериализуются для RX. Пожалуй, пусть остается единообразно.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ну на ваше усмотрение) как будто перекладка в HSNWConfig в src/main/java/ru/rt/restream/reindexer/vector/HnswConfigs.java позволяет использовать другие имена в аннотации. Так что, как удобнее.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants