Поделиться через


Использование соединителя Qdrant (предварительная версия)

Предупреждение

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

Обзор

Соединитель Qdrant Vector Store можно использовать для доступа к данным qdrant и управления ими. Соединитель имеет следующие характеристики.

Область функций Поддержка
Коллекция сопоставляется с Сбор Qdrant с индексами полезных данных для полей с фильтруемыми данными
Поддерживаемые типы свойств ключей
  • ulong
  • GUID
Поддерживаемые типы свойств данных
  • строка
  • INT
  • длинный
  • двойной точности
  • с плавающей запятой
  • bool
  • и перечисление каждого из этих типов
Поддерживаемые типы свойств вектора ReadOnlyMemory<float>
Поддерживаемые типы индексов Hnsw
Поддерживаемые функции расстояния
  • CosineSimilarity
  • DotProductSimilarity
  • EuclideanDistance
  • МанхэттенDistance
Поддержка нескольких векторов в записи Да (настраиваемая)
Поддерживается IsFilterable? Да
Поддерживается ЛиFullTextSearchable? Да
Поддерживается StoragePropertyName? Да

Начало работы

Добавьте в проект пакет NuGet соединителя Qdrant Vector Store.

dotnet add package Microsoft.SemanticKernel.Connectors.Qdrant --prerelease

Хранилище векторов можно добавить в контейнер внедрения зависимостей, доступный в KernelBuilder контейнере внедрения зависимостей или в IServiceCollection контейнер внедрения зависимостей, используя методы расширения, предоставляемые семантического ядра.

using Microsoft.SemanticKernel;

// Using Kernel Builder.
var kernelBuilder = Kernel
    .CreateBuilder()
    .AddQdrantVectorStore("localhost");
using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddQdrantVectorStore("localhost");

Методы расширения, которые не принимают параметров, также предоставляются. Для них требуется, чтобы экземпляр Qdrant.Client.QdrantClient класса был отдельно зарегистрирован в контейнере внедрения зависимостей.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Qdrant.Client;

// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.Services.AddSingleton<QdrantClient>(sp => new QdrantClient("localhost"));
kernelBuilder.AddQdrantVectorStore();
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Qdrant.Client;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<QdrantClient>(sp => new QdrantClient("localhost"));
builder.Services.AddQdrantVectorStore();

Вы можете создать экземпляр хранилища Векторов Qdrant напрямую.

using Microsoft.SemanticKernel.Connectors.Qdrant;
using Qdrant.Client;

var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"));

Можно создать прямую ссылку на именованную коллекцию.

using Microsoft.SemanticKernel.Connectors.Qdrant;
using Qdrant.Client;

var collection = new QdrantVectorStoreRecordCollection<Hotel>(
    new QdrantClient("localhost"),
    "skhotels");

Сопоставление данных

Соединитель Qdrant предоставляет схему по умолчанию при сопоставлении данных из модели данных в хранилище. Qdrant требует, чтобы свойства сопоставлялись с идентификаторами, полезными данными и группами векторов. Средство сопоставления по умолчанию использует заметки модели или определение записи для определения типа каждого свойства и для этого сопоставления.

  • Свойство модели данных, аннотированное как ключ, будет сопоставлено с идентификатором точки Qdrant.
  • Свойства модели данных, аннотированные как данные будут сопоставлены с объектом полезных данных точки Qdrant.
  • Свойства модели данных, аннотированные как векторы, будут сопоставлены с объектом вектора точки Qdrant.

Переопределение имени свойства

Для свойств данных и векторных свойств (если используется режим именованных векторов), можно указать переопределение имен полей для использования в хранилище, которое отличается от имен свойств в модели данных. Это не поддерживается для ключей, так как ключ имеет фиксированное имя в Qdrant. Он также не поддерживается для векторов в одном режиме без именованных векторов , так как вектор хранится под фиксированным именем.

Переопределение имени свойства выполняется путем задания StoragePropertyName параметра с помощью атрибутов модели данных или определения записи.

Ниже приведен пример модели данных с StoragePropertyName набором атрибутов и способом представления в Qdrant.

using Microsoft.Extensions.VectorData;

public class Hotel
{
    [VectorStoreRecordKey]
    public ulong HotelId { get; set; }

    [VectorStoreRecordData(IsFilterable = true, StoragePropertyName = "hotel_name")]
    public string HotelName { get; set; }

    [VectorStoreRecordData(IsFullTextSearchable = true, StoragePropertyName = "hotel_description")]
    public string Description { get; set; }

