Usar el conector de almacén de vectores Weaviate (versión preliminar)

Advertencia

La funcionalidad Weaviate Vector Store está en versión preliminar y las mejoras que requieren cambios importantes pueden producirse en circunstancias limitadas antes del lanzamiento.

Advertencia

La funcionalidad de almacenamiento de vectores del kernel semántico se encuentra en versión preliminar y las mejoras que requieren modificaciones significativas pueden producirse en circunstancias limitadas antes de su lanzamiento.

Advertencia

La funcionalidad de almacenamiento de vectores del kernel semántico se encuentra en versión preliminar y las mejoras que requieren modificaciones significativas pueden producirse en circunstancias limitadas antes de su lanzamiento.

Información general

El conector Weaviate Vector Store se puede usar para acceder a los datos de Weaviate y administrarlos. El conector tiene las siguientes características.

Área de características Soporte técnico
La colección asigna a Colección Weaviate
Tipos de propiedades de clave admitidos Guid
Tipos de propiedad de datos admitidos
  • cuerda / cadena
  • byte
  • short
  • int
  • long
  • double
  • FLOAT
  • decimal
  • booleano
  • Fecha y Hora
  • DateTimeOffset
  • Guid
  • y elementos enumerables de cada uno de estos tipos
Tipos de propiedades vectoriales admitidos
  • Memoria de solo lectura<float>
  • Embedding<float>
  • float[]
Tipos de índice admitidos
  • Hnsw
  • Plano
  • Dinámica
Funciones de distancia compatibles
  • CosineDistance
  • NegativeDotProductSimilarity
  • EuclideanSquaredDistance
  • Distancia de Hamming
  • ManhattanDistance
Cláusulas de filtro admitidas
  • AnyTagEqualTo
  • EqualTo
Admite varios vectores en un registro
¿Está IsIndexed soportado?
¿Está IsFullTextIndexed soportado?
¿Se admite StorageName? No, use JsonSerializerOptions y JsonPropertyNameAttribute en su lugar. Consulta aquí para obtener más información.
¿Se admite HybridSearch?
Área de características Soporte técnico
La colección asigna a Colección Weaviate
Tipos de propiedades de clave admitidos Guid
Tipos de propiedad de datos admitidos
  • cuerda / cadena
  • byte
  • short
  • int
  • long
  • double
  • FLOAT
  • decimal
  • booleano
  • e elementos iterables de cada uno de estos tipos
Tipos de propiedades vectoriales admitidos
  • lista[flotante]
  • lista[int]
  • ndarray
Tipos de índice admitidos
  • Hnsw
  • Plano
  • Dinámica
Funciones de distancia compatibles
  • CosineDistance
  • NegativeDotProductSimilarity
  • EuclideanSquaredDistance
  • Hamming
  • ManhattanDistance
Cláusulas de filtro admitidas
  • AnyTagEqualTo
  • EqualTo
Admite varios vectores en un registro
¿Se admite IsFilterable?
¿Se admite IsFullTextSearchable?

Próximamente.

Limitaciones

Limitaciones notables de la funcionalidad del conector Weaviate.

Área de características Solución alternativa
No se admite el uso de la propiedad 'vector' para objetos de vector único En su lugar, se admite el uso de la propiedad "vectors".

Advertencia

Weaviate requiere que los nombres de las colecciones empiecen con una letra inicial mayúscula. Si no proporciona un nombre de colección con una letra mayúscula, Weaviate devolverá un error al intentar crear la colección. El error que verá es Cannot query field "mycollection" on type "GetObjectsObj". Did you mean "Mycollection"? donde mycollection es el nombre de la colección. En este ejemplo, si cambia el nombre de la colección a Mycollection en su lugar, se corregirá el error.

Comenzar

Agregue el paquete NuGet del conector Weaviate Vector Store a su proyecto.

dotnet add package CommunityToolkit.VectorData.Weaviate

Puede agregar el almacén de vectores al contenedor de inserción de dependencias disponible en KernelBuilder o al IServiceCollection contenedor de inserción de dependencias mediante métodos de extensión proporcionados por el paquete del conector. El almacén de vectores de Weaviate usa un HttpClient para comunicarse con el servicio Weaviate. Hay dos opciones para proporcionar la dirección URL o el punto de conexión para el servicio Weaviate. Se puede proporcionar mediante opciones o estableciendo la dirección base de HttpClient.

