Compartilhar via


Definindo seu modelo de dados (versão prévia)

Aviso

A funcionalidade do Repositório de Vetores do Kernel Semântico está em versão prévia e as melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Visão geral

Os conectores do Repositório de Vetores do Kernel Semântico usam uma abordagem de primeiro modelo para interagir com bancos de dados.

Todos os métodos para upsert ou obter registros usam classes de modelo fortemente tipadas. As propriedades nessas classes são decoradas com atributos que indicam a finalidade de cada propriedade.

Dica

Para obter uma alternativa ao uso de atributos, consulte definição do esquema com uma definição de registro.

Dica

Para obter uma alternativa para definir seu próprio modelo de dados, consulte o uso de abstrações do Repositório de vetores sem definir seu próprio modelo de dados.

Aqui está um exemplo de um modelo decorado com esses atributos.

using Microsoft.Extensions.VectorData;

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

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

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

    [VectorStoreRecordVector(4, DistanceFunction.CosineDistance, IndexKind.Hnsw)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }

    [VectorStoreRecordData(IsFilterable = true)]
    public string[] Tags { get; set; }
}

Atributos

VectorStoreRecordKeyAttribute

Use esse atributo para indicar que sua propriedade é a chave do registro.

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

Parâmetros VectorStoreRecordKeyAttribute

Parâmetro Obrigatório Descrição
StoragePropertyName Não Pode ser usado para fornecer um nome alternativo para a propriedade no banco de dados. Observe que esse parâmetro não é compatível com todos os conectores, por exemplo, onde alternativas como JsonPropertyNameAttribute são suportadas.

Dica

Para obter mais informações sobre quais conectores dão suporte a StoragePropertyName e quais alternativas estão disponíveis, consulte a documentação de cada conector.

VectorStoreRecordDataAttribute

Use esse atributo para indicar que sua propriedade contém dados gerais que não são uma chave ou um vetor.

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

Parâmetros VectorStoreRecordDataAttribute

Parâmetro Obrigatório Descrição
IsFilterable Não Indica se a propriedade deve ser indexada para filtragem nos casos em que um banco de dados requer a aceitação da indexação por propriedade. Padrão é false
ÉFullTextSearchable Não Indica se a propriedade deve ser indexada para pesquisa de texto completo para bancos de dados que dão suporte à pesquisa de texto completo. Padrão é false
StoragePropertyName Não Pode ser usado para fornecer um nome alternativo para a propriedade no banco de dados. Observe que esse parâmetro não é compatível com todos os conectores, por exemplo, onde alternativas como JsonPropertyNameAttribute são suportadas.

Dica

Para obter mais informações sobre quais conectores dão suporte a StoragePropertyName e quais alternativas estão disponíveis, consulte a documentação de cada conector.

VectorStoreRecordVectorAttribute

Use esse atributo para indicar que sua propriedade contém um vetor.

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

Parâmetros VectorStoreRecordVectorAttribute

Parâmetro Obrigatório Descrição
Dimensões Sim para criação de coleção, caso contrário, opcional O número de dimensões que o vetor tem. Isso normalmente é necessário ao criar um índice de vetor para uma coleção.
IndexKind Não O tipo de índice com o qual indexar o vetor. O padrão varia de acordo com o tipo de repositório de vetores.
Função de distância Não O tipo de função de distância a ser usada ao fazer a comparação de vetores durante a pesquisa vetorial sobre esse vetor. O padrão varia de acordo com o tipo de repositório de vetores.
StoragePropertyName Não Pode ser usado para fornecer um nome alternativo para a propriedade no banco de dados. Observe que esse parâmetro não é compatível com todos os conectores, por exemplo, onde alternativas como JsonPropertyNameAttribute são suportadas.

Tipos de índice comuns e tipos de função de distância são fornecidos como valores estáticos nas Microsoft.SemanticKernel.Data.IndexKind classes e Microsoft.SemanticKernel.Data.DistanceFunction . As implementações individuais do Repositório de Vetores também podem usar seus próprios tipos de índice e funções de distância, em que o banco de dados dá suporte a tipos incomuns.

