Строгий режим#

Данный инструмент администрирования Platform V Vector DB (далее - Vector DB) позволяют изменять поведение экземпляра Vector DB во время выполнения без необходимости ручного редактирования его конфигурации.

Строгий режим — функция ограничения определенных типов операций с коллекцией для ее защиты.

Цель состоит в том, чтобы предотвратить неэффективное использование шаблонов запросов, которые могут перегрузить коллекции.

Эта конфигурация обеспечивает более предсказуемое и отзывчивое обслуживание, когда не контролируются выполняемые запросы.

Вот неполный список операций, которые могут быть ограничены с использованием строгого режима:

  • запрет на выполнение запросов к ненастроенным индексам полезной нагрузки, что может занять много времени;

  • максимальное число условий фильтрации в запросе;

  • максимальный размер пакета при вставке векторов;

  • максимальный размер коллекции (в терминах количества векторов или размера полезной нагрузки).

При превышении лимита сервер возвращает ошибку клиентской стороны с информацией о пересекаемом лимите.

Поле enabled в составе конфигурации действует как переключатель для динамического включения или отключения строгого режима.

Параметр strict_mode_config можно задать при создании коллекции, например, ниже приведена команда активации предела unindexed_filtering_retrieve.

Установка параметра unindexed_filtering_retrieve равным значению "false" предотвращает использование фильтрации по ключу полезной нагрузки, который не проиндексирован.

Предусловия#

Пререквизиты:

  • Доступ к серверу: SSH или физический доступ.

  • Установленный продукт: сервер должен быть запущен (кроме операций с файлами данных).

  • Исходный код: скрипты находятся в /src/bin/ репозитория продукта.

  • Rust: установленный компилятор для сборки утилит.

Привилегии:

  • Файловая система: права на чтение/запись в storage_path.

  • API-ключ: обязателен ключ с правами admin для большинства операций.

  • Сетевой доступ: доступность API-порта (порт по умолчанию 6333).

Ключевые требования:

  • API-ключ admin.

  • Остановка сервиса не требуется.

Последовательность выполнения#

Активации строго режима:

PUT /collections/{collection_name}
{
    "strict_mode_config": {
        "enabled": true,
        "unindexed_filtering_retrieve": false
    }
}
curl -X PUT http://localhost:6333/collections/{collection_name} \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "strict_mode_config": {
        "enabled":" true,
        "unindexed_filtering_retrieve": false
    }
  }'
from qdrant_client import QdrantClient, models

client = QdrantClient(url="http://localhost:6333")

client.create_collection(
    collection_name="{collection_name}",
    strict_mode_config=models.StrictModeConfig(enabled=True, unindexed_filtering_retrieve=false),
)
import { QdrantClient } from "@qdrant/js-client-rest";

const client = new QdrantClient({ host: "localhost", port: 6333 });

client.createCollection("{collection_name}", {
  strict_mode_config: {
    enabled: true,
    unindexed_filtering_retrieve: false,
  },
});
use qdrant_client::Qdrant;
use qdrant_client::qdrant::{CreateCollectionBuilder, StrictModeConfigBuilder};

let client = Qdrant::from_url("http://localhost:6334").build()?;

client
    .create_collection(
        CreateCollectionBuilder::new("{collection_name}")
            .strict_config_mode(StrictModeConfigBuilder::default().enabled(true).unindexed_filtering_retrieve(false)),
    )
    .await?;
import io.qdrant.client.QdrantClient;
import io.qdrant.client.QdrantGrpcClient;
import io.qdrant.client.grpc.Collections.CreateCollection;
import io.qdrant.client.grpc.Collections.StrictModeCOnfig;

QdrantClient client =
    new QdrantClient(QdrantGrpcClient.newBuilder("localhost", 6334, false).build());

client
    .createCollectionAsync(
        CreateCollection.newBuilder()
            .setCollectionName("{collection_name}")
            .setStrictModeConfig(
                StrictModeConfig.newBuilder().setEnabled(true).setUnindexedFilteringRetrieve(false).build())
            .build())
    .get();
using Qdrant.Client;
using Qdrant.Client.Grpc;

var client = new QdrantClient("localhost", 6334);

await client.CreateCollectionAsync(
  collectionName: "{collection_name}",
  strictModeConfig: new StrictModeConfig { enabled = true, unindexed_filtering_retrieve = false }
);
import (
  "context"

  "github.com/qdrant/go-client/qdrant"
)

client, err := qdrant.NewClient(&qdrant.Config{
  Host: "localhost",
  Port: 6334,
})

client.CreateCollection(context.Background(), &qdrant.CreateCollection{
  CollectionName: "{collection_name}",
  StrictModeConfig: &qdrant.StrictModeConfig{
    Enabled: qdrant.PtrOf(true),
    IndexingThreshold: qdrant.PtrOf(false),
  },
})

Или включите его позже для существующей коллекции через API обновления коллекции:

PATCH /collections/{collection_name}
{
    "strict_mode_config": {
        "enabled": true,
        "unindexed_filtering_retrieve": false
    }
}
curl -X PATCH http://localhost:6333/collections/{collection_name} \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "strict_mode_config": {
        "enabled": true,
        "unindexed_filtering_retrieve": false
    }
  }'
