Utilizar o conector de repositório vetorial do Azure DocumentDB (com compatibilidade com MongoDB) (Pré-visualização)

Aviso

A funcionalidade do Azure DocumentDB Vector Store está em pré-visualização, e melhorias que exijam alterações disruptivas podem ainda ocorrer em circunstâncias limitadas antes do lançamento.

Aviso

A funcionalidade da loja de vetores do Kernel Semântico está em versão prévia, e melhorias que exigem alterações de impacto ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Aviso

A funcionalidade da loja de vetores do Kernel Semântico está em versão prévia, e melhorias que exigem alterações de impacto ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Descrição geral

O conector Azure CosmosDB MongoDB Vector Store pode ser usado para aceder e gerir dados no Azure DocumentDB. O conector tem as seguintes características.

Área de funcionalidades Suporte
Mapeamento da coleção para Azure DocumentDB Coleção + Índice
Tipos de propriedade de chave suportados cadeia (de caracteres)
Tipos de propriedade de dados suportados
  • cadeia (de caracteres)
  • Int
  • longo
  • duplo
  • float
  • decimal
  • booleano
  • Data e Hora
  • e enumeráveis de cada um destes tipos
Tipos de propriedade vetorial suportados
  • ReadOnlyMemory
  • Flutuador de incorporação<>
  • flutuar[]
Tipos de índice suportados
  • Hnsw
  • IvfFlat
Funções de distância suportadas
  • CosineDistância
  • DotProductSimilarity
  • Distância Euclidiana
Cláusulas de filtro suportadas
  • EqualTo
Suporta vários vetores em um registro Sim
IsIndexed é suportado? Sim
"É suportado IsFullTextIndexed?" Não
Está StorageName suportado? Não, use BsonElementAttribute em vez disso. Veja aqui mais informações.
O HybridSearch é suportado? Não
Área de funcionalidades Suporte
Mapeamento da coleção para Azure DocumentDB Coleção + Índice
Tipos de propriedade de chave suportados cadeia (de caracteres)
Tipos de propriedade de dados suportados
  • cadeia (de caracteres)
  • Int
  • longo
  • duplo
  • float
  • decimal
  • booleano
  • Data e Hora
  • e iteráveis de cada um desses tipos
Tipos de propriedade vetorial suportados
  • lista[float]
  • lista[int]
  • ndarray
Tipos de índice suportados
  • Hnsw
  • IvfFlat
Funções de distância suportadas
  • CosineDistância
  • DotProductSimilarity
  • Distância Euclidiana
Cláusulas de filtro suportadas
  • EqualTo
  • AnyTagsEqualTo
Suporta vários vetores em um registro Sim
IsFilterable é suportado? Sim
IsFullTextSearchable é suportado? Não

Mais informações em breve.

Limitações

Este conector é compatível com o Azure DocumentDB e não foi concebido para ser compatível com o Azure Cosmos DB MongoDB (RU).

Introdução

Adicione o pacote NuGet do conector do Azure CosmosDB MongoDB Vetor Store ao seu projeto.

dotnet add package CommunityToolkit.VectorData.AzureDocumentDB

Pode adicionar o armazenamento vetorial ao contentor de injeção de dependências disponível no KernelBuilder ou ao IServiceCollection contentor de injeção de dependências usando métodos de extensão fornecidos pelo pacote conector.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;

// Using Kernel Builder.
var kernelBuilder = Kernel
    .CreateBuilder();
kernelBuilder.Services
    .AddDocumentDBVectorStore(connectionString, databaseName);
using Microsoft.Extensions.DependencyInjection;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCosmosMongoVectorStore(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 no contentor de injeção de dependência.

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

// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.Services.AddSingleton<IMongoDatabase>(
    sp =>
    {
        var mongoClient = new MongoClient(connectionString);
        return mongoClient.GetDatabase(databaseName);
    });
kernelBuilder.Services.AddCosmosMongoVectorStore();
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.AddCosmosMongoVectorStore();

Você pode construir uma instância do Azure CosmosDB MongoDB Vetor Store diretamente.

using CommunityToolkit.VectorData.CosmosMongoDB;
using MongoDB.Driver;

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

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

using CommunityToolkit.VectorData.CosmosMongoDB;
using MongoDB.Driver;

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

Mapeamento de dados

O conector do Azure CosmosDB MongoDB Vetor Store 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 Azure CosmosDB MongoDB e usa MongoDB.Bson.Serialization para converter para o esquema de armazenamento. Isso significa que o uso do MongoDB.Bson.Serialization.Attributes.BsonElement é suportado se for necessário um nome de armazenamento diferente para o nome da propriedade do modelo de dados. A única exceção é a chave do registro que é mapeada para um campo de banco de dados chamado _id, já que todos os registros MongoDB do CosmosDB 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 para uso no armazenamento que sejam diferentes dos nomes de propriedade no modelo de dados. Isso não é suportado para chaves, uma vez que 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 definido.

using Microsoft.Extensions.VectorData;

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.CosineDistance, IndexKind = IndexKind.Hnsw)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}

Introdução

Adicione as dependências do Azure CosmosDB MongoDB Vetor Store ao seu ambiente. Como o conector MongoDB do Azure CosmosDB é baseado no conector MongoDB Atlas e usa o mesmo cliente, é necessário instalar com os seguintes extras:

pip install semantic-kernel[azure, mongo]

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

from semantic_kernel.connectors.azure_cosmos_db import CosmosMongoStore

# If the right environment settings are set, namely AZURE_COSMOS_DB_MONGODB_CONNECTION_STRING and optionally AZURE_COSMOS_DB_MONGODB_DATABASE_NAME, this is enough to create the Store:
store = CosmosMongoStore()

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

from pymongo import AsyncMongoClient
from semantic_kernel.connectors.azure_cosmos_db import CosmosMongoStore

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

Quando um cliente é fornecido, o Kernel Semântico não fechará a conexão para você, então você precisa garantir que vai fechá-la, por exemplo, com uma instrução async with.

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

from semantic_kernel.connectors.azure_cosmos_db import CosmosMongoCollection

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

Serialização

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

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

Brevemente

Mais informações em breve.