Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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.
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 du noyau sémantique utilisent une première approche de modèle pour interagir avec les bases de données et permet d’annoter des modèles de données avec des informations nécessaires pour créer des index ou mapper des données au schéma de base de données.
Une autre façon de fournir ces informations consiste à utiliser des définitions d’enregistrement, qui peuvent être définies et fournies séparément au modèle de données. Cela peut être utile dans plusieurs scénarios :
- Il peut arriver qu’un développeur souhaite utiliser le même modèle de données avec plusieurs configurations.
- Il peut y avoir un cas où un développeur souhaite utiliser un type intégré, comme un dicté ou un format optimisé comme un dataframe et souhaite toujours tirer parti de la fonctionnalité de magasin de vecteurs.
Voici un exemple de création d’une définition d’enregistrement.
using Microsoft.Extensions.VectorData;
var hotelDefinition = new VectorStoreCollectionDefinition
{
Properties = new List<VectorStoreProperty>
{
new VectorStoreKeyProperty("HotelId", typeof(ulong)),
new VectorStoreDataProperty("HotelName", typeof(string)) { IsIndexed = true },
new VectorStoreDataProperty("Description", typeof(string)) { IsFullTextIndexed = true },
new VectorStoreVectorProperty("DescriptionEmbedding", typeof(float), dimensions: 4) { DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw },
}
};
Lorsque vous créez une définition, vous devez toujours fournir un nom et un type pour chaque propriété de votre schéma, car cela est requis pour la création d’index et le mappage des données.
Pour utiliser la définition, passez-la à la méthode GetCollection.
var collection = vectorStore.GetCollection<ulong, Hotel>("skhotels", hotelDefinition);
Classes de configuration des propriétés d’enregistrement
VectorStoreKeyProperty
Utilisez cette classe pour indiquer que votre propriété est la clé de l’enregistrement.
new VectorStoreKeyProperty("HotelId", typeof(ulong)),
Paramètres de configuration VectorStoreKeyProperty
| Paramètre | Obligatoire | Descriptif |
|---|---|---|
| Nom | Oui | Nom de la propriété sur le modèle de données. Utilisé par le mappeur pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| Catégorie | Non | Type de la propriété sur le modèle de données. Utilisé par le mappeur pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| StorageName | 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 pris en charge StorageName et les alternatives disponibles, reportez-vous à la documentation de chaque connecteur.
VectorStoreDataProperty
Utilisez cette classe pour indiquer que votre propriété contient des données générales qui ne sont pas une clé ou un vecteur.
new VectorStoreDataProperty("HotelName", typeof(string)) { IsIndexed = true },
Paramètres de configuration VectorStoreDataProperty
| Paramètre | Obligatoire | Descriptif |
|---|---|---|
| Nom | Oui | Nom de la propriété sur le modèle de données. Utilisé par le mappeur pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| Catégorie | Non | Type de la propriété sur le modèle de données. Utilisé par le mappeur pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| IsIndexed | 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. |
| IsFullTextIndexed | 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. |
| StorageName | 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 pris en charge StorageName et les alternatives disponibles, reportez-vous à la documentation de chaque connecteur.
VectorStoreVectorProperty
Utilisez cette classe pour indiquer que votre propriété contient un vecteur.
new VectorStoreVectorProperty("DescriptionEmbedding", typeof(float), dimensions: 4) { DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw },
Paramètres de configuration VectorStoreVectorProperty
| Paramètre | Obligatoire | Descriptif |
|---|---|---|
| Nom | Oui | Nom de la propriété sur le modèle de données. Utilisé par le mappeur pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| Catégorie | Non | Type de la propriété sur le modèle de données. Utilisé par le mappeur pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| Taille | Oui | Nombre de dimensions dont le vecteur a. Cela est nécessaire pour créer 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 à 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 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. |
| EmbeddingGenerator | Non | Permet de spécifier une Microsoft.Extensions.AI.IEmbeddingGenerator instance à utiliser pour générer automatiquement des incorporations pour la propriété décorée. |
Conseil
Pour plus d’informations sur les connecteurs pris en charge StorageName et les alternatives disponibles, reportez-vous à la documentation de chaque connecteur.
Voici un exemple de création d’une définition d’enregistrement, à utiliser avec un DataFrame pandas.
Remarque
Les mêmes champs que dans la définition du modèle de données sont utilisés ici, pour un datamodel, ils sont ajoutés en tant qu’annotations, ici sous la forme d’une dictée portant le nom.
Il y a quelques points importants à noter, puis les définitions de champs elles-mêmes. Le premier est le container_mode paramètre. Lorsqu’il est défini sur True, cela indique que le modèle de données est un type de conteneur, comme un DataFrame, et que le modèle de données est donc un conteneur d’enregistrements, au lieu d’un seul, un enregistrement conteneur peut être utilisé de la même façon, la principale différence est que get et get_batch retournera le même type de données, avec un enregistrement unique pour un get ou plusieurs pour un get_batch. Lorsque vous souhaitez effectuer un upsert upsert et upsert_batch que vous pouvez utiliser indifféremment, en d’autres termes, le passage d’un conteneur pour upsert entraîner plusieurs upserts, au lieu d’un seul.
Le deuxième est l’ajout des méthodes et to_dict des from_dict méthodes utilisées pour effectuer la conversion entre le modèle de données et le schéma de stockage. Dans ce cas, la to_dict méthode est utilisée pour convertir le DataFrame en une liste d’enregistrements, et la from_dict méthode est utilisée pour convertir une liste d’enregistrements en dataFrame. Il peut également y avoir une serializedeserialize méthode (non illustrée dans l’exemple ci-dessous), pour plus d’informations sur la différence entre celles-ci, consultez la documentation de sérialisation.
from semantic_kernel.data import (
VectorStoreRecordDataField,
VectorStoreRecordDefinition,
VectorStoreRecordKeyField,
VectorStoreRecordVectorField,
)
hotel_definition = VectorStoreRecordDefinition(
fields={
"hotel_id": VectorStoreRecordKeyField(property_type="str"),
"hotel_name": VectorStoreRecordDataField(property_type="str", is_filterable=True),
"description": VectorStoreRecordDataField(
property_type="str", has_embedding=True, embedding_property_name="description_embedding"
),
"description_embedding": VectorStoreRecordVectorField(property_type="list[float]"),
},
container_mode=True,
to_dict=lambda record, **_: record.to_dict(orient="records"),
from_dict=lambda records, **_: DataFrame(records),
)
Lors de la création d’une définition, vous devez toujours fournir un nom (comme clé dans le fields dict) et taper pour chaque propriété de votre schéma, car cela est requis pour la création d’index et le mappage des données.
Pour utiliser la définition, passez-la à la méthode GetCollection ou à un constructeur de collection, ainsi qu’au type de modèle de données.
collection = vector_store.get_collection(
collection_name="skhotels",
record_type=pd.DataFrame,
definition=hotel_definition,
)
Voici un exemple de création d’une définition d’enregistrement.
var hotelDefinition = VectorStoreRecordDefinition.fromFields(
Arrays.asList(
VectorStoreRecordKeyField.builder().withName("hotelId").withFieldType(String.class).build(),
VectorStoreRecordDataField.builder()
.withName("name")
.withFieldType(String.class)
.isFilterable(true).build(),
VectorStoreRecordDataField.builder()
.withName("description")
.withFieldType(String.class)
.isFullTextSearchable(true).build(),
VectorStoreRecordVectorField.builder().withName("descriptionEmbedding")
.withDimensions(4)
.withIndexKind(IndexKind.HNSW)
.withDistanceFunction(DistanceFunction.COSINE_DISTANCE)
.withFieldType(List.class).build()
)
);
Lorsque vous créez une définition, vous devez toujours fournir un nom et un type pour chaque champ de votre schéma, car cela est requis pour la création d’index et le mappage de données.
Pour utiliser la définition, passez-la à la méthode GetCollection.
var collection = vectorStore.getCollection("skhotels",
JDBCVectorStoreRecordCollectionOptions.builder()
.withRecordDefinition(hotelDefinition)
.build()
);
Classes de configuration de champ d’enregistrement
VectorStoreRecordKeyField
Utilisez cette classe pour indiquer que votre champ est la clé de l’enregistrement.
VectorStoreRecordKeyField.builder().withName("hotelId").withFieldType(String.class).build(),
Paramètres de configuration VectorStoreRecordKeyField
| Paramètre | Obligatoire | Descriptif |
|---|---|---|
| nom | Oui | Nom du champ sur le modèle de données. Utilisé par les mappeurs intégrés pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| fieldType | Oui | Type du champ sur le modèle de données. Utilisé par les mappeurs intégrés pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| stockageNom | 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.
VectorStoreRecordDataField
Utilisez cette classe pour indiquer que votre propriété contient des données générales qui ne sont pas une clé ou un vecteur.
VectorStoreRecordDataField.builder()
.withName("name")
.withFieldType(String.class)
.isFilterable(true).build(),
Paramètres de configuration VectorStoreRecordDataField
| Paramètre | Obligatoire | Descriptif |
|---|---|---|
| nom | Oui | Nom du champ sur le modèle de données. Utilisé par les mappeurs intégrés pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| fieldType | Oui | Type du champ sur le modèle de données. Utilisé par les mappeurs intégrés pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| 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. |
| stockageNom | 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.
VectorStoreRecordVectorField
Utilisez cette classe pour indiquer que votre champ contient un vecteur.
VectorStoreRecordVectorField.builder().withName("descriptionEmbedding")
.withDimensions(4)
.withIndexKind(IndexKind.HNSW)
.withDistanceFunction(DistanceFunction.COSINE_DISTANCE)
.withFieldType(List.class).build(),
Paramètres de configuration VectorStoreRecordVectorField
| Paramètre | Obligatoire | Descriptif |
|---|---|---|
| nom | Oui | Nom du champ sur le modèle de données. Utilisé par les mappeurs intégrés pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| fieldType | Oui | Type du champ sur le modèle de données. Utilisé par les mappeurs intégrés pour mapper automatiquement entre le schéma de stockage et le modèle de données et pour créer des index. |
| taille | 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 à 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. |
| stockageNom | 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.