[go: up one dir, main page]

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Strict mode] default config #5037

Merged
merged 4 commits into from
Sep 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 27 additions & 4 deletions config/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ storage:
# Only supported on Linux, must be enabled in your kernel.
# See: <https://qdrant.tech/articles/io_uring/#and-what-about-qdrant>
#async_scorer: false

optimizers:
# The minimal fraction of deleted vectors in a segment, required to perform segment optimization
deleted_threshold: 0.2
Expand Down Expand Up @@ -206,6 +206,32 @@ storage:
# More info: https://qdrant.tech/documentation/guides/quantization
quantization: null

# Default strict mode parameters for newly created collections.
strict_mode:
# Whether strict mode is enabled for a collection or not.
enabled: false

# Max allowed `limit` parameter for all APIs that don't have their own max limit.
max_query_limit: null

# Max allowed `timeout` parameter.
max_timeout: null

# Allow usage of unindexed fields in retrieval based (eg. search) filters.
unindexed_filtering_retrieve: null

# Allow usage of unindexed fields in filtered updates (eg. delete by payload).
unindexed_filtering_update: null

# Max HNSW value allowed in search parameters.
search_max_hnsw_ef: null

# Whether exact search is allowed or not.
search_allow_exact: null

# Max oversampling value allowed in search.
search_max_oversampling: null
timvisee marked this conversation as resolved.
Show resolved Hide resolved

service:
# Maximum size of POST data in a single request in megabytes
max_request_size_mb: 32
Expand Down Expand Up @@ -286,12 +312,10 @@ cluster:
# We encourage you NOT to change this parameter unless you know what you are doing.
tick_period_ms: 100


# Set to true to prevent service from sending usage statistics to the developers.
# Read more: https://qdrant.tech/documentation/guides/telemetry
telemetry_disabled: false


# TLS configuration.
# Required if either service.enable_tls or cluster.p2p.enable_tls is true.
tls:
Expand All @@ -315,4 +339,3 @@ tls:
# Only works for HTTPS endpoints. Does not support gRPC (and intra-cluster communication).
# If `null` - TTL is disabled.
cert_ttl: 3600

