Compartilhar via


Usando o conector do MongoDB Vector Store (versão prévia)

Aviso

A funcionalidade do Repositório de Vetores do MongoDB está em versão prévia e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Aviso

A funcionalidade do Repositório de Vetores do Kernel Semântico está em versão prévia e as melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Aviso

A funcionalidade do Repositório de Vetores do Kernel Semântico está em versão prévia e as melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Visão geral

O conector do MongoDB Vector Store pode ser usado para acessar e gerenciar dados no MongoDB. O conector tem as seguintes características.

Área de Funcionalidade Suporte
A coleção é mapeada para Coleção MongoDB + Índice
Tipos de propriedade de chave com suporte corda
Tipos de propriedade de dados com suporte
  • corda
  • INT
  • longo
  • duplo
  • flutuar
  • decimal
  • Bool
  • Data e Hora
  • e enumeráveis de cada um desses tipos
Tipologias de propriedades de vetor suportadas
  • Float ReadOnlyMemory<>
  • Inserindo<float>
  • float[]
Tipos de índice com suporte N/D
Funções de distância suportadas
  • Semelhança de cosseno
  • DotProductSimilarity
  • Distância Euclidiana
Cláusulas de filtro com suporte
  • EqualTo
Suporta vários vetores em um registro Sim
Há suporte para IsIndexed? Sim
Há suporte paraFullTextIndexed? Não
"StorageName é suportado?" Não, use BsonElementAttribute em vez disso. Veja aqui para mais informações.
O HybridSearch é suportado? Sim
Área de Funcionalidade Suporte
A coleção é mapeada para Coleção MongoDB + Índice
Tipos de propriedade de chave com suporte corda
Tipos de propriedade de dados com suporte
  • corda
  • INT
  • longo
  • duplo
  • flutuar
  • decimal
  • Bool
  • Data e Hora
  • e iteráveis de cada um desses tipos
Tipologias de propriedades de vetor suportadas
  • lista[float]
  • lista[int]
  • ndarray
Tipos de índice com suporte
  • Hnsw
  • IvfFlat
Funções de distância suportadas
  • CosineDistance
  • DotProductSimilarity
  • Distância Euclidiana
Cláusulas de filtro com suporte
  • EqualTo
  • AnyTagsEqualTo
Suporta vários vetores em um registro Sim
O IsFilterable é suportado? Sim
IsFullTextSearchable é suportado? Não

Mais informações em breve.

Introdução

Adicione o pacote NuGet do conector do Repositório de Vetores do MongoDB ao seu projeto.

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

Você pode adicionar o repositório de vetores ao IServiceCollection contêiner de injeção de dependência usando métodos de extensão fornecidos pelo Semantic Kernel.

using Microsoft.Extensions.DependencyInjection;

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

Métodos de extensão que não usam parâmetros também são fornecidos. Eles exigem que uma instância de MongoDB.Driver.IMongoDatabase seja registrada separadamente com o contêiner de injeção de dependência.

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();

Você pode construir uma instância do MongoDB Vector Store diretamente.

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

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

É possível construir uma referência direta a uma coleção nomeada.

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");

Mapeamento de dados

O conector do Repositório de Vetores do MongoDB fornece um mapeador padrão ao mapear dados do modelo de dados para o armazenamento.

Esse mapeador faz uma conversão direta da lista de propriedades no modelo de dados para os campos no MongoDB e usa MongoDB.Bson.Serialization para converter para o esquema de armazenamento. Isso significa que o uso do MongoDB.Bson.Serialization.Attributes.BsonElement será suportado se um nome de armazenamento diferente do nome da propriedade do modelo de dados for necessário. A única exceção é a chave do registro que é mapeada para um campo de banco de dados chamado _id, já que todos os registros do MongoDB devem usar esse nome para ids.

Substituição do nome da propriedade

Para propriedades de dados e propriedades de vetor, você pode fornecer nomes de campo de substituição a serem usados no armazenamento que sejam diferentes dos nomes de propriedade no modelo de dados. Isso não é suportado para chaves, pois uma chave tem um nome fixo no MongoDB.

A substituição do nome da propriedade é feita definindo o BsonElement atributo nas propriedades do modelo de dados.

Aqui está um exemplo de um modelo de dados com BsonElement set.

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

Introdução

Adicione as dependências do Repositório de Vetores do Atlas do MongoDB ao seu ambiente. Ele precisa do pacote pymongo que está incluído nos extras do mongo; você precisa instalar usando esses extras.

pip install semantic-kernel[mongo]

Em seguida, você pode criar o repositório de vetores.

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

Como alternativa, você também pode passar seu próprio cliente MongoDB se quiser ter mais controle sobre a construção do cliente.

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

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

Quando um cliente é passado, o Kernel Semântico não fechará a conexão para você, portanto, você precisa garantir que a feche, por exemplo, com uma instrução async with.

Você também pode criar uma coleção diretamente, sem a loja.

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",
)

Serialização

Como o conector do Atlas do MongoDB precisa de um dicionário simples com os campos correspondentes ao índice como entrada, a serialização é bastante simples, ela usa apenas uma chave predeterminada _id, então substituímos a chave do modelo de dados por esta chave, se ainda não for _id.

Para obter mais detalhes sobre esse conceito, consulte a documentação de serialização.

Em breve

Mais informações em breve.