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


Определение схемы хранилища с помощью определения записи (предварительная версия)

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

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

Обзор

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

Другим способом предоставления этой информации является определение записей, которое можно определить и предоставить отдельно модели данных. Это может быть полезно в нескольких сценариях:

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

Ниже приведен пример создания определения записи.

using Microsoft.Extensions.VectorData;

var hotelDefinition = new VectorStoreRecordDefinition
{
    Properties = new List<VectorStoreRecordProperty>
    {
        new VectorStoreRecordKeyProperty("HotelId", typeof(ulong)),
        new VectorStoreRecordDataProperty("HotelName", typeof(string)) { IsFilterable = true },
        new VectorStoreRecordDataProperty("Description", typeof(string)) { IsFullTextSearchable = true },
        new VectorStoreRecordVectorProperty("DescriptionEmbedding", typeof(float)) { Dimensions = 4, DistanceFunction = DistanceFunction.CosineDistance, IndexKind = IndexKind.Hnsw },
    }
};

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

Чтобы использовать определение, передайте его методу GetCollection.

var collection = vectorStore.GetCollection<ulong, Hotel>("skhotels", hotelDefinition);

Классы конфигурации свойств записи

VectorStoreRecordKeyProperty

Используйте этот класс, чтобы указать, что свойство является ключом записи.

new VectorStoreRecordKeyProperty("HotelId", typeof(ulong)),

Параметры конфигурации VectorStoreRecordKeyProperty

Параметр Обязательное поле Описание
DataModelPropertyName Да Имя свойства модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
PropertyType Да Тип свойства модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
StoragePropertyName No Можно использовать для указания альтернативного имени свойства в базе данных. Обратите внимание, что этот параметр не поддерживается всеми соединителями, например, где поддерживаются альтернативные варианты JsonPropertyNameAttribute .

Совет

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

VectorStoreRecordDataProperty

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

new VectorStoreRecordDataProperty("HotelName", typeof(string)) { IsFilterable = true },

Параметры конфигурации VectorStoreRecordDataProperty

Параметр Обязательное поле Описание
DataModelPropertyName Да Имя свойства модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
PropertyType Да Тип свойства модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
IsFilterable No Указывает, следует ли индексировать свойство для фильтрации в случаях, когда для базы данных требуется использовать индексирование для каждого свойства. По умолчанию — false.
IsFullTextSearchable No Указывает, следует ли индексировать свойство для полнотекстового поиска баз данных, поддерживающих полнотекстовый поиск. По умолчанию — false.
StoragePropertyName No Можно использовать для указания альтернативного имени свойства в базе данных. Обратите внимание, что этот параметр не поддерживается всеми соединителями, например, где поддерживаются альтернативные варианты JsonPropertyNameAttribute .

Совет

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

VectorStoreRecordVectorProperty

Используйте этот класс, чтобы указать, что свойство содержит вектор.

new VectorStoreRecordVectorProperty("DescriptionEmbedding", typeof(float)) { Dimensions = 4, DistanceFunction = DistanceFunction.CosineDistance, IndexKind = IndexKind.Hnsw },

Параметры конфигурации VectorStoreRecordVectorProperty

Параметр Обязательное поле Описание
DataModelPropertyName Да Имя свойства модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
PropertyType Да Тип свойства модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
Измерения Да для создания коллекции, необязательно в противном случае Число измерений, которые имеет вектор. Обычно это необходимо при создании векторного индекса для коллекции.
IndexKind No Тип индекса для индексирования вектора. Значение по умолчанию зависит от типа векторного хранилища.
DistanceFunction No Тип функции расстояния, используемой при сравнении векторов во время векторного поиска по этому вектору. Значение по умолчанию зависит от типа векторного хранилища.
StoragePropertyName No Можно использовать для указания альтернативного имени свойства в базе данных. Обратите внимание, что этот параметр не поддерживается всеми соединителями, например, где поддерживаются альтернативные варианты JsonPropertyNameAttribute .

Совет

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

Ниже приведен пример создания определения записи для использования с кадром данных pandas.

Примечание.

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

Есть несколько важных вещей, которые следует отметить, другие, а затем определения полей сами. Первым является container_mode параметр. Если задано значение True, это означает, что модель данных является типом контейнера, например DataFrame, и что модель данных, следовательно, является контейнером записей, а не одной, запись контейнера может использоваться точно так же, основное различие заключается в том, что get и get_batch возвращает тот же тип данных. с одной записью для get одной или нескольких для get_batch. Если вы хотите сделать upsert и upsert_batch может использоваться взаимозаменяемо, upsert другими словами, передача контейнера в upsert результате нескольких upserts вместо одного.

Второй — это добавление to_dict методов и from_dict методов, которые используются для преобразования между моделью данных и схемой хранения. В этом случае to_dict метод используется для преобразования кадра данных в список записей, а from_dict метод используется для преобразования списка записей в кадр данных. Также можно использовать serialize метод и deserialize метод (не показан в приведенном ниже примере), чтобы получить подробные сведения о различиях между ними в документации по сериализации.