En este primer ejemplo se muestra cómo establecer la dirección URL del servicio a través de opciones. Tenga en cuenta también que estos métodos recuperarán una instancia HttpClient para realizar llamadas al servicio Weaviate desde el proveedor de servicios de inserción de dependencias.

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

// Using Kernel Builder.
var kernelBuilder = Kernel
    .CreateBuilder();
kernelBuilder.Services
    .AddWeaviateVectorStore(new Uri("http://localhost:8080/v1/"), apiKey: null);
using Microsoft.Extensions.DependencyInjection;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddWeaviateVectorStore(new Uri("http://localhost:8080/v1/"), apiKey: null);

También se proporcionan sobrecargas en las que puede especificar su propio HttpClient. En este caso, es posible establecer la dirección URL del servicio a través de la HttpClientBaseAddress opción .

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

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

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

También puede construir directamente una instancia de almacenamiento de vectores de Weaviate.

using System.Net.Http;
using CommunityToolkit.VectorData.Weaviate;

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

Es posible construir una referencia directa a una colección con nombre.

using System.Net.Http;
using CommunityToolkit.VectorData.Weaviate;

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

Si es necesario, es posible pasar una clave de API, como opción, al usar cualquiera de los mecanismos mencionados anteriormente, por ejemplo.

using Microsoft.SemanticKernel;

var kernelBuilder = Kernel
    .CreateBuilder();
kernelBuilder.Services
    .AddWeaviateVectorStore(new Uri("http://localhost:8080/v1/"), secretVar);

Asignación de datos

El conector de almacenamiento de vectores de Weaviate proporciona un asignador predeterminado al realizar la asignación desde el modelo de datos al almacenamiento. Weaviate requiere que las propiedades se asignen a agrupaciones id, payload y vectors. El asignador predeterminado usa las anotaciones del modelo o la definición de registro para determinar el tipo de cada propiedad y para realizar esta asignación.

  • La propiedad del modelo de datos anotada como clave se asignará a la propiedad Weaviate id .
  • Las propiedades del modelo de datos anotadas como datos se asignarán al objeto Weaviate properties .
  • Las propiedades del modelo de datos anotadas como vectores se asignarán al objeto Weaviate vectors .

El asignador predeterminado usa System.Text.Json.JsonSerializer para convertir al esquema de almacenamiento. Esto significa que el uso de JsonPropertyNameAttribute se admite si se requiere un nombre de almacenamiento diferente al nombre de la propiedad del modelo de datos.

Este es un ejemplo de un modelo de datos con JsonPropertyNameAttribute configurado y cómo se representará en Weaviate.

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

public class Hotel
{
    [VectorStoreKey]
    public Guid HotelId { get; set; }

    [VectorStoreData(IsIndexed = true)]
    public string HotelName { get; set; }

    [VectorStoreData(IsFullTextIndexed = true)]
    public string Description { get; set; }

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

Introducción

Agregue las dependencias del conector Weaviate Vector Store a su proyecto.

pip install semantic-kernel[weaviate]

A continuación, puede crear el almacén de vectores, usa la configuración del entorno para conectarse:

Para usar Weaviate Cloud:

  • url: WEAVIATE_URL
  • api_key: WEAVIATE_API_KEY

Para usar Weaviate Local (es decir, Weaviate en un contenedor de Docker):

  • local_host: WEAVIATE_LOCAL_HOST
  • local_port: WEAVIATE_LOCAL_PORT
  • local_grpc_port: WEAVIATE_LOCAL_GRPC_PORT

Si desea usar insertado:

  • use_embed: WEAVIATE_USE_EMBED

Deben establecerse exclusivamente, de modo que solo haya un conjunto de los anteriores; de lo contrario, generará una excepción.

from semantic_kernel.connectors.weaviate import WeaviateStore

store = WeaviateStore()

Como alternativa, también puede pasar su propio cliente de MongoDB si desea tener más control sobre la construcción del cliente.

import weaviate
from semantic_kernel.connectors.weaviate import WeaviateStore

client = weaviate.WeaviateAsyncClient(...)
store = WeaviateStore(async_client=client)

También puede crear una colección directamente, sin el almacén.

from semantic_kernel.connectors.weaviate import WeaviateCollection

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

Serialización

El cliente Weaviate devuelve sus propios objetos que se analizan y se convierten en dicts en el flujo normal, para obtener más detalles sobre este concepto, consulte la documentación de serialización de .

Próximamente

Más información próximamente.