from qdrant_client import QdrantClient, models

client = QdrantClient(url="http://localhost:6333")

client.update_collection(
    collection_name="{collection_name}",
    strict_mode_config=models.StrictModeConfig(enabled=True, unindexed_filtering_retrieve=False),
)
import { QdrantClient } from "@qdrant/js-client-rest";

const client = new QdrantClient({ host: "localhost", port: 6333 });

client.updateCollection("{collection_name}", {
  strict_mode_config: {
    enabled: true,
    unindexed_filtering_retrieve: false,
  },
});
use qdrant_client::qdrant::{StrictModeConfigBuilder, UpdateCollectionBuilder};

client
    .update_collection(
        UpdateCollectionBuilder::new("{collection_name}").strict_mode_config(
            StrictModeConfigBuilder::default().enabled(true).unindexed_filtering_retrieve(false),
        ),
    )
    .await?;
import io.qdrant.client.grpc.Collections.StrictModeConfigBuilder;
import io.qdrant.client.grpc.Collections.UpdateCollection;

client.updateCollectionAsync(
    UpdateCollection.newBuilder()
        .setCollectionName("{collection_name}")
        .setStrictModeConfig(
            StrictModeConfig.newBuilder().setEnabled(true).setUnindexedFilteringRetrieve(false).build())
        .build());
using Qdrant.Client;
using Qdrant.Client.Grpc;

var client = new QdrantClient("localhost", 6334);

await client.UpdateCollectionAsync(
  collectionName: "{collection_name}",
  strictModeConfig: new StrictModeConfig { Enabled = true, UnindexedFilteringRetrieve = false }
);
import (
  "context"

  "github.com/qdrant/go-client/qdrant"
)

client, err := qdrant.NewClient(&qdrant.Config{
  Host: "localhost",
  Port: 6334,
})

client.UpdateCollection(context.Background(), &qdrant.UpdateCollection{
  CollectionName: "{collection_name}",
  StrictModeConfig: &qdrant.StrictModeConfig{
    Enabled: qdrant.PtrOf(true),
    UnindexedFilteringRetrieve: qdrant.PtrOf(false),
  },
})

Для полного отключения строгого режима на существующей коллекции используйте:

PATCH /collections/{collection_name}
{
    "strict_mode_config": {
        "enabled": false
    }
}
curl -X PATCH http://localhost:6333/collections/{collection_name} \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "strict_mode_config": {
        "enabled": false,
    }
  }'
from qdrant_client import QdrantClient, models

client = QdrantClient(url="http://localhost:6333")

client.update_collection(
    collection_name="{collection_name}",
    strict_mode_config=models.StrictModeConfig(enabled=False),
)
import { QdrantClient } from "@qdrant/js-client-rest";

const client = new QdrantClient({ host: "localhost", port: 6333 });

client.updateCollection("{collection_name}", {
  strict_mode_config: {
    enabled: false,
  },
});
use qdrant_client::qdrant::{StrictModeConfigBuilder, UpdateCollectionBuilder};

client
    .update_collection(
        UpdateCollectionBuilder::new("{collection_name}").strict_mode_config(
            StrictModeConfigBuilder::default().enabled(false),
        ),
    )
    .await?;
import io.qdrant.client.grpc.Collections.StrictModeConfigBuilder;
import io.qdrant.client.grpc.Collections.UpdateCollection;

client.updateCollectionAsync(
    UpdateCollection.newBuilder()
        .setCollectionName("{collection_name}")
        .setStrictModeConfig(
            StrictModeConfig.newBuilder().setEnabled(false).build())
        .build());
using Qdrant.Client;
using Qdrant.Client.Grpc;

var client = new QdrantClient("localhost", 6334);

await client.UpdateCollectionAsync(
  collectionName: "{collection_name}",
  strictModeConfig: new StrictModeConfig { Enabled = false }
);
import (
  "context"

  "github.com/qdrant/go-client/qdrant"
)

client, err := qdrant.NewClient(&qdrant.Config{
  Host: "localhost",
  Port: 6334,
})

client.UpdateCollection(context.Background(), &qdrant.UpdateCollection{
  CollectionName: "{collection_name}",
  StrictModeConfig: &qdrant.StrictModeConfig{
        Enabled: qdrant.PtrOf(false),
  },
})

Результат#

Сценарий

Результат

Запрет фильтрации

Клиенты не смогут выполнять фильтрацию по полям без индекса

Ограничение пакетов

Превышение максимального размера пакета приведет к ошибке

Контроль объема коллекции

Добавление новых данных блокируется при достижении лимита

Динамическое управление

Включение/выключение строгого режима выполняется без перезапуска сервиса

Ошибка клиента

При нарушении ограничений сервер возвращает ошибку с описанием причины

Важные замечания:

  • Наследование настроек: строгий режим применяется только к указанной коллекции. Для других коллекций требуется отдельная настройка.

  • Индексация полей: для использования фильтрации по полезной нагрузке необходимо создать индексы заранее.

  • Производительность: строгий режим снижает риск деградации производительности, но требует корректной настройки лимитов.