Создание коллекции с несколькими векторами#

Возможно наличие нескольких векторов на запись. Данная особенность позволяет хранить несколько хранилищ векторов в рамках одной коллекции. Для различия векторов в одной записи им нужно задать уникальное имя при создании коллекции. Каждый именованный вектор в этом режиме имеет свое собственное расстояние и размер.

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

  1. Присутствует поддержка нескольких векторов в одной точке.

  2. Указаны уникальные имена для каждого вектора.

  3. Установлен клиентский SDK или присутствует доступ к HTTP/REST API Qdrant.

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

Выполните:

PUT /collections/{collection_name}
{
    "vectors": {
        "image": {
            "size": 4,
            "distance": "Dot"
        },
        "text": {
            "size": 8,
            "distance": "Cosine"
        }
    }
}
curl -X PUT http://localhost:6333/collections/{collection_name} \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "vectors": {
        "image": {
            "size": 4,
            "distance": "Dot"
        },
        "text": {
            "size": 8,
            "distance": "Cosine"
        }
      }
    }'
from qdrant_client import QdrantClient, models


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

client.create_collection(
    collection_name="{collection_name}",
    vectors_config={
        "image": models.VectorParams(size=4, distance=models.Distance.DOT),
        "text": models.VectorParams(size=8, distance=models.Distance.COSINE),
    },
)
import { QdrantClient } from "@qdrant/js-client-rest";

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

client.createCollection("{collection_name}", {
  vectors: {
    image: { size: 4, distance: "Dot" },
    text: { size: 8, distance: "Cosine" },
  },
});
use qdrant_client::Qdrant;
use qdrant_client::qdrant::{
    CreateCollectionBuilder, Distance, VectorParamsBuilder, VectorsConfigBuilder,
};

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

let mut vectors_config = VectorsConfigBuilder::default();
vectors_config
    .add_named_vector_params("image", VectorParamsBuilder::new(4, Distance::Dot).build());
vectors_config.add_named_vector_params(
    "text",
    VectorParamsBuilder::new(8, Distance::Cosine).build(),
);

client
    .create_collection(
        CreateCollectionBuilder::new("{collection_name}").vectors_config(vectors_config),
    )
    .await?;
import java.util.Map;

import io.qdrant.client.QdrantClient;
import io.qdrant.client.QdrantGrpcClient;
import io.qdrant.client.grpc.Collections.Distance;
import io.qdrant.client.grpc.Collections.VectorParams;

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

client
    .createCollectionAsync(
        "{collection_name}",
        Map.of(
            "image", VectorParams.newBuilder().setSize(4).setDistance(Distance.Dot).build(),
            "text",
                VectorParams.newBuilder().setSize(8).setDistance(Distance.Cosine).build()))
    .get();
using Qdrant.Client;
using Qdrant.Client.Grpc;

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

await client.CreateCollectionAsync(
  collectionName: "{collection_name}",
  vectorsConfig: new VectorParamsMap
  {
      Map =
      {
         ["image"] = new VectorParams { Size = 4, Distance = Distance.Dot },
         ["text"] = new VectorParams { Size = 8, Distance = Distance.Cosine },
      }
  }
);
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}",
  VectorsConfig: qdrant.NewVectorsConfigMap(
      map[string]*qdrant.VectorParams{
          "image": {
              Size:     4,
              Distance: qdrant.Distance_Dot,
          },
          "text": {
              Size:     8,
              Distance: qdrant.Distance_Cosine,
          },
      }),
})

В редких случаях возможно создание коллекции вообще без какого-либо хранилища векторов.

Для каждого именованного вектора можно дополнительно указать параметр индексирования hnsw_config (подробнее рассмотрено в разделе Индексирование) или квантования quantization_config (подробнее рассмотрено в разделе Квантование), чтобы отклониться от конфигурации коллекции. Это может быть полезно для тонкой настройки производительности поиска на уровне отдельных векторов.

Все векторы находятся в оперативной памяти для очень быстрого доступа. На уровне отдельного вектора можно установить параметр on_disk равным true, чтобы постоянно сохранять все векторы на диске. Это активирует использование хранилища Memmaps, что удобно для загрузки больших объемов данных. Подробнее о хранилище представлено в разделе Настройка хранилища документа Руководство администрирования.

Результат#

Коллекция будет содержать два именованных вектора:

  • image с размером 4 и метрикой Dot.

  • text с размером 8 и метрикой Cosine`.

Это позволит хранить разнородные данные в одной точке.