from semantic_kernel.data import (
    VectorStoreRecordDataField,
    VectorStoreRecordDefinition,
    VectorStoreRecordKeyField,
    VectorStoreRecordVectorField,
)

hotel_definition = VectorStoreRecordDefinition(
    fields={
        "hotel_id": VectorStoreRecordKeyField(property_type="str"),
        "hotel_name": VectorStoreRecordDataField(property_type="str", is_filterable=True),
        "description": VectorStoreRecordDataField(
            property_type="str", has_embedding=True, embedding_property_name="description_embedding"
        ),
        "description_embedding": VectorStoreRecordVectorField(property_type="list[float]"),
    },
    container_mode=True,
    to_dict=lambda record, **_: record.to_dict(orient="records"),
    from_dict=lambda records, **_: DataFrame(records),
)

При создании определения всегда необходимо указать имя (в качестве ключа в fields дикте) и ввести для каждого свойства в схеме, так как это необходимо для создания индекса и сопоставления данных.

Чтобы использовать определение, передайте его методу GetCollection или конструктору коллекции вместе с типом модели данных.

collection = vector_store.get_collection(
    collection_name="skhotels", 
    data_model_type=pd.DataFrame, 
    data_model_definition=hotel_definition,
)

Ниже приведен пример создания определения записи.

var hotelDefinition = VectorStoreRecordDefinition.fromFields(
    Arrays.asList(
        VectorStoreRecordKeyField.builder().withName("hotelId").withFieldType(String.class).build(),
        VectorStoreRecordDataField.builder()
            .withName("name")
            .withFieldType(String.class)
            .isFilterable(true).build(),
        VectorStoreRecordDataField.builder()
            .withName("description")
            .withFieldType(String.class)
            .isFullTextSearchable(true).build(),
        VectorStoreRecordVectorField.builder().withName("descriptionEmbedding")
            .withDimensions(4)
            .withIndexKind(IndexKind.HNSW)
            .withDistanceFunction(DistanceFunction.COSINE_DISTANCE)
            .withFieldType(List.class).build()
    )
);

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

Чтобы использовать определение, передайте его методу GetCollection.

var collection = vectorStore.getCollection("skhotels",
        JDBCVectorStoreRecordCollectionOptions.builder()
            .withRecordDefinition(hotelDefinition)
            .build()
    );

Классы конфигурации поля записи

VectorStoreRecordKeyField

Используйте этот класс, чтобы указать, что поле является ключом записи.

VectorStoreRecordKeyField.builder().withName("hotelId").withFieldType(String.class).build(),

Параметры конфигурации VectorStoreRecordKeyField

Параметр Обязательное поле Description
name Да Имя поля в модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
fieldType Да Тип поля в модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
storageName No Можно использовать для указания альтернативного имени поля в базе данных. Обратите внимание, что этот параметр не поддерживается всеми соединителями, например, где используется Джексон, в этом случае имя хранилища можно указать с помощью заметок Джексона.

Совет

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

VectorStoreRecordDataField

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

VectorStoreRecordDataField.builder()
    .withName("name")
    .withFieldType(String.class)
    .isFilterable(true).build(),

Параметры конфигурации VectorStoreRecordDataField

Параметр Обязательное поле Description
name Да Имя поля в модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
fieldType Да Тип поля в модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
isFilterable No Указывает, следует ли индексировать поле для фильтрации в случаях, когда для базы данных требуется выбрать индексирование для каждого поля. По умолчанию — false.
isFullTextSearchable No Указывает, следует ли индексировать поле для полнотекстового поиска баз данных, поддерживающих полнотекстовый поиск. По умолчанию — false.
storageName No Можно использовать для указания альтернативного имени поля в базе данных. Обратите внимание, что этот параметр не поддерживается всеми соединителями, например, где используется Джексон, в этом случае имя хранилища можно указать с помощью заметок Джексона.

Совет

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

VectorStoreRecordVectorField

Используйте этот класс, чтобы указать, что поле содержит вектор.

VectorStoreRecordVectorField.builder().withName("descriptionEmbedding")
    .withDimensions(4)
    .withIndexKind(IndexKind.HNSW)
    .withDistanceFunction(DistanceFunction.COSINE_DISTANCE)
    .withFieldType(List.class).build(),

Параметры конфигурации VectorStoreRecordVectorField

Параметр Обязательное поле Description
name Да Имя поля в модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
fieldType Да Тип поля в модели данных. Используется встроенными средствами сопоставления для автоматической сопоставления между схемой хранилища и моделью данных и для создания индексов.
dimensions Да для создания коллекции, необязательно в противном случае Число измерений, которые имеет вектор. Обычно это необходимо при создании векторного индекса для коллекции.
indexKind No Тип индекса для индексирования вектора. Значение по умолчанию зависит от типа векторного хранилища.
distanceFunction No Тип функции расстояния, используемой при сравнении векторов во время векторного поиска по этому вектору. Значение по умолчанию зависит от типа векторного хранилища.
storageName No Можно использовать для указания альтернативного имени поля в базе данных. Обратите внимание, что этот параметр не поддерживается всеми соединителями, например, где используется Джексон, в этом случае имя хранилища можно указать с помощью заметок Джексона.

Совет

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