Usando o conector Weaviate Vetor Store (Visualização)
Aviso
A funcionalidade Semantic Kernel Vetor Store está em pré-visualização, e melhorias que exigem alterações de quebra ainda podem ocorrer em circunstâncias limitadas antes do lançamento.
Descrição geral
O conector Weaviate Vetor Store pode ser usado para acessar e gerenciar dados no Weaviate. O conector tem as seguintes características.
Área de funcionalidades | Suporte |
---|---|
Mapas da coleção para | Coleção Weaviate |
Tipos de propriedade de chave suportados | GUID |
Tipos de propriedade de dados suportados |
|
Tipos de propriedade vetorial suportados |
|
Tipos de índice suportados |
|
Funções de distância suportadas |
|
Cláusulas de filtro suportadas |
|
Suporta vários vetores em um registro | Sim |
IsFilterable suportado? | Sim |
IsFullTextSearchable suportado? | Sim |
StoragePropertyName suportado? | Não, use JsonSerializerOptions e JsonPropertyNameAttribute em vez disso.
Veja aqui mais informações. |
Limitações
Limitações notáveis da funcionalidade do conector Weaviate.
Área de funcionalidades | Solução |
---|---|
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 os nomes das coleções comecem com uma letra maiúscula. Se você não fornecer um nome de coleção com uma letra maiúscula, o Weaviate retornará um erro quando você tentar criar sua coleção. O erro que você verá é Cannot query field "mycollection" on type "GetObjectsObj". Did you mean "Mycollection"?
onde mycollection
é o nome da sua 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 Weaviate Vetor Store ao seu projeto.
dotnet add package Microsoft.SemanticKernel.Connectors.Weaviate --prerelease
Você pode adicionar o armazenamento vetorial ao contêiner de injeção de dependência disponível no KernelBuilder
ou ao contêiner de IServiceCollection
injeção de dependência usando métodos de extensão fornecidos pelo Semantic Kernel.
O repositório de vetores Weaviate usa um HttpClient
para se comunicar com o serviço Weaviate. Há duas opções para fornecer a URL/ponto de extremidade para o serviço Weaviate.
Pode ser fornecido através 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 onde você pode especificar o seu próprio HttpClient
também são fornecidas.
Neste caso, é possível definir o 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 Vetor 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 chave de api, como opção, ao usar qualquer um dos mecanismos acima mencionados, 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 Weaviate Vetor Store fornece um mapeador padrão ao mapear do modelo de dados para o armazenamento. Weaviate requer que as propriedades sejam mapeadas em id, carga útil e agrupamentos de vetores. O mapeador padrão usa as anotações de 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 JsonPropertyNameAttribute
uso do é suportado se um nome de armazenamento diferente para o 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.EuclideanDistance, 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],
}
}
Brevemente
Mais informações em breve.
Brevemente
Mais informações em breve.