10 changes: 5 additions & 5 deletions docs/grpc/docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
- [SparseVectorConfig](#qdrant-SparseVectorConfig)
- [SparseVectorConfig.MapEntry](#qdrant-SparseVectorConfig-MapEntry)
- [SparseVectorParams](#qdrant-SparseVectorParams)
- [StrictModeConfig](#qdrant-StrictModeConfig)
- [StrictModeConfigDiff](#qdrant-StrictModeConfigDiff)
- [TextIndexParams](#qdrant-TextIndexParams)
- [UpdateCollection](#qdrant-UpdateCollection)
- [UpdateCollectionClusterSetupRequest](#qdrant-UpdateCollectionClusterSetupRequest)
Expand Down Expand Up @@ -439,7 +439,7 @@
| optimizer_config | [OptimizersConfigDiff](#qdrant-OptimizersConfigDiff) | | Configuration of the optimizers |
| wal_config | [WalConfigDiff](#qdrant-WalConfigDiff) | | Configuration of the Write-Ahead-Log |
| quantization_config | [QuantizationConfig](#qdrant-QuantizationConfig) | optional | Configuration of the vector quantization |
| strict_mode_config | [StrictModeConfig](#qdrant-StrictModeConfig) | optional | Configuration of strict mode. |
| strict_mode_config | [StrictModeConfigDiff](#qdrant-StrictModeConfigDiff) | optional | Configuration of strict mode. |



Expand Down Expand Up @@ -639,7 +639,7 @@
| quantization_config | [QuantizationConfig](#qdrant-QuantizationConfig) | optional | Quantization configuration of vector |
| sharding_method | [ShardingMethod](#qdrant-ShardingMethod) | optional | Sharding method |
| sparse_vectors_config | [SparseVectorConfig](#qdrant-SparseVectorConfig) | optional | Configuration for sparse vectors |
| strict_mode_config | [StrictModeConfig](#qdrant-StrictModeConfig) | optional | Configuration for strict mode |
| strict_mode_config | [StrictModeConfigDiff](#qdrant-StrictModeConfigDiff) | optional | Configuration for strict mode |



Expand Down Expand Up @@ -1397,9 +1397,9 @@ Note: 1kB = 1 vector of size 256. |



<a name="qdrant-StrictModeConfig"></a>
<a name="qdrant-StrictModeConfigDiff"></a>

### StrictModeConfig
### StrictModeConfigDiff



Expand Down
37 changes: 34 additions & 3 deletions lib/api/src/grpc/conversions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@ use crate::grpc::qdrant::{
PayloadIncludeSelector, PayloadIndexParams, PayloadSchemaInfo, PayloadSchemaType, PointId,
PointsOperationResponse, PointsOperationResponseInternal, ProductQuantization,
QuantizationConfig, QuantizationSearchParams, QuantizationType, RepeatedIntegers,
RepeatedStrings, ScalarQuantization, ScoredPoint, SearchParams, ShardKey, SparseVector, Struct,
TextIndexParams, TokenizerType, UpdateResult, UpdateResultInternal, Value, ValuesCount, Vector,
Vectors, VectorsSelector, WithPayloadSelector, WithVectorsSelector,
RepeatedStrings, ScalarQuantization, ScoredPoint, SearchParams, ShardKey, SparseVector,
StrictModeConfigDiff, Struct, TextIndexParams, TokenizerType, UpdateResult,
UpdateResultInternal, Value, ValuesCount, Vector, Vectors, VectorsSelector,
WithPayloadSelector, WithVectorsSelector,
};
use crate::rest::schema as rest;

Expand Down Expand Up @@ -1757,6 +1758,36 @@ impl From<HnswConfigDiff> for segment::types::HnswConfig {
}
}

impl From<StrictModeConfigDiff> for segment::types::StrictModeConfig {
fn from(value: StrictModeConfigDiff) -> Self {
Self {
enabled: value.enabled,
max_query_limit: value.max_query_limit.map(|i| i as usize),
max_timeout: value.max_timeout.map(|i| i as usize),
unindexed_filtering_retrieve: value.unindexed_filtering_retrieve,
unindexed_filtering_update: value.unindexed_filtering_update,
search_max_hnsw_ef: value.search_max_hnsw_ef.map(|i| i as usize),
search_allow_exact: value.search_allow_exact,
search_max_oversampling: value.search_max_oversampling.map(f64::from),
}
}
}
Comment on lines +1761 to +1774
Copy link
Member

Choose a reason for hiding this comment

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

If we can construct a regular config from a diff, I don't see much reason to also have a diff type.


impl From<segment::types::StrictModeConfig> for StrictModeConfigDiff {
fn from(value: segment::types::StrictModeConfig) -> Self {
Self {
enabled: value.enabled,
max_query_limit: value.max_query_limit.map(|i| i as u32),
max_timeout: value.max_timeout.map(|i| i as u32),
unindexed_filtering_retrieve: value.unindexed_filtering_retrieve,
unindexed_filtering_update: value.unindexed_filtering_update,
search_max_hnsw_ef: value.search_max_hnsw_ef.map(|i| i as u32),
search_allow_exact: value.search_allow_exact,
search_max_oversampling: value.search_max_oversampling.map(|i| i as f32),
}
}
}

pub fn naive_date_time_to_proto(date_time: NaiveDateTime) -> prost_wkt_types::Timestamp {
prost_wkt_types::Timestamp {
seconds: date_time.and_utc().timestamp(), // number of non-leap seconds since the midnight on January 1, 1970.
Expand Down
6 changes: 3 additions & 3 deletions lib/api/src/grpc/proto/collections.proto
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ enum ShardingMethod {
Custom = 1; // Shard by user-defined key
}

message StrictModeConfig {
message StrictModeConfigDiff {
optional bool enabled = 1;
optional uint32 max_query_limit = 2;
optional uint32 max_timeout = 3;
Expand Down Expand Up @@ -339,7 +339,7 @@ message CreateCollection {
optional QuantizationConfig quantization_config = 14; // Quantization configuration of vector
optional ShardingMethod sharding_method = 15; // Sharding method
optional SparseVectorConfig sparse_vectors_config = 16; // Configuration for sparse vectors
optional StrictModeConfig strict_mode_config = 17; // Configuration for strict mode
optional StrictModeConfigDiff strict_mode_config = 17; // Configuration for strict mode
}

message UpdateCollection {
Expand Down Expand Up @@ -389,7 +389,7 @@ message CollectionConfig {
OptimizersConfigDiff optimizer_config = 3; // Configuration of the optimizers
WalConfigDiff wal_config = 4; // Configuration of the Write-Ahead-Log
optional QuantizationConfig quantization_config = 5; // Configuration of the vector quantization
optional StrictModeConfig strict_mode_config = 6; // Configuration of strict mode.
optional StrictModeConfigDiff strict_mode_config = 6; // Configuration of strict mode.
}

enum TokenizerType {
Expand Down
9 changes: 3 additions & 6 deletions lib/api/src/grpc/qdrant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -429,18 +429,15 @@ pub mod quantization_config_diff {
Binary(super::BinaryQuantization),
}
}
#[derive(validator::Validate)]
#[derive(serde::Serialize)]
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct StrictModeConfig {
pub struct StrictModeConfigDiff {
#[prost(bool, optional, tag = "1")]
pub enabled: ::core::option::Option<bool>,
#[prost(uint32, optional, tag = "2")]
#[validate(range(min = 1))]
pub max_query_limit: ::core::option::Option<u32>,
#[prost(uint32, optional, tag = "3")]
#[validate(range(min = 1))]
pub max_timeout: ::core::option::Option<u32>,
#[prost(bool, optional, tag = "4")]
pub unindexed_filtering_retrieve: ::core::option::Option<bool>,
Expand Down Expand Up @@ -511,7 +508,7 @@ pub struct CreateCollection {
pub sparse_vectors_config: ::core::option::Option<SparseVectorConfig>,
/// Configuration for strict mode
#[prost(message, optional, tag = "17")]
pub strict_mode_config: ::core::option::Option<StrictModeConfig>,
pub strict_mode_config: ::core::option::Option<StrictModeConfigDiff>,
}
#[derive(validator::Validate)]
#[derive(serde::Serialize)]
Expand Down Expand Up @@ -649,7 +646,7 @@ pub struct CollectionConfig {
pub quantization_config: ::core::option::Option<QuantizationConfig>,
/// Configuration of strict mode.
#[prost(message, optional, tag = "6")]
pub strict_mode_config: ::core::option::Option<StrictModeConfig>,
pub strict_mode_config: ::core::option::Option<StrictModeConfigDiff>,
}
#[derive(serde::Serialize)]
#[allow(clippy::derive_partial_eq_without_eq)]
Expand Down
2 changes: 1 addition & 1 deletion lib/collection/src/collection/collection_ops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::sync::Arc;

use futures::{future, TryStreamExt as _};
use lazy_static::lazy_static;
use segment::types::QuantizationConfig;
use segment::types::{QuantizationConfig, StrictModeConfig};
use semver::Version;

use super::Collection;
Expand Down
6 changes: 3 additions & 3 deletions lib/collection/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ use segment::index::sparse_index::sparse_index_config::{SparseIndexConfig, Spars
use segment::types::{
default_replication_factor_const, default_shard_number_const,
default_write_consistency_factor_const, Distance, HnswConfig, Indexes, PayloadStorageType,
QuantizationConfig, SparseVectorDataConfig, VectorDataConfig, VectorStorageDatatype,
VectorStorageType,
QuantizationConfig, SparseVectorDataConfig, StrictModeConfig, VectorDataConfig,
VectorStorageDatatype, VectorStorageType,
};
use serde::{Deserialize, Serialize};
use validator::Validate;
use wal::WalOptions;

use crate::operations::config_diff::{DiffConfig, QuantizationConfigDiff, StrictModeConfig};
use crate::operations::config_diff::{DiffConfig, QuantizationConfigDiff};
use crate::operations::types::{
CollectionError, CollectionResult, SparseVectorParams, SparseVectorsConfig, VectorParams,
VectorParamsDiff, VectorsConfig, VectorsConfigDiff,
Expand Down
24 changes: 18 additions & 6 deletions lib/collection/src/operations/config_diff.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ use std::num::NonZeroU32;

use merge::Merge;
use schemars::JsonSchema;
use segment::types::{BinaryQuantization, HnswConfig, ProductQuantization, ScalarQuantization};
use segment::types::{
BinaryQuantization, HnswConfig, ProductQuantization, ScalarQuantization, StrictModeConfig,
};
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use serde_json::Value;
Expand Down Expand Up @@ -86,8 +88,8 @@ pub struct HnswConfigDiff {
pub payload_m: Option<usize>,
}

#[derive(Debug, Deserialize, Serialize, JsonSchema, Validate, Clone, Merge)]
pub struct StrictModeConfig {
#[derive(Debug, Deserialize, Serialize, JsonSchema, Validate, Clone, Merge, Default)]
pub struct StrictModeConfigDiff {
// Global
/// Whether strict mode is enabled for a collection or not.
#[serde(skip_serializing_if = "Option::is_none")]
Expand Down Expand Up @@ -125,7 +127,7 @@ pub struct StrictModeConfig {
pub search_max_oversampling: Option<f64>,
}

impl Hash for StrictModeConfig {
impl Hash for StrictModeConfigDiff {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
let Self {
enabled,
Expand All @@ -149,9 +151,9 @@ impl Hash for StrictModeConfig {
}
}

impl Eq for StrictModeConfig {}
impl Eq for StrictModeConfigDiff {}

impl PartialEq for StrictModeConfig {
impl PartialEq for StrictModeConfigDiff {
fn eq(&self, other: &Self) -> bool {
let Self {
enabled,
Expand Down Expand Up @@ -294,6 +296,10 @@ impl DiffConfig<WalConfig> for WalConfigDiff {}

impl DiffConfig<CollectionParams> for CollectionParamsDiff {}

impl DiffConfig<StrictModeConfig> for StrictModeConfigDiff {}

impl DiffConfig<StrictModeConfigDiff> for StrictModeConfigDiff {}

impl From<HnswConfig> for HnswConfigDiff {
fn from(config: HnswConfig) -> Self {
HnswConfigDiff::from_full(&config).unwrap()
Expand All @@ -318,6 +324,12 @@ impl From<CollectionParams> for CollectionParamsDiff {
}
}

impl From<StrictModeConfig> for StrictModeConfigDiff {
fn from(config: StrictModeConfig) -> Self {
StrictModeConfigDiff::from_full(&config).unwrap()
}
}

pub fn from_full<T: DeserializeOwned + Serialize, Y: DeserializeOwned + Serialize>(
full_config: &T,
) -> CollectionResult<Y> {
Expand Down
29 changes: 9 additions & 20 deletions lib/collection/src/operations/conversions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ use itertools::Itertools;
use segment::data_types::vectors::{
BatchVectorStructInternal, NamedQuery, Vector, VectorStructInternal,
};
use segment::types::{Distance, MultiVectorConfig, QuantizationConfig, ScoredPoint};
use segment::types::{
Distance, MultiVectorConfig, QuantizationConfig, ScoredPoint, StrictModeConfig,
};
use segment::vector_storage::query::{ContextPair, ContextQuery, DiscoveryQuery, RecoQuery};
use sparse::common::sparse_vector::{validate_sparse_vector_impl, SparseVector};
use tonic::Status;

use super::config_diff::StrictModeConfig;
use super::config_diff::StrictModeConfigDiff;
use super::consistency_params::ReadConsistency;
use super::types::{
ContextExamplePair, CoreSearchRequest, Datatype, DiscoverRequestInternal, GroupsResult,
Expand Down Expand Up @@ -431,7 +433,9 @@ impl From<CollectionInfo> for api::grpc::qdrant::CollectionInfo {
wal_segments_ahead: Some(config.wal_config.wal_segments_ahead as u64),
}),
quantization_config: config.quantization_config.map(|x| x.into()),
strict_mode_config: config.strict_mode_config.map(From::from),
strict_mode_config: config
.strict_mode_config
.map(api::grpc::qdrant::StrictModeConfigDiff::from),
}),
payload_schema: payload_schema
.into_iter()
Expand All @@ -441,21 +445,6 @@ impl From<CollectionInfo> for api::grpc::qdrant::CollectionInfo {
}
}

impl From<StrictModeConfig> for api::grpc::qdrant::StrictModeConfig {
fn from(value: StrictModeConfig) -> Self {
api::grpc::qdrant::StrictModeConfig {
enabled: value.enabled,
max_query_limit: value.max_query_limit.map(|i| i as u32),
max_timeout: value.max_timeout.map(|i| i as u32),
unindexed_filtering_retrieve: value.unindexed_filtering_retrieve,
unindexed_filtering_update: value.unindexed_filtering_update,
search_max_hnsw_ef: value.search_max_hnsw_ef.map(|i| i as u32),
search_allow_exact: value.search_allow_exact,
search_max_oversampling: value.search_max_oversampling.map(|i| i as f32),
}
}
}

impl From<Record> for api::grpc::qdrant::RetrievedPoint {
fn from(record: Record) -> Self {
let vectors = record.vector.map(VectorStructInternal::from);
Expand Down Expand Up @@ -837,8 +826,8 @@ impl TryFrom<api::grpc::qdrant::GetCollectionInfoResponse> for CollectionInfo {
}
}

impl From<api::grpc::qdrant::StrictModeConfig> for StrictModeConfig {
fn from(value: api::grpc::qdrant::StrictModeConfig) -> Self {
impl From<api::grpc::qdrant::StrictModeConfigDiff> for StrictModeConfigDiff {
fn from(value: api::grpc::qdrant::StrictModeConfigDiff) -> Self {
Self {
enabled: value.enabled,
max_query_limit: value.max_query_limit.map(|i| i as usize),
Expand Down
3 changes: 1 addition & 2 deletions lib/collection/src/operations/verification/discovery.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
use segment::types::{Filter, SearchParams};
use segment::types::{Filter, SearchParams, StrictModeConfig};

use super::StrictModeVerification;
use crate::collection::Collection;
use crate::operations::config_diff::StrictModeConfig;
use crate::operations::types::{CollectionError, DiscoverRequestBatch, DiscoverRequestInternal};

impl StrictModeVerification for DiscoverRequestInternal {
Expand Down
3 changes: 1 addition & 2 deletions lib/collection/src/operations/verification/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,8 @@ mod update;

use std::fmt::Display;

use segment::types::{Filter, SearchParams};
use segment::types::{Filter, SearchParams, StrictModeConfig};

use super::config_diff::StrictModeConfig;
use super::types::CollectionError;
use crate::collection::Collection;

Expand Down
Loading