Dica

Para obter mais informações sobre quais conectores dão suporte a StoragePropertyName e quais alternativas estão disponíveis, consulte a documentação de cada conector.

Todos os métodos para upsert ou get records usam uma classe e uma definição de registro de armazenamento de vetor.

Isso pode ser feito definindo sua própria classe com anotações para os campos ou usando uma classe/tipo em combinação com uma definição de registro. Duas coisas precisam ser feitas para uma classe, a primeira é adicionar as anotações com os tipos de campo, a segunda é decorar a classe com o vectorstoremodel decorador.

Dica

Para obter a abordagem alternativa usando uma definição de registro, consulte definição do esquema com uma definição de registro.

Aqui está um exemplo de um modelo decorado com essas anotações.

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)]

Dica

A definição de uma classe com essas anotações pode ser feita de várias maneiras, uma das quais é usando o dataclasses módulo em Python, mostrado aqui. Este exemplo mostra outras abordagens (usando Pydantic BaseModels e classes vanilla python) também.

Anotações

Há três tipos de anotações a serem usadas e elas têm uma classe base comum.

VectorStoreRecordField

Esta é a classe base para todas as anotações, não deve ser usada diretamente.

Parâmetros VectorStoreRecordField

Parâmetro Obrigatório Descrição
name Não Pode ser adicionado diretamente, mas será definido durante a análise do modelo.
property_type Não Deve ser uma string, também será derivada durante a análise.

Dica

As anotações são analisadas pelo vectorstoremodel decorador e uma das coisas que ele faz é criar uma definição de registro para a classe, portanto, não é necessário instanciar uma classe de campo quando nenhum parâmetro é definido, o campo pode ser anotado apenas com a classe, assim:

hotel_id: Annotated[str, VectorStoreRecordKeyField]

VectorStoreRecordKeyField

Use essa anotação para indicar que esse atributo é a chave do registro.

VectorStoreRecordKeyField()

Parâmetros VectorStoreRecordKeyField

Nenhum outro parâmetro fora da classe base é definido.

VectorStoreRecordDataField

Use essa anotação para indicar que seu atributo contém dados gerais que não são uma chave ou um vetor.

VectorStoreRecordDataField(is_filterable=True)

Parâmetros VectorStoreRecordDataField

Parâmetro Obrigatório Descrição
has_embedding Não Indica se a propriedade tem uma inserção associada a ela, o padrão é Nenhum.
embedding_property_name Não O nome da propriedade que contém a inserção, o padrão é Nenhum.
is_filterable Não Indica se a propriedade deve ser indexada para filtragem nos casos em que um banco de dados requer a aceitação da indexação por propriedade. Padrão é false
is_full_text_searchable Não Indica se a propriedade deve ser indexada para pesquisa de texto completo para bancos de dados que dão suporte à pesquisa de texto completo. Padrão é false

VectorStoreRecordVectorField

Use essa anotação para indicar que seu atributo contém um vetor.

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

Parâmetros VectorStoreRecordVectorField

Parâmetro Obrigatório Descrição
dimensões Sim para criação de coleção, caso contrário, opcional O número de dimensões que o vetor tem. Isso normalmente é necessário ao criar um índice de vetor para uma coleção.
index_kind Não O tipo de índice com o qual indexar o vetor. O padrão varia de acordo com o tipo de repositório de vetores.
distance_function Não O tipo de função de distância a ser usada ao fazer a comparação de vetores durante a pesquisa vetorial sobre esse vetor. O padrão varia de acordo com o tipo de repositório de vetores.
local_embedding Não Indica se a propriedade tem uma inserção local associada a ela, o padrão é Nenhum.
embedding_settings Não As configurações para a inserção, na forma de um dicionário com service_id como chave e PromptExecutionSettings como valor, o padrão é Nenhum.
serialize_function Não A função a ser usada para serializar o vetor, se o tipo não for uma lista[float | int], essa função será necessária ou todo o modelo precisará ser serializado.
deserialize_function Não A função a ser usada para desserializar o vetor, se o tipo não for uma lista[float | int], essa função será necessária ou todo o modelo precisará ser desserializado.

