Partager via


Utilisation du connecteur de magasin de vecteurs MongoDB (aperçu)

Avertissement

La fonctionnalité de stockage de vecteurs MongoDB est en préversion, et des améliorations nécessitant des modifications cassantes peuvent encore survenir dans des circonstances limitées avant la mise en service.

Avertissement

La fonctionnalité de magasin de vecteurs du noyau sémantique est en préversion, et des améliorations nécessitant des modifications entraînant des changements importants peuvent encore se produire dans des circonstances limitées avant la publication.

Avertissement

La fonctionnalité de magasin de vecteurs du noyau sémantique est en préversion, et des améliorations nécessitant des modifications entraînant des changements importants peuvent encore se produire dans des circonstances limitées avant la publication.

Vue d’ensemble

Le connecteur de stockage de vecteurs MongoDB peut être utilisé pour accéder et gérer les données dans MongoDB. Le connecteur présente les caractéristiques suivantes.

Zone de Fonctionnalités Soutien
Les cartes de collection correspondent à Collection et Index MongoDB
Types de propriétés de clé pris en charge chaîne de caractères
Types de propriétés de données pris en charge
  • chaîne de caractères
  • Int
  • long
  • double
  • virgule flottante
  • décimal
  • Bool
  • Date/Heure
  • et les énumérables de chacun de ces types
Types de propriétés vectorielles pris en charge
  • ReadOnlyMemory
  • Float d’incorporation<>
  • float[]
Types d’index pris en charge Sans Objet
Fonctions de distance prises en charge
  • CosineSimilarity
  • DotProductSimilarity
  • EuclideanDistance
Clauses de filtre prises en charge
  • EqualTo
Prend en charge plusieurs vecteurs dans un enregistrement Oui
Est-ce queIndexed est pris en charge ? Oui
Est-ce queFullTextIndexed est pris en charge ? Non
Le StorageName est-il pris en charge ? Non, utilisez BsonElementAttribute à la place. Pour plus d’informations, voir ici.
HybridSearch est-il pris en charge ? Oui
Zone de Fonctionnalités Soutien
Les cartes de collection correspondent à Collection et Index MongoDB
Types de propriétés de clé pris en charge chaîne de caractères
Types de propriétés de données pris en charge
  • chaîne de caractères
  • Int
  • long
  • double
  • virgule flottante
  • décimal
  • Bool
  • Date/Heure
  • et les itérables de chacun de ces types
Types de propriétés vectorielles pris en charge
  • liste[flottant]
  • liste[int]
  • ndarray
Types d’index pris en charge
  • Hnsw
  • IvfFlat
Fonctions de distance prises en charge
  • CosineDistance
  • DotProductSimilarity
  • EuclideanDistance
Clauses de filtre prises en charge
  • EqualTo
  • AnyTagsEqualTo
Prend en charge plusieurs vecteurs dans un enregistrement Oui
La fonctionnalité IsFilterable est-elle prise en charge ? Oui
IsFullTextSearchable est-il pris en charge ? Non

Plus d’informations prochainement.

Mise en route

Ajoutez le package NuGet du connecteur de la base de vecteurs MongoDB à votre projet.

dotnet add package Microsoft.SemanticKernel.Connectors.MongoDB --prerelease

Vous pouvez ajouter le magasin de vecteurs au conteneur d’injection de dépendances en utilisant les méthodes d’extension fournies par le IServiceCollection Noyau Sémantique.

using Microsoft.Extensions.DependencyInjection;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMongoVectorStore(connectionString, databaseName);

Les méthodes d’extension qui ne prennent aucun paramètre sont également fournies. Celles-ci nécessitent qu'une instance de MongoDB.Driver.IMongoDatabase soit enregistrée séparément auprès du conteneur d'injection de dépendances.

using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<IMongoDatabase>(
    sp =>
    {
        var mongoClient = new MongoClient(connectionString);
        return mongoClient.GetDatabase(databaseName);
    });
builder.Services.AddMongoVectorStore();

Vous pouvez construire directement une instance du magasin de vecteurs MongoDB.

using Microsoft.SemanticKernel.Connectors.MongoDB;
using MongoDB.Driver;

