Partager via


Définition de votre modèle de données (préversion)

Avertissement

La fonctionnalité de magasin de vecteurs du noyau sémantique est en préversion et des améliorations nécessitant des modifications cassants peuvent toujours se produire dans des circonstances limitées avant la mise en production.

Vue d’ensemble

Les connecteurs de magasin de vecteurs de noyau sémantique utilisent une première approche de modèle pour interagir avec les bases de données.

Toutes les méthodes pour upsert ou obtenir des enregistrements utilisent des classes de modèle fortement typées. Les propriétés de ces classes sont décorées avec des attributs qui indiquent l’objectif de chaque propriété.

Conseil

Pour une alternative à l’utilisation d’attributs, reportez-vous à la définition de votre schéma avec une définition d’enregistrement.

Conseil

Pour une alternative à la définition de votre propre modèle de données, reportez-vous à l’utilisation d’abstractions vector Store sans définir votre propre modèle de données.

Voici un exemple de modèle décoré avec ces attributs.

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

Attributs

VectorStoreRecordKeyAttribute

Utilisez cet attribut pour indiquer que votre propriété est la clé de l’enregistrement.

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

Paramètres VectorStoreRecordKeyAttribute

Paramètre Obligatoire Description
StoragePropertyName Non Peut être utilisé pour fournir un autre nom pour la propriété dans la base de données. Notez que ce paramètre n’est pas pris en charge par tous les connecteurs, par exemple lorsque des alternatives comme JsonPropertyNameAttribute celles-ci sont prises en charge.

Conseil

Pour plus d’informations sur les connecteurs qui prennent en charge StoragePropertyName et les alternatives disponibles, reportez-vous à la documentation de chaque connecteur.

VectorStoreRecordDataAttribute

Utilisez cet attribut pour indiquer que votre propriété contient des données générales qui ne sont pas une clé ou un vecteur.

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

Paramètres VectorStoreRecordDataAttribute

Paramètre Obligatoire Description
IsFilterable Non Indique si la propriété doit être indexée pour le filtrage dans les cas où une base de données nécessite d’opter pour l’indexation par propriété. La valeur par défaut est false.
IsFullTextSearchable Non Indique si la propriété doit être indexée pour la recherche en texte intégral pour les bases de données qui prennent en charge la recherche en texte intégral. La valeur par défaut est false.
StoragePropertyName Non Peut être utilisé pour fournir un autre nom pour la propriété dans la base de données. Notez que ce paramètre n’est pas pris en charge par tous les connecteurs, par exemple lorsque des alternatives comme JsonPropertyNameAttribute celles-ci sont prises en charge.

Conseil

Pour plus d’informations sur les connecteurs qui prennent en charge StoragePropertyName et les alternatives disponibles, reportez-vous à la documentation de chaque connecteur.

VectorStoreRecordVectorAttribute

Utilisez cet attribut pour indiquer que votre propriété contient un vecteur.

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

Paramètres VectorStoreRecordVectorAttribute

Paramètre Obligatoire Description
Dimensions Oui pour la création d’une collection, facultatif sinon Nombre de dimensions dont le vecteur a. Cela est généralement nécessaire lors de la création d’un index vectoriel pour une collection.
IndexKind Non Type d’index avec lequel indexer le vecteur. La valeur par défaut varie selon le type de magasin de vecteurs.
DistanceFunction Non Type de fonction de distance à utiliser lors de la comparaison de vecteurs pendant la recherche vectorielle sur ce vecteur. La valeur par défaut varie selon le type de magasin de vecteurs.
StoragePropertyName Non Peut être utilisé pour fournir un autre nom pour la propriété dans la base de données. Notez que ce paramètre n’est pas pris en charge par tous les connecteurs, par exemple lorsque des alternatives comme JsonPropertyNameAttribute celles-ci sont prises en charge.

Les types de fonctions d’index courants et de distance sont fournis sous forme de valeurs statiques sur les classes et Microsoft.SemanticKernel.Data.DistanceFunction les Microsoft.SemanticKernel.Data.IndexKind classes. Les implémentations de magasin de vecteurs individuels peuvent également utiliser leurs propres types d’index et fonctions de distance, où la base de données prend en charge des types inhabituels.

Conseil

Pour plus d’informations sur les connecteurs qui prennent en charge StoragePropertyName et les alternatives disponibles, reportez-vous à la documentation de chaque connecteur.

