Compartir a través de


Definición del modelo de datos (versión preliminar)

Advertencia

La funcionalidad Almacén de vectores de kernel semántico está en versión preliminar y las mejoras que requieren cambios importantes pueden producirse en circunstancias limitadas antes de la versión.

Información general

Los conectores de almacén de vectores de kernel semántico usan un primer enfoque de modelo para interactuar con las bases de datos.

Todos los métodos para upsert u obtener registros usan clases de modelo fuertemente tipadas. Las propiedades de estas clases están decoradas con atributos que indican el propósito de cada propiedad.

Sugerencia

Para obtener una alternativa al uso de atributos, consulte la definición del esquema con una definición de registro.

Sugerencia

Para obtener una alternativa a definir su propio modelo de datos, consulte el uso de abstracciones del almacén de vectores sin definir su propio modelo de datos.

Este es un ejemplo de un modelo decorado con estos 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 este atributo para indicar que la propiedad es la clave del registro.

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

Parámetros VectorStoreRecordKeyAttribute

Parámetro Obligatorio Descripción
StoragePropertyName No Se puede usar para proporcionar un nombre alternativo para la propiedad de la base de datos. Tenga en cuenta que todos los conectores no admiten este parámetro, por ejemplo, donde se admiten alternativas como JsonPropertyNameAttribute .

Sugerencia

Para más información sobre qué conectores admiten StoragePropertyName y qué alternativas están disponibles, consulte la documentación de cada conector.

VectorStoreRecordDataAttribute

Use este atributo para indicar que la propiedad contiene datos generales que no son una clave o un vector.

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

Parámetros VectorStoreRecordDataAttribute

Parámetro Obligatorio Descripción
IsFilterable No Indica si la propiedad debe indexarse para filtrar en casos en los que una base de datos requiere participar en la indexación por propiedad. El valor predeterminado es falso.
IsFullTextSearchable No Indica si la propiedad debe indexarse para la búsqueda de texto completo para las bases de datos que admiten la búsqueda de texto completo. El valor predeterminado es falso.
StoragePropertyName No Se puede usar para proporcionar un nombre alternativo para la propiedad de la base de datos. Tenga en cuenta que todos los conectores no admiten este parámetro, por ejemplo, donde se admiten alternativas como JsonPropertyNameAttribute .

Sugerencia

Para más información sobre qué conectores admiten StoragePropertyName y qué alternativas están disponibles, consulte la documentación de cada conector.

VectorStoreRecordVectorAttribute

Use este atributo para indicar que la propiedad contiene un vector.

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

Parámetros VectorStoreRecordVectorAttribute

Parámetro Obligatorio Descripción
Dimensiones Sí para la creación de colecciones; de lo contrario, opcional Número de dimensiones que tiene el vector. Esto suele ser necesario al crear un índice vectorial para una colección.
IndexKind No Tipo de índice con el que se indexa el vector. El valor predeterminado varía según el tipo de almacén de vectores.
DistanceFunction No Tipo de función de distancia que se va a usar al realizar la comparación vectorial durante la búsqueda de vectores sobre este vector. El valor predeterminado varía según el tipo de almacén de vectores.
StoragePropertyName No Se puede usar para proporcionar un nombre alternativo para la propiedad de la base de datos. Tenga en cuenta que todos los conectores no admiten este parámetro, por ejemplo, donde se admiten alternativas como JsonPropertyNameAttribute .

Los tipos comunes de índice y los tipos de función de distancia se proporcionan como valores estáticos en las Microsoft.SemanticKernel.Data.IndexKind clases y Microsoft.SemanticKernel.Data.DistanceFunction . Las implementaciones de almacén de vectores individuales también pueden usar sus propios tipos de índice y funciones de distancia, donde la base de datos admite tipos inusuales.

Sugerencia

Para más información sobre qué conectores admiten StoragePropertyName y qué alternativas están disponibles, consulte la documentación de cada conector.

Todos los métodos para upsert u obtener registros usan una clase y una definición de registro de almacén de vectores.

