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 |
|
Tipos de propriedade de vetor com suporte |
|
Tipos de índice com suporte |
|
Funções de distância suportadas |
|
Cláusulas de filtro com suporte |
|
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 HttpClient
BaseAddress
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.