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

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

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

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

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

Обзор

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

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

Совет

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

Совет

Для альтернативы определению собственной модели данных см. сведения об использовании абстракций Vector Store без определения собственной модели данных.

Ниже приведен пример модели, украшенной этими атрибутами.

using Microsoft.Extensions.VectorData;

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

    [VectorStoreData(IsIndexed = true)]
    public string HotelName { get; set; }

    [VectorStoreData(IsFullTextIndexed = true)]
    public string Description { get; set; }

    [VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }

    [VectorStoreData(IsIndexed = true)]
    public string[] Tags { get; set; }
}

Атрибуты

VectorStoreKeyAttribute

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

[VectorStoreKey]
public ulong HotelId { get; set; }

Параметры VectorStoreKeyAttribute

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

Совет

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

VectorStoreDataAttribute

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

[VectorStoreData(IsIndexed = true)]
public string HotelName { get; set; }

Параметры VectorStoreDataAttribute

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

Совет

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

VectorStoreVectorAttribute

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

[VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }

Также можно использовать VectorStoreVectorAttribute свойства, которые не имеют векторного типа, например свойство типа string. Когда свойство декорируется таким образом, Microsoft.Exntesions.AI.IEmbeddingGenerator экземпляр должен быть предоставлен в хранилище векторов. При изменении записи текст, который находится в свойстве, автоматически преобразуется в string вектор и сохраняется в качестве вектора в базе данных. Невозможно получить вектор с помощью этого механизма.

[VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public string DescriptionEmbedding { get; set; }

Совет

Дополнительные сведения об использовании встроенного поколения внедрения см. в статье "Разрешение векторного хранилища создавать внедрения".

Параметры VectorStoreVectorAttribute

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

Распространенные типы индексов и типы функций расстояния предоставляются в виде статических значений Microsoft.SemanticKernel.Data.IndexKind в классах и Microsoft.SemanticKernel.Data.DistanceFunction классах. Отдельные реализации векторного хранилища также могут использовать собственные типы индексов и функции расстояния, где база данных поддерживает необычные типы.

Совет

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

Все методы для upsert или получения записей используют класс и определение записи векторного хранилища.

Это можно сделать, определив собственный класс с заметками для полей или используя класс или тип в сочетании с определением записи. Для класса необходимо сделать два действия, первое — добавить заметки с типами полей, второй — декорировать класс декоратором vectorstoremodel .

Совет

Альтернативный подход с использованием определения записи см. в определении схемы с определением записи.

Ниже приведен пример модели, украшенной этими заметками.

from dataclasses import dataclass, field
from typing import Annotated
from semantic_kernel.data import (
    DistanceFunction,
    IndexKind,
    VectorStoreRecordDataField,
    VectorStoreRecordDefinition,
    VectorStoreRecordKeyField,
    VectorStoreRecordVectorField,
    vectorstoremodel,
)

@vectorstoremodel
@dataclass
class Hotel:
    hotel_id: Annotated[str, VectorStoreRecordKeyField()] = field(default_factory=lambda: str(uuid4()))
    hotel_name: Annotated[str, VectorStoreRecordDataField(is_filterable=True)]
    description: Annotated[str, VectorStoreRecordDataField(is_full_text_searchable=True)]
    description_embedding: Annotated[list[float], VectorStoreRecordVectorField(dimensions=4, distance_function=DistanceFunction.COSINE, index_kind=IndexKind.HNSW)]
    tags: Annotated[list[str], VectorStoreRecordDataField(is_filterable=True)]

Совет

Определение класса с помощью этих заметок можно сделать несколькими способами, одним из которых является использование dataclasses модуля в Python, показанного здесь. В этом примере также показаны другие подходы (с помощью Pydantic BaseModels и ванильного python-классов).

Заметки

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

VectorStoreRecordField

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

Параметры VectorStoreRecordField

Параметр Обязательное поле Описание
имя нет Можно добавить напрямую, но при синтаксическом анализе модели.
property_type нет Должен быть строкой, также будет производным во время синтаксического анализа.

Совет

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

hotel_id: Annotated[str, VectorStoreRecordKeyField]

VectorStoreRecordKeyField

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

VectorStoreRecordKeyField()

Параметры VectorStoreRecordKeyField

Другие параметры за пределами базового класса не определены.

VectorStoreRecordDataField

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

VectorStoreRecordDataField(is_filterable=True)

Параметры VectorStoreRecordDataField

Параметр Обязательное поле Описание
has_embedding нет Указывает, имеет ли свойство встраивание, связанное с ним, значение по умолчанию — None.
embedding_property_name нет Имя свойства, содержащего внедрение, по умолчанию — None.
is_filterable нет Указывает, следует ли индексировать свойство для фильтрации в случаях, когда для базы данных требуется использовать индексирование для каждого свойства. По умолчанию — false.
is_full_text_searchable нет Указывает, следует ли индексировать свойство для полнотекстового поиска баз данных, поддерживающих полнотекстовый поиск. По умолчанию — false.

VectorStoreRecordVectorField

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

VectorStoreRecordVectorField(dimensions=4, distance_function=DistanceFunction.COSINE, index_kind=IndexKind.HNSW)

Параметры VectorStoreRecordVectorField

Параметр Обязательное поле Описание
размеры Да для создания коллекции, необязательно в противном случае Число измерений, которые имеет вектор. Обычно это необходимо при создании векторного индекса для коллекции.
index_kind нет Тип индекса для индексирования вектора. Значение по умолчанию зависит от типа векторного хранилища.
distance_function нет Тип функции, используемой при сравнении векторов во время векторного поиска по этому вектору. Значение по умолчанию зависит от типа векторного хранилища.
local_embedding нет Указывает, имеет ли свойство локальную внедренную связь с ним, значение по умолчанию — None.
embedding_settings нет Параметры внедрения в виде дикта с service_id в качестве ключа и PromptExecutionSettings в качестве значения по умолчанию — None.
serialize_function нет Функция, используемая для сериализации вектора, если тип не является списком[float | int] этой функцией, или необходимо сериализовать всю модель.
deserialize_function нет Функция, используемая для десериализации вектора, если тип не является списком[float | int] этой функцией, или необходимо десериализировать всю модель.

Распространенные типы индексов и типы функций расстояния предоставляются в виде статических значений semantic_kernel.data.IndexKind в классах и semantic_kernel.data.DistanceFunction классах. Отдельные реализации векторного хранилища также могут использовать собственные типы индексов и функции расстояния, где база данных поддерживает необычные типы.

Все методы для upsert или получения записей используют строго типизированные классы моделей. Поля этих классов украшены заметками, указывающими назначение каждого поля.

Совет

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

Ниже приведен пример модели, украшенной этими заметками. По умолчанию большинство векторных векторов коробки используют Джексон, поэтому рекомендуется, чтобы объект модели можно сериализовать Джексоном, т. е. класс виден, имеет методы получения, конструктор, заметки и т. д.

import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordData;
import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordKey;
import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordVector;
import com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction;
import com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind;

import java.util.List;

public class Hotel {
    @VectorStoreRecordKey
    private String hotelId;

    @VectorStoreRecordData(isFilterable = true)
    private String name;

    @VectorStoreRecordData(isFullTextSearchable = true)
    private String description;

    @VectorStoreRecordVector(dimensions = 4, indexKind = IndexKind.HNSW, distanceFunction = DistanceFunction.COSINE_DISTANCE)
    private List<Float> descriptionEmbedding;

    @VectorStoreRecordData(isFilterable = true)
    private List<String> tags;

    public Hotel() { }

    public Hotel(String hotelId, String name, String description, List<Float> descriptionEmbedding, List<String> tags) {
        this.hotelId = hotelId;
        this.name = name;
        this.description = description;
        this.descriptionEmbedding = descriptionEmbedding;
        this.tags = tags;
    }

    public String getHotelId() { return hotelId; }
    public String getName() { return name; }
    public String getDescription() { return description; }
    public List<Float> getDescriptionEmbedding() { return descriptionEmbedding; }
    public List<String> getTags() { return tags; }
}

Заметки

VectorStoreRecordKey

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

@VectorStoreRecordKey
private String hotelId;

Параметры VectorStoreRecordKey

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

Совет

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

VectorStoreRecordData

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

@VectorStoreRecordData(isFilterable = true)
private String name;

Параметры VectorStoreRecordData

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

Совет

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

VectorStoreRecordVector

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

@VectorStoreRecordVector(dimensions = 4, indexKind = IndexKind.HNSW, distanceFunction = DistanceFunction.COSINE_DISTANCE)
private List<Float> descriptionEmbedding;

Параметры VectorStoreRecordVector

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

Общие типы индексов и типы функций расстояния предоставляются в com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind перечислениях и com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction перечислениях. Отдельные реализации векторного хранилища также могут использовать собственные типы индексов и функции расстояния, где база данных поддерживает необычные типы.

Совет

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

Дополнительные сведения в ближайшее время.