Esto se puede hacer definiendo su propia clase con anotaciones para los campos, o usando una clase o tipo en combinación con una definición de registro. Hay que hacer dos cosas para una clase, la primera consiste en agregar las anotaciones con los tipos de campo, la segunda consiste en decorar la clase con el vectorstoremodel decorador.

Sugerencia

Para el enfoque alternativo mediante una definición de registro, consulte definición del esquema con una definición de registro.

Este es un ejemplo de un modelo que está decorado con estas anotaciones.

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

Sugerencia

La definición de una clase con estas anotaciones se puede realizar de varias maneras, una de las cuales usa el dataclasses módulo en Python, que se muestra aquí. En este ejemplo se muestran otros métodos (mediante pydantic BaseModels y clases de Python de vainilla) también.

anotaciones

Hay tres tipos de anotaciones que se usarán y tienen una clase base común.

VectorStoreRecordField

Esta es la clase base para todas las anotaciones, no está pensada para usarse directamente.

Parámetros VectorStoreRecordField

Parámetro Obligatorio Descripción
nombre No Se puede agregar directamente, pero se establecerá durante el análisis del modelo.
property_type No Debe ser una cadena, también se derivará durante el análisis.

Sugerencia

El decorador analiza las vectorstoremodel anotaciones y una de las cosas que hace es crear una definición de registro para la clase, por lo tanto, no es necesario crear instancias de una clase de campo cuando no se establecen parámetros, el campo se puede anotar solo con la clase , como se muestra a continuación:

hotel_id: Annotated[str, VectorStoreRecordKeyField]

VectorStoreRecordKeyField

Use esta anotación para indicar que este atributo es la clave del registro.

VectorStoreRecordKeyField()

Parámetros VectorStoreRecordKeyField

No se definen otros parámetros fuera de la clase base.

VectorStoreRecordDataField

Use esta anotación para indicar que el atributo contiene datos generales que no son una clave ni un vector.

VectorStoreRecordDataField(is_filterable=True)

Parámetros VectorStoreRecordDataField

Parámetro Obligatorio Descripción
has_embedding No Indica si la propiedad tiene una inserción asociada, el valor predeterminado es None.
embedding_property_name No El nombre de la propiedad que contiene la inserción, el valor predeterminado es None.
is_filterable No Indica si la propiedad debe indexarse para filtrar en casos en los que una base de datos requiere participar en la indexación por propiedad. El valor predeterminado es falso.
is_full_text_searchable No Indica si la propiedad debe indexarse para la búsqueda de texto completo para las bases de datos que admiten la búsqueda de texto completo. El valor predeterminado es falso.

VectorStoreRecordVectorField

Use esta anotación para indicar que el atributo contiene un vector.

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

Parámetros VectorStoreRecordVectorField

Parámetro Obligatorio Descripción
dimensiones Sí para la creación de colecciones; de lo contrario, opcional Número de dimensiones que tiene el vector. Esto suele ser necesario al crear un índice vectorial para una colección.
index_kind No Tipo de índice con el que se indexa el vector. El valor predeterminado varía según el tipo de almacén de vectores.
distance_function No Tipo de función de distancia que se va a usar al realizar la comparación vectorial durante la búsqueda de vectores sobre este vector. El valor predeterminado varía según el tipo de almacén de vectores.
local_embedding No Indica si la propiedad tiene una inserción local asociada, el valor predeterminado es None.
embedding_settings No La configuración de la inserción, en forma de dict con service_id como clave y PromptExecutionSettings como valor, el valor predeterminado es None.
serialize_function No La función que se va a usar para serializar el vector, si el tipo no es una lista[float | int] se necesita esta función o es necesario serializar todo el modelo.
deserialize_function No La función que se va a usar para deserializar el vector, si el tipo no es una lista[float | int] se necesita esta función o es necesario deserializar todo el modelo.