Toutes les méthodes permettant d’effectuer un upsert ou d’obtenir des enregistrements utilisent une classe et une définition d’enregistrement de magasin vectoriel.

Pour ce faire, vous pouvez définir votre propre classe avec des annotations pour les champs, ou en utilisant une classe/type en combinaison avec une définition d’enregistrement. Deux choses doivent être effectuées pour une classe, la première consiste à ajouter les annotations avec les types de champs, la seconde consiste à décorer la classe avec le vectorstoremodel décorateur.

Conseil

Pour obtenir l’autre approche à l’aide d’une définition d’enregistrement, reportez-vous à la définition de votre schéma avec une définition d’enregistrement.

Voici un exemple de modèle décoré avec ces annotations.

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

Conseil

La définition d’une classe avec ces annotations peut être effectuée de plusieurs façons, dont l’une utilise le dataclasses module en Python, illustrée ici. Cet exemple montre également d’autres approches (à l’aide de classes Pydantic BaseModels et python vanille).

Annotations

Il existe trois types d’annotations à utiliser, et ils ont une classe de base commune.

VectorStoreRecordField

Il s’agit de la classe de base pour toutes les annotations, elle n’est pas destinée à être utilisée directement.

Paramètres VectorStoreRecordField

Paramètre Obligatoire Description
name Non Peut être ajouté directement, mais sera défini pendant l’analyse du modèle.
property_type Non Doit être une chaîne, sera également dérivée pendant l’analyse.

Conseil

Les annotations sont analysées par le vectorstoremodel décorateur et l’une des choses qu’il fait consiste à créer une définition d’enregistrement pour la classe, il n’est donc pas nécessaire d’instancier une classe de champ lorsqu’aucun paramètre n’est défini, le champ peut être annoté avec uniquement la classe, comme suit :

hotel_id: Annotated[str, VectorStoreRecordKeyField]

VectorStoreRecordKeyField

Utilisez cette annotation pour indiquer que cet attribut est la clé de l’enregistrement.

VectorStoreRecordKeyField()

Paramètres VectorStoreRecordKeyField

Aucun autre paramètre en dehors de la classe de base n’est défini.

VectorStoreRecordDataField

Utilisez cette annotation pour indiquer que votre attribut contient des données générales qui ne sont pas une clé ou un vecteur.

VectorStoreRecordDataField(is_filterable=True)

Paramètres VectorStoreRecordDataField

Paramètre Obligatoire Description
has_embedding Non Indique si la propriété a une incorporation associée, la valeur par défaut est None.
embedding_property_name Non Le nom de la propriété qui contient l’incorporation, la valeur par défaut est None.
is_filterable Non Indique si la propriété doit être indexée pour le filtrage dans les cas où une base de données nécessite d’opter pour l’indexation par propriété. La valeur par défaut est false.
is_full_text_searchable Non Indique si la propriété doit être indexée pour la recherche en texte intégral pour les bases de données qui prennent en charge la recherche en texte intégral. La valeur par défaut est false.

VectorStoreRecordVectorField

Utilisez cette annotation pour indiquer que votre attribut contient un vecteur.

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

Paramètres VectorStoreRecordVectorField

Paramètre Obligatoire Description
dimensions Oui pour la création d’une collection, facultatif sinon Nombre de dimensions dont le vecteur a. Cela est généralement nécessaire lors de la création d’un index vectoriel pour une collection.
index_kind Non Type d’index avec lequel indexer le vecteur. La valeur par défaut varie selon le type de magasin de vecteurs.
distance_function Non Type de fonction de distance à utiliser lors de la comparaison de vecteurs pendant la recherche vectorielle sur ce vecteur. La valeur par défaut varie selon le type de magasin de vecteurs.
local_embedding Non Indique si la propriété a une incorporation locale associée, la valeur par défaut est None.
embedding_settings Non Les paramètres de l’incorporation, sous la forme d’une dictée avec service_id en tant que clé et PromptExecutionSettings comme valeur, la valeur par défaut est None.
serialize_function Non Fonction à utiliser pour sérialiser le vecteur, si le type n’est pas une liste[float | int] cette fonction est nécessaire, ou le modèle entier doit être sérialisé.
deserialize_function Non Fonction à utiliser pour désérialiser le vecteur, si le type n’est pas une liste[float | int] cette fonction est nécessaire, ou l’ensemble du modèle doit être désérialisé.

