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.