Los tipos comunes de índice y los tipos de función de distancia se proporcionan como valores estáticos en las semantic_kernel.data.IndexKind clases y semantic_kernel.data.DistanceFunction . Las implementaciones de almacén de vectores individuales también pueden usar sus propios tipos de índice y funciones de distancia, donde la base de datos admite tipos inusuales.

Todos los métodos para upsert u obtener registros usan clases de modelo fuertemente tipadas. Los campos de estas clases están decorados con anotaciones que indican el propósito de cada campo.

Sugerencia

Para obtener una alternativa al uso de atributos, consulte la definición del esquema con una definición de registro.

Este es un ejemplo de un modelo que está decorado con estas anotaciones. De forma predeterminada, la mayoría de los almacenes vectoriales listos para usar Jackson, por lo tanto, es una buena práctica asegurarse de que Jackson puede serializar el objeto de modelo, es decir, la clase es visible, tiene captadores, constructores, anotaciones, 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; }
}

anotaciones

VectorStoreRecordKey

Use esta anotación para indicar que el campo es la clave del registro.

@VectorStoreRecordKey
private String hotelId;

Parámetros VectorStoreRecordKey

Parámetro Obligatorio Descripción
storageName No Se puede usar para proporcionar un nombre alternativo para el campo de la base de datos. Tenga en cuenta que todos los conectores no admiten este parámetro, por ejemplo, donde se usa Jackson, en ese caso, el nombre de almacenamiento se puede especificar mediante anotaciones de Jackson.

Sugerencia

Para obtener más información sobre qué conectores admiten storageName y qué alternativas están disponibles, consulte la documentación de cada conector.

VectorStoreRecordData

Use esta anotación para indicar que el campo contiene datos generales que no son una clave o un vector.

@VectorStoreRecordData(isFilterable = true)
private String name;

Parámetros VectorStoreRecordData

Parámetro Obligatorio Descripción
isFilterable No Indica si el campo debe indexarse para filtrar en los casos en los que una base de datos requiere participar en la indexación por campo. El valor predeterminado es falso.
isFullTextSearchable No Indica si el campo se debe indexar para la búsqueda de texto completo para las bases de datos que admiten la búsqueda de texto completo. El valor predeterminado es falso.
storageName No Se puede usar para proporcionar un nombre alternativo para el campo de la base de datos. Tenga en cuenta que todos los conectores no admiten este parámetro, por ejemplo, donde se usa Jackson, en ese caso, el nombre de almacenamiento se puede especificar mediante anotaciones de Jackson.

Sugerencia

Para obtener más información sobre qué conectores admiten storageName y qué alternativas están disponibles, consulte la documentación de cada conector.

VectorStoreRecordVector

Use esta anotación para indicar que el campo contiene un vector.

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

Parámetros VectorStoreRecordVector

Parámetro Obligatorio Descripción
dimensiones Sí para la creación de colecciones; de lo contrario, opcional Número de dimensiones que tiene el vector. Esto suele ser necesario al crear un índice vectorial para una colección.
indexKind No Tipo de índice con el que se indexa el vector. El valor predeterminado varía según el tipo de almacén de vectores.
distanceFunction No Tipo de función de distancia que se va a usar al realizar la comparación vectorial durante la búsqueda de vectores sobre este vector. El valor predeterminado varía según el tipo de almacén de vectores.
storageName No Se puede usar para proporcionar un nombre alternativo para el campo de la base de datos. Tenga en cuenta que todos los conectores no admiten este parámetro, por ejemplo, donde se usa Jackson, en ese caso, el nombre de almacenamiento se puede especificar mediante anotaciones de Jackson.

Los tipos de índice comunes y los tipos de función de distancia se proporcionan en las com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind enumeraciones y com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction . Las implementaciones de almacén de vectores individuales también pueden usar sus propios tipos de índice y funciones de distancia, donde la base de datos admite tipos inusuales.

Sugerencia

Para obtener más información sobre qué conectores admiten storageName y qué alternativas están disponibles, consulte la documentación de cada conector.

Más información próximamente.