Les types de fonctions d’index courants et de distance sont fournis sous forme de valeurs statiques sur les classes et semantic_kernel.data.DistanceFunction les semantic_kernel.data.IndexKind classes. Les implémentations de magasin de vecteurs individuels peuvent également utiliser leurs propres types d’index et fonctions de distance, où la base de données prend en charge des types inhabituels.

Toutes les méthodes pour upsert ou obtenir des enregistrements utilisent des classes de modèle fortement typées. Les champs de ces classes sont décorés avec des annotations qui indiquent l’objectif de chaque champ.

Conseil

Pour une alternative à l’utilisation d’attributs, reportez-vous à la définition de votre schéma avec une définition d’enregistrement.

Voici un exemple de modèle décoré avec ces annotations. Par défaut, la plupart des magasins de vecteurs sortants utilisent Jackson, c’est donc une bonne pratique pour s’assurer que l’objet modèle peut être sérialisé par Jackson, c’est-à-dire que la classe est visible, a des getters, constructeur, annotations, 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; }
}

Annotations

VectorStoreRecordKey

Utilisez cette annotation pour indiquer que votre champ est la clé de l’enregistrement.

@VectorStoreRecordKey
private String hotelId;

Paramètres VectorStoreRecordKey

Paramètre Obligatoire Description
storageName Non Peut être utilisé pour fournir un autre nom pour le champ de la base de données. Notez que ce paramètre n’est pas pris en charge par tous les connecteurs, par exemple, où Jackson est utilisé, dans ce cas, le nom de stockage peut être spécifié à l’aide d’annotations Jackson.

Conseil

Pour plus d’informations sur les connecteurs qui prennent en charge storageName et les alternatives disponibles, reportez-vous à la documentation de chaque connecteur.

VectorStoreRecordData

Utilisez cette annotation pour indiquer que votre champ contient des données générales qui ne sont pas une clé ou un vecteur.

@VectorStoreRecordData(isFilterable = true)
private String name;

Paramètres VectorStoreRecordData

Paramètre Obligatoire Description
isFilterable Non Indique si le champ doit être indexé pour le filtrage dans les cas où une base de données nécessite l’inscription à l’indexation par champ. La valeur par défaut est false.
isFullTextSearchable Non Indique si le champ doit être indexé pour la recherche en texte intégral pour les bases de données qui prennent en charge la recherche en texte intégral. La valeur par défaut est false.
storageName Non Peut être utilisé pour fournir un autre nom pour le champ de la base de données. Notez que ce paramètre n’est pas pris en charge par tous les connecteurs, par exemple, où Jackson est utilisé, dans ce cas, le nom de stockage peut être spécifié à l’aide d’annotations Jackson.

Conseil

Pour plus d’informations sur les connecteurs qui prennent en charge storageName et les alternatives disponibles, reportez-vous à la documentation de chaque connecteur.

VectorStoreRecordVector

Utilisez cette annotation pour indiquer que votre champ contient un vecteur.

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

Paramètres VectorStoreRecordVector

Paramètre Obligatoire Description
dimensions Oui pour la création d’une collection, facultatif sinon Nombre de dimensions dont le vecteur a. Cela est généralement nécessaire lors de la création d’un index vectoriel pour une collection.
indexKind Non Type d’index avec lequel indexer le vecteur. La valeur par défaut varie selon le type de magasin de vecteurs.
distanceFunction Non Type de fonction de distance à utiliser lors de la comparaison de vecteurs pendant la recherche vectorielle sur ce vecteur. La valeur par défaut varie selon le type de magasin de vecteurs.
storageName Non Peut être utilisé pour fournir un autre nom pour le champ de la base de données. Notez que ce paramètre n’est pas pris en charge par tous les connecteurs, par exemple, où Jackson est utilisé, dans ce cas, le nom de stockage peut être spécifié à l’aide d’annotations Jackson.

Les types de fonctions d’index courants et de distance sont fournis sur les com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind énumérations et com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction les énumérations. Les implémentations de magasin de vecteurs individuels peuvent également utiliser leurs propres types d’index et fonctions de distance, où la base de données prend en charge des types inhabituels.

Conseil

Pour plus d’informations sur les connecteurs qui prennent en charge storageName et les alternatives disponibles, reportez-vous à la documentation de chaque connecteur.

Plus d’informations prochainement.