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.
Microsoft.Extensions.VectorData utilise une approche de premier 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. Il existe deux façons de définir le modèle de données :
- En décorant des propriétés sur les classes de modèle avec des attributs qui indiquent l’objectif de chaque propriété.
- En définissant votre schéma de stockage à l’aide d’une définition d’enregistrement que vous fournissez séparément du modèle de données. La définition d’enregistrement est une VectorStoreCollectionDefinition propriété qui contient des propriétés.
Voici un exemple de classe ou de modèle de données dont les propriétés sont décorées avec VectorStore*Attribute des attributs.
public class Hotel
{
[VectorStoreKey]
public ulong HotelId { get; set; }
[VectorStoreData(IsIndexed = true)]
public required string HotelName { get; set; }
[VectorStoreData(IsFullTextIndexed = true)]
public required string Description { get; set; }
[VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
[VectorStoreData(IsIndexed = true)]
public required string[] Tags { get; set; }
}
Attributs de propriété de modèle de données
Les VectorStore*Attribute attributs qui définissent des modèles de données pour les bases de données vectorielles sont les suivants :
VectorStoreKeyAttribute
Utilisez l’attribut VectorStoreKeyAttribute pour indiquer que votre propriété est la clé primaire de l’enregistrement.
[VectorStoreKey]
public ulong HotelId { get; set; }
Le tableau suivant présente les paramètres pour VectorStoreKeyAttribute.
| Paramètre | Obligatoire | Description |
|---|---|---|
| StorageName | Non | Peut être utilisé pour fournir un autre nom pour la propriété dans la base de données. Ce paramètre n’est pas pris en charge par tous les fournisseurs, par exemple, où des alternatives comme JsonPropertyNameAttribute celles-ci sont prises en charge. |
VectorStoreDataAttribute
Utilisez l’attribut VectorStoreDataAttribute pour indiquer que votre propriété contient des données générales qui ne sont pas une clé ou un vecteur.
[VectorStoreData(IsIndexed = true)]
public required string HotelName { get; set; }
Le tableau suivant présente les paramètres pour VectorStoreDataAttribute.
| Paramètre | Obligatoire | Description |
|---|---|---|
| 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. Ce paramètre n’est pas pris en charge par tous les fournisseurs, par exemple, où des alternatives comme JsonPropertyNameAttribute celles-ci sont prises en charge. |
VectorStoreVectorAttribute
Utilisez l’attribut VectorStoreVectorAttribute pour indiquer que votre propriété contient un vecteur.
[VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
Il est également possible d’utiliser VectorStoreVectorAttribute sur les propriétés qui n’ont pas de type vecteur, par exemple une propriété de type string. Lorsqu’une propriété est décorée de cette façon, vous devez fournir une IEmbeddingGenerator instance au magasin vectoriel. Lors de l’upserting de l’enregistrement, le texte qui se trouve dans la string propriété est automatiquement converti et stocké en tant que vecteur dans la base de données. (Il n’est pas possible de récupérer un vecteur à l’aide de ce mécanisme.)
[VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineSimilarity, IndexKind = IndexKind.Hnsw)]
public string DescriptionEmbedding { get; set; }
Conseil / Astuce
Pour plus d’informations sur l’utilisation de la génération d’incorporation intégrée, consultez Let the vector store generate embeddings.
Le tableau suivant présente les paramètres pour VectorStoreVectorAttribute.
| Paramètre | Obligatoire | Description |
|---|---|---|
| Dimensions | Oui | Nombre de dimensions dont le vecteur a. Cela est 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. |
| StorageName | Non | Peut être utilisé pour fournir un autre nom pour la propriété dans la base de données. Ce paramètre n’est pas pris en charge par tous les fournisseurs, par exemple, où 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 DistanceFunction les 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.
Propriétés de définition d’enregistrement
Utilisez les VectorStore*Property classes pour créer une définition d’enregistrement que vous passez au modèle de données :
VectorStoreKeyProperty
Utilisez la VectorStoreKeyProperty classe pour indiquer que votre propriété est la clé de l’enregistrement.
new VectorStoreKeyProperty("HotelId", typeof(ulong)),
Le tableau suivant présente les paramètres de configuration pour VectorStoreKeyProperty.
| Paramètre | Obligatoire | Description |
|---|---|---|
Name |
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. |
Type |
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. Ce paramètre n’est pas pris en charge par tous les fournisseurs, par exemple, où des alternatives comme JsonPropertyNameAttribute celles-ci sont prises en charge. |
VectorStoreDataProperty
Utilisez la VectorStoreDataProperty 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 },
new VectorStoreDataProperty("Description", typeof(string)) { IsFullTextIndexed = true },
Le tableau suivant présente les paramètres de configuration pour VectorStoreDataProperty.
| Paramètre | Obligatoire | Description |
|---|---|---|
Name |
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. |
Type |
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. Ce paramètre n’est pas pris en charge par tous les fournisseurs, par exemple, où des alternatives comme JsonPropertyNameAttribute celles-ci sont prises en charge. |
VectorStoreVectorProperty
Utilisez la VectorStoreVectorProperty classe pour indiquer que votre propriété contient un vecteur.
new VectorStoreVectorProperty("DescriptionEmbedding", typeof(float), dimensions: 4)
Le tableau suivant présente les paramètres de configuration pour VectorStoreVectorProperty.
| Paramètre | Obligatoire | Description |
|---|---|---|
Name |
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. |
Type |
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. |
Dimensions |
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. Ce paramètre n’est pas pris en charge par tous les fournisseurs, par exemple, où 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. |
Utiliser des abstractions de magasin de vecteurs sans définir de modèle de données
Il existe des cas où il n’est pas souhaitable ou possible de définir votre propre modèle de données. Par exemple, imaginez que vous ne savez pas au moment de la compilation ce que votre schéma de base de données ressemble, et que le schéma est fourni uniquement par le biais de la configuration. La création d’un modèle de données qui reflète le schéma serait impossible dans ce cas. Au lieu de cela, vous pouvez mapper dynamiquement à l’aide d’un Dictionary<string, object?> type d’enregistrement. Les propriétés sont ajoutées à la Dictionary clé comme nom de propriété et à la valeur comme valeur de propriété.
Note
La plupart des applications utilisent simplement des types .NET fortement typés pour modéliser leurs données. Le mappage dynamique via Dictionary<string, object?> est destiné aux scénarios avancés de mappage de données arbitraires.
Fournir des informations de schéma lors de l’utilisation Dictionary
Lorsque vous utilisez un Dictionaryfournisseur, vous devez toujours savoir à quoi ressemble le schéma de base de données. Sans les informations de schéma, le fournisseur ne serait pas en mesure de créer une collection ou de savoir comment mapper vers et à partir de la représentation de stockage utilisée par chaque base de données.
Vous pouvez utiliser une définition d’enregistrement pour fournir les informations de schéma. Contrairement à un modèle de données, une définition d’enregistrement peut être créée à partir de la configuration au moment de l’exécution lorsque les informations de schéma ne sont pas connues au moment de la compilation.
Exemple
Pour utiliser Dictionary un fournisseur, spécifiez-le comme modèle de données lorsque vous créez la collection. Fournissez également une définition d’enregistrement.
VectorStoreCollectionDefinition definition = new()
{
Properties =
[
new VectorStoreKeyProperty("Key", typeof(string)),
new VectorStoreDataProperty("Term", typeof(string)),
new VectorStoreDataProperty("Definition", typeof(string)),
new VectorStoreVectorProperty("DefinitionEmbedding", typeof(ReadOnlyMemory<float>), dimensions: 1536)
]
};
// Use GetDynamicCollection instead of the regular GetCollection method
// to get an instance of a collection using Dictionary<string, object?>.
VectorStoreCollection<object, Dictionary<string, object?>> dynamicDataModelCollection =
vectorStore.GetDynamicCollection("glossary", definition);
// Since schema information is available from the record definition,
// it's possible to create a collection with the right vectors,
// dimensions, indexes, and distance functions.
await dynamicDataModelCollection.EnsureCollectionExistsAsync();
// When retrieving a record from the collection,
// access key, data, and vector values via the dictionary entries.
Dictionary<string, object?>? record = await dynamicDataModelCollection.GetAsync("SK");
Console.WriteLine(record["Definition"]);