var mongoClient = new MongoClient(connectionString);
var database = mongoClient.GetDatabase(databaseName);
var vectorStore = new MongoVectorStore(database);

Il est possible de construire une référence directe à une collection nommée.

using Microsoft.SemanticKernel.Connectors.MongoDB;
using MongoDB.Driver;

var mongoClient = new MongoClient(connectionString);
var database = mongoClient.GetDatabase(databaseName);
var collection = new MongoCollection<string, Hotel>(
    database,
    "skhotels");

Mappage de données

Le connecteur du magasin de vecteurs MongoDB fournit un mappeur par défaut lors du mappage des données du modèle au stockage.

Ce mappeur effectue une conversion directe de la liste des propriétés du modèle de données vers les champs de MongoDB et utilise MongoDB.Bson.Serialization pour convertir le schéma de stockage. Cela signifie que l’utilisation de l’objet MongoDB.Bson.Serialization.Attributes.BsonElement est prise en charge si un nom de stockage différent du nom de propriété du modèle de données est requis. La seule exception est la clé de l’enregistrement qui est mappée à un champ de base de données nommé _id, car tous les enregistrements MongoDB doivent utiliser ce nom pour les ID.

Remplacement du nom de propriété

Pour les propriétés de données et les propriétés vectorielles, vous pouvez fournir des noms de champs de remplacement à utiliser dans le stockage différent des noms de propriétés sur le modèle de données. Cela n’est pas pris en charge pour les clés, car une clé a un nom fixe dans MongoDB.

Le remplacement du nom de propriété est effectué en définissant l’attribut BsonElement sur les propriétés du modèle de données.

Voici un exemple de modèle de données avec BsonElement ensemble.

using Microsoft.Extensions.VectorData;
using MongoDB.Bson.Serialization.Attributes;

public class Hotel
{
    [VectorStoreKey]
    public ulong HotelId { get; set; }

    [BsonElement("hotel_name")]
    [VectorStoreData(IsIndexed = true)]
    public string HotelName { get; set; }

    [BsonElement("hotel_description")]
    [VectorStoreData(IsFullTextIndexed = true)]
    public string Description { get; set; }

    [BsonElement("hotel_description_embedding")]
    [VectorStoreVector(4, DistanceFunction = DistanceFunction.CosineSimilarity)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}

Mise en route

Ajoutez les dépendances du Magasin vectoriel Atlas MongoDB à votre environnement. Il nécessite le package pymongo qui est inclus dans mongo extra ; vous devez l'installer avec ces fonctionnalités supplémentaires.

pip install semantic-kernel[mongo]

Vous pouvez ensuite créer le magasin vectoriel.

from semantic_kernel.connectors.mongodb import MongoDBAtlasStore

# If the right environment settings are set, namely MONGODB_ATLAS_CONNECTION_STRING and optionally MONGODB_ATLAS_DATABASE_NAME and MONGODB_ATLAS_INDEX_NAME, this is enough to create the Store:
store = MongoDBAtlasStore()

Vous pouvez également passer votre propre client MongoDB si vous souhaitez avoir plus de contrôle sur la construction du client.

from pymongo import AsyncMongoClient
from semantic_kernel.connectors.mongodb import MongoDBAtlasStore

client = AsyncMongoClient(...)
store = MongoDBAtlasStore(mongo_client=client)

Lorsqu'un client est transmis, le noyau sémantique ne ferme pas la connexion pour vous. Vous devez donc vous assurer de la fermer, par exemple avec une instruction async with.

Vous pouvez également créer une collection directement, sans le magasin.

from semantic_kernel.connectors.mongodb import MongoDBAtlasCollection

# `hotel` is a class created with the @vectorstoremodel decorator
collection = MongoDBAtlasCollection(
    record_type=hotel,
    collection_name="my_collection",
)

Sérialisation

Étant donné que le connecteur MongoDB Atlas a besoin d’une dictée simple avec les champs correspondant à l’index en tant qu’entrée, la sérialisation est assez facile, elle utilise uniquement une clé prédéterminée _id, donc nous remplaçons la clé du modèle de données par celle-ci si ce n’est pas déjà _id.

Pour plus d’informations sur ce concept, consultez la documentation de sérialisation.

Bientôt disponible

Plus d’informations prochainement.