    [VectorStoreRecordVector(4, DistanceFunction.CosineDistance, IndexKind.Hnsw, StoragePropertyName = "hotel_description_embedding")]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
{
    "id": 1,
    "payload": { "hotel_name": "Hotel Happy", "hotel_description": "A place where everyone can be happy." },
    "vector": {
        "hotel_description_embedding": [0.9, 0.1, 0.1, 0.1],
    }
}

Начало работы

Установите семантический ядро с дополнительными компонентами qdrant, включая клиент qdrant.

pip install semantic-kernel[qdrant]

Затем можно создать экземпляр векторного хранилища с помощью класса, создав AsyncQdrantClient с помощью переменных среды, , QDRANT_API_KEY, QDRANT_HOSTQDRANT_LOCATION QDRANT_GRPC_PORTQDRANT_PREFER_GRPS QDRANT_PORTQDRANT_PATH, и для подключения к экземпляру Qdrant, эти значения также можно предоставить напрямую.QDRANT_URLQdrantStore Если ничего не поставляется, он возвращается.location=:memory:


from semantic_kernel.connectors.memory.qdrant import QdrantStore

vector_store = QdrantStore()

Вы также можете создать хранилище векторов с собственным экземпляром клиента qdrant.

from qdrant_client.async_qdrant_client import AsyncQdrantClient
from semantic_kernel.connectors.memory.qdrant import QdrantStore

client = AsyncQdrantClient(host='localhost', port=6333)
vector_store = QdrantStore(client=client)

Вы также можете создать коллекцию напрямую.

from semantic_kernel.connectors.memory.qdrant import QdrantCollection

collection = QdrantCollection(collection_name="skhotels", data_model_type=hotel)

Сериализация

Соединитель Qdrant использует модель, вызванную PointStruct для чтения и записи в хранилище. Это можно импортировать из from qdrant_client.models import PointStruct. Методы сериализации ожидают выходные данные списка объектов PointStruct, а метод десериализации получает список объектов PointStruct.

Существуют некоторые особые соображения по этому вопросу, которые связаны с именованными или неназванными векторами, см. ниже.

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

Векторные режимы Qdrant

Qdrant поддерживает два режима для хранилища векторов, а соединитель Qdrant с картой по умолчанию поддерживает оба режима. Режим по умолчанию является одним неименованным вектором.

Один неименованный вектор

При использовании этого параметра коллекция может содержать только один вектор, и он будет неназван в модели хранения в Qdrant. Ниже приведен пример того, как объект представлен в Qdrant при использовании одного неназванного векторного режима:

new Hotel
{
    HotelId = 1,
    HotelName = "Hotel Happy",
    Description = "A place where everyone can be happy.",
    DescriptionEmbedding = new float[4] { 0.9f, 0.1f, 0.1f, 0.1f }
};
{
    "id": 1,
    "payload": { "HotelName": "Hotel Happy", "Description": "A place where everyone can be happy." },
    "vector": [0.9, 0.1, 0.1, 0.1]
}
Hotel(
    hotel_id = 1,
    hotel_name = "Hotel Happy",
    description = "A place where everyone can be happy.",
    description_embedding = [0.9f, 0.1f, 0.1f, 0.1f],
)
from qdrant_client.models import PointStruct

PointStruct(
    id=1,
    payload={ "hotel_name": "Hotel Happy", "description": "A place where everyone can be happy." },
    vector=[0.9, 0.1, 0.1, 0.1],
)

Именованные векторы

Если используется режим именованных векторов, это означает, что каждая точка в коллекции может содержать несколько векторов, и каждая из них будет называться. Ниже приведен пример представления объекта в Qdrant при использовании режима именованных векторов :

new Hotel
{
    HotelId = 1,
    HotelName = "Hotel Happy",
    Description = "A place where everyone can be happy.",
    HotelNameEmbedding = new float[4] { 0.9f, 0.5f, 0.5f, 0.5f }
    DescriptionEmbedding = new float[4] { 0.9f, 0.1f, 0.1f, 0.1f }
};
{
    "id": 1,
    "payload": { "HotelName": "Hotel Happy", "Description": "A place where everyone can be happy." },
    "vector": {
        "HotelNameEmbedding": [0.9, 0.5, 0.5, 0.5],
        "DescriptionEmbedding": [0.9, 0.1, 0.1, 0.1],
    }
}
Hotel(
    hotel_id = 1,
    hotel_name = "Hotel Happy",
    description = "A place where everyone can be happy.",
    hotel_name_embedding = [0.9f, 0.5f, 0.5f, 0.5f],
    description_embedding = [0.9f, 0.1f, 0.1f, 0.1f],
)
from qdrant_client.models import PointStruct

PointStruct(
    id=1,
    payload={ "hotel_name": "Hotel Happy", "description": "A place where everyone can be happy." },
    vector={
        "hotel_name_embedding": [0.9, 0.5, 0.5, 0.5],
        "description_embedding": [0.9, 0.1, 0.1, 0.1],
    },
)

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

using Microsoft.SemanticKernel.Connectors.Qdrant;
using Qdrant.Client;

var vectorStore = new QdrantVectorStore(
    new QdrantClient("localhost"),
    new() { HasNamedVectors = true });

var collection = new QdrantVectorStoreRecordCollection<Hotel>(
    new QdrantClient("localhost"),
    "skhotels",
    new() { HasNamedVectors = true });

В Python значение named_vectors по умолчанию — True, но это можно отключить, как показано ниже.

from semantic_kernel.connectors.memory.qdrant import QdrantCollection

collection = QdrantCollection(
    collection_name="skhotels", 
    data_model_type=Hotel, 
    named_vectors=False,
)