Compartilhar via


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

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 Weaviate Vector Store pode ser usado para acessar e gerenciar dados no Weaviate. O conector tem as seguintes características.

Área de recurso Suporte
A coleção é mapeada para Coleção Weaviate
Tipos de propriedade de chave com suporte Guid
Tipos de propriedade de dados com suporte
  • string
  • byte
  • short
  • INT
  • longo
  • duplo
  • float
  • decimal
  • bool
  • Datetime
  • DateTimeOffset
  • Guid
  • e enumeráveis de cada um desses tipos
Tipos de propriedade de vetor com suporte
  • Float ReadOnlyMemory<>
  • ReadOnlyMemory<duplo>
Tipos de índice com suporte
  • Hnsw
  • Plano
  • Dinâmico
Funções de distância suportadas
  • Distância do cosseno
  • Semelhança de Produto Escalar Negativo
  • EuclidianoDistânciaQuadrada
  • Hamming
  • ManhattanDistância
Cláusulas de filtro com suporte
  • AnyTagEqualTo
  • EqualTo
Suporta vários vetores em um registro Sim
IsFilterable suportado? Sim
IsFullTextSearchable suportado? Sim
StoragePropertyName com suporte? Não, use JsonSerializerOptions e JsonPropertyNameAttribute em vez disso. Veja aqui para mais informações.

Limitações

Limitações notáveis da funcionalidade do conector do Weaviate.

Área de recurso Solução alternativa
Não há suporte para o uso da propriedade 'vector' para objetos de vetor único Em vez disso, há suporte para o uso da propriedade 'vectors'.

Aviso

Weaviate requer que nomes de coleção comecem com letra maiúscula. Se você não fornecer um nome de coleção com uma letra maiúscula, o Weaviate retornará um erro ao tentar criar sua coleção. O erro que você verá é Cannot query field "mycollection" on type "GetObjectsObj". Did you mean "Mycollection"? em que mycollection é o nome da coleção. Neste exemplo, se você alterar o nome da coleção para Mycollection, isso corrigirá o erro.

Introdução

Adicione o pacote NuGet do conector do Weaviate Vector Store ao seu projeto.

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

Você pode adicionar o repositório de vetores ao contêiner de injeção de dependência disponível no KernelBuilder ou ao IServiceCollection contêiner de injeção de dependência usando métodos de extensão fornecidos pelo Semantic Kernel. O repositório de vetores do Weaviate usa um HttpClient para se comunicar com o serviço do Weaviate. Há duas opções para fornecer o URL/endpoint para o serviço Weaviate. Ele pode ser fornecido por meio de opções ou definindo o endereço base do HttpClient.

Este primeiro exemplo mostra como definir a URL do serviço por meio de opções. Observe também que esses métodos recuperarão uma HttpClient instância para fazer chamadas para o serviço Weaviate do provedor de serviços de injeção de dependência.

using Microsoft.SemanticKernel;

// Using Kernel Builder.
var kernelBuilder = Kernel
    .CreateBuilder()
    .AddWeaviateVectorStore(options: new() { Endpoint = new Uri("http://localhost:8080/v1/") });
using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddWeaviateVectorStore(options: new() { Endpoint = new Uri("http://localhost:8080/v1/") });

Sobrecargas em que você pode especificar suas próprias HttpClient também são fornecidas. Neste caso, é possível definir a url do serviço através da HttpClientBaseAddress opção.

using System.Net.Http;
using Microsoft.SemanticKernel;

// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
using HttpClient client = new HttpClient { BaseAddress = new Uri("http://localhost:8080/v1/") };
kernelBuilder.AddWeaviateVectorStore(client);
using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
using HttpClient client = new HttpClient { BaseAddress = new Uri("http://localhost:8080/v1/") };
builder.Services.AddWeaviateVectorStore(client);

Você também pode construir uma instância do Weaviate Vector Store diretamente.

using System.Net.Http;
using Microsoft.SemanticKernel.Connectors.Weaviate;

var vectorStore = new WeaviateVectorStore(
    new HttpClient { BaseAddress = new Uri("http://localhost:8080/v1/") });

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

using System.Net.Http;
using Microsoft.SemanticKernel.Connectors.Weaviate;

var collection = new WeaviateVectorStoreRecordCollection<Hotel>(
    new HttpClient { BaseAddress = new Uri("http://localhost:8080/v1/") },
    "Skhotels");

Se necessário, é possível passar uma Api Key, como opção, ao usar qualquer um dos mecanismos mencionados acima, por exemplo,

using Microsoft.SemanticKernel;

var kernelBuilder = Kernel
    .CreateBuilder()
    .AddWeaviateVectorStore(options: new() { Endpoint = new Uri("http://localhost:8080/v1/"), ApiKey = secretVar });

Mapeamento de dados

O conector do Weaviate Vector Store fornece um mapeador padrão ao mapear do modelo de dados para o armazenamento. O Weaviate requer que as propriedades sejam mapeadas em agrupamentos de id, payload e vetores. O mapeador padrão usa as anotações do modelo ou a definição de registro para determinar o tipo de cada propriedade e fazer esse mapeamento.

  • A propriedade do modelo de dados anotada como uma chave será mapeada para a propriedade Weaviate id .
  • As propriedades do modelo de dados anotadas como dados serão mapeadas para o objeto Weaviate properties .
  • As propriedades do modelo de dados anotadas como vetores serão mapeadas para o objeto Weaviate vectors .

O mapeador padrão usa System.Text.Json.JsonSerializer para converter para o esquema de armazenamento. Isso significa que o uso do JsonPropertyNameAttribute será suportado se um nome de armazenamento diferente do nome da propriedade do modelo de dados for necessário.

Aqui está um exemplo de um modelo de dados com JsonPropertyNameAttribute conjunto e como isso será representado no Weaviate.

using System.Text.Json.Serialization;
using Microsoft.Extensions.VectorData;

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

    [VectorStoreRecordData(IsFilterable = true)]
    public string HotelName { get; set; }

    [VectorStoreRecordData(IsFullTextSearchable = true)]
    public string Description { get; set; }

    [JsonPropertyName("HOTEL_DESCRIPTION_EMBEDDING")]
    [VectorStoreRecordVector(4, DistanceFunction.CosineDistance, IndexKind.QuantizedFlat)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
{
    "id": 1,
    "properties": { "HotelName": "Hotel Happy", "Description": "A place where everyone can be happy." },
    "vectors": {
        "HOTEL_DESCRIPTION_EMBEDDING": [0.9, 0.1, 0.1, 0.1],
    }
}

Em breve

Mais informações em breve.

Em breve

Mais informações em breve.