Tipos de índice comuns e tipos de função de distância são fornecidos como valores estáticos nas semantic_kernel.data.IndexKind classes e semantic_kernel.data.DistanceFunction . As implementações individuais do Repositório de Vetores também podem usar seus próprios tipos de índice e funções de distância, em que o banco de dados dá suporte a tipos incomuns.

Todos os métodos para upsert ou obter registros usam classes de modelo fortemente tipadas. Os campos nessas classes são decorados com anotações que indicam a finalidade de cada campo.

Dica

Para obter uma alternativa ao uso de atributos, consulte definição do esquema com uma definição de registro.

Aqui está um exemplo de um modelo decorado com essas anotações. Por padrão, a maioria dos armazenamentos de vetores prontos para uso usa Jackson, portanto, é uma boa prática garantir que o objeto de modelo possa ser serializado por Jackson, ou seja, a classe é visível, tem getters, construtor, anotações, etc.

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; }
}

Anotações

VectorStoreRecordKey

Use essa anotação para indicar que seu campo é a chave do registro.

@VectorStoreRecordKey
private String hotelId;

Parâmetros VectorStoreRecordKey

Parâmetro Obrigatório Descrição
storageName Não Pode ser usado para fornecer um nome alternativo para o campo no banco de dados. Observe que esse parâmetro não é suportado por todos os conectores, por exemplo, onde Jackson é usado, nesse caso, o nome de armazenamento pode ser especificado usando anotações Jackson.

Dica

Para obter mais informações sobre quais conectores dão suporte a storageName e quais alternativas estão disponíveis, consulte a documentação de cada conector.

VectorStoreRecordData

Use essa anotação para indicar que seu campo contém dados gerais que não são uma chave ou um vetor.

@VectorStoreRecordData(isFilterable = true)
private String name;

Parâmetros VectorStoreRecordData

Parâmetro Obrigatório Descrição
isFiltrável Não Indica se o campo deve ser indexado para filtragem nos casos em que um banco de dados requer a aceitação da indexação por campo. Padrão é false
isFullTextSearchable Não Indica se o campo deve ser indexado para pesquisa de texto completo para bancos de dados que dão suporte à pesquisa de texto completo. Padrão é false
storageName Não Pode ser usado para fornecer um nome alternativo para o campo no banco de dados. Observe que esse parâmetro não é suportado por todos os conectores, por exemplo, onde Jackson é usado, nesse caso, o nome de armazenamento pode ser especificado usando anotações Jackson.

Dica

Para obter mais informações sobre quais conectores dão suporte a storageName e quais alternativas estão disponíveis, consulte a documentação de cada conector.

VectorStoreRecordVector

Use essa anotação para indicar que seu campo contém um vetor.

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

Parâmetros VectorStoreRecordVector

Parâmetro Obrigatório Descrição
dimensões Sim para criação de coleção, caso contrário, opcional O número de dimensões que o vetor tem. Isso normalmente é necessário ao criar um índice de vetor para uma coleção.
tipo de índice Não O tipo de índice com o qual indexar o vetor. O padrão varia de acordo com o tipo de repositório de vetores.
função distância Não O tipo de função de distância a ser usada ao fazer a comparação de vetores durante a pesquisa vetorial sobre esse vetor. O padrão varia de acordo com o tipo de repositório de vetores.
storageName Não Pode ser usado para fornecer um nome alternativo para o campo no banco de dados. Observe que esse parâmetro não é suportado por todos os conectores, por exemplo, onde Jackson é usado, nesse caso, o nome de armazenamento pode ser especificado usando anotações Jackson.

Tipos de índice comuns e tipos de função de distância são fornecidos nas com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind enumerações e com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction . As implementações individuais do Repositório de Vetores também podem usar seus próprios tipos de índice e funções de distância, em que o banco de dados dá suporte a tipos incomuns.

Dica

Para obter mais informações sobre quais conectores dão suporte a storageName e quais alternativas estão disponíveis, consulte a documentação de cada conector.

Mais informações em breve.