Partager via


Utilisation du connecteur Weaviate Vector Store (préversion)

Avertissement

La fonctionnalité de magasin de vecteurs du noyau sémantique est en aperçu, et des améliorations nécessitant des modifications importantes peuvent encore intervenir dans des circonstances limitées avant la sortie officielle.

Vue d’ensemble

Le connecteur Weaviate Vector Store peut être utilisé pour accéder aux données et les gérer dans Weaviate. Le connecteur présente les caractéristiques suivantes.

Zone des fonctionnalités Support
Correspondances de collection à Weaviate Collection
Types de propriétés de clé pris en charge Guid
Types de propriétés de données pris en charge
  • string
  • byte
  • short
  • int
  • long
  • double
  • flottant
  • décimal
  • bool
  • Date/Heure
  • DateTimeOffset
  • Guide
  • et les objets énumérables de chacun de ces types
Types de propriétés vectorielles pris en charge
  • ReadOnlyMemory
  • ReadOnlyMemory<double>
Types d’index pris en charge
  • Hnsw
  • Plat
  • Dynamique
Fonctions de distance prises en charge
  • CosineDistance
  • Similarité de Produit Scalaire Négatif
  • EuclideanSquaredDistance
  • Hamming
  • ManhattanDistance
Clauses de filtre prises en charge
  • AnyTagEqualTo
  • EqualTo
Prend en charge plusieurs vecteurs dans un enregistrement Oui
IsFilterable est-il pris en charge ? Oui
IsFullTextSearchable est-il pris en charge ? Oui
Le "StoragePropertyName" est-il pris en charge ? Non, utilisez JsonSerializerOptions et JsonPropertyNameAttribute à la place. Pour plus d’informations, voir ici.
HybridSearch est-il pris en charge ? Oui
Zone de Fonctionnalité Soutien
Correspondance des collections à Weaviate Collection
Types de propriétés de clé pris en charge Guid
Types de propriétés de données pris en charge
  • string
  • byte
  • short
  • int
  • long
  • double
  • flotter
  • décimal
  • bool
  • et itérables de chacun de ces types
Types de propriétés vectorielles pris en charge
  • liste[flottant]
  • liste[int]
  • ndarray
Types d’index pris en charge
  • Hnsw
  • Plat
  • Dynamique
Fonctions de distance prises en charge
  • CosineDistance
  • Similarité de Produit Scalaire Négatif
  • EuclideanSquaredDistance
  • Hamming
  • ManhattanDistance
Clauses de filtre prises en charge
  • AnyTagEqualTo
  • EqualTo
Prend en charge plusieurs vecteurs dans un enregistrement Oui
"La fonctionnalité IsFilterable est-elle prise en charge ?" Oui
La prise en charge d’IsFullTextSearchable est-elle assurée ? Oui

À venir.

Limites

Limitations notables des fonctionnalités du connecteur Weaviate.

Zone Fonctionnalités Solution de contournement
L’utilisation de la propriété « vector » pour les objets vectoriels uniques n’est pas prise en charge L’utilisation de la propriété « vectors » est supportée à la place.

Avertissement

Weaviate exige que les noms de collection commencent par une lettre majuscule. Si vous ne fournissez pas de nom de collection avec une lettre majuscule, Weaviate renvoie une erreur lorsque vous essayez de créer votre collection. L’erreur que vous verrez est Cannot query field "mycollection" on type "GetObjectsObj". Did you mean "Mycollection"?mycollection est votre nom de collection. Dans cet exemple, si vous remplacez le nom de votre collection par Mycollection, cela corrige l’erreur.

Mise en route

Ajoutez le package NuGet du connecteur Weaviate Vector Store à votre projet.

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

Vous pouvez ajouter le magasin de vecteurs au conteneur d’injection de dépendances disponible sur le KernelBuilder, ou bien au IServiceCollection, en utilisant les méthodes d’extension fournies par le noyau sémantique. Le magasin vectoriel Weaviate utilise un HttpClient pour communiquer avec le service Weaviate. Il existe deux options pour fournir l’URL/point de terminaison du service Weaviate. Il peut être fourni via des options ou en définissant l’adresse de base du HttpClient.

Ce premier exemple montre comment définir l’URL du service via des options. Notez également que ces méthodes récupèrent une HttpClient instance pour effectuer des appels au service Weaviate à partir du fournisseur de services d’injection de dépendances.

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

Des surcharges vous permettant de spécifier vos propres HttpClient sont également disponibles. Dans ce cas, il est possible de définir l’URL du service via l’option HttpClientBaseAddress .

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

Vous pouvez également construire une instance Weaviate Vector Store directement.

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

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

Il est possible de construire une référence directe à une collection nommée.

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

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

Si nécessaire, il est possible de passer une clé API, comme option, lors de l’utilisation de l’un des mécanismes mentionnés ci-dessus, par exemple.

using Microsoft.SemanticKernel;

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

Mappage de données

Le connecteur Weaviate Vector Store fournit un mappeur par défaut lors du mappage du modèle de données au stockage. Weaviate exige que les propriétés soient mappées en regroupements id, charge utile et vecteurs. Le mappeur par défaut utilise les annotations de modèle ou la définition d’enregistrement pour déterminer le type de chaque propriété et effectuer ce mappage.

  • La propriété de modèle de données annotée en tant que clé sera mappée à la propriété Weaviate id .
  • Les propriétés du modèle de données annotées en tant que données seront mappées à l’objet Weaviate properties .
  • Les propriétés du modèle de données annotées sous forme de vecteurs sont mappées à l’objet Weaviate vectors .

Le mappeur par défaut utilise System.Text.Json.JsonSerializer pour convertir le schéma de stockage. Cela signifie que l’utilisation de l’objet JsonPropertyNameAttribute est prise en charge si un nom de stockage différent du nom de propriété du modèle de données est requis.

Voici un exemple de modèle de données avec JsonPropertyNameAttribute ensemble et comment cela sera représenté dans 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],
    }
}

::: fin de zone

Pour commencer

Ajoutez les dépendances du connecteur Weaviate Vector Store à votre projet.

pip install semantic-kernel[weaviate]

Vous pouvez ensuite créer le magasin vectoriel, il utilise les paramètres d’environnement pour se connecter :

Pour utiliser Weaviate Cloud :

  • url : WEAVIATE_URL
  • api_key : WEAVIATE_API_KEY

Pour utiliser Weaviate Local (par exemple, Weaviate dans un conteneur Docker) :

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

Si vous souhaitez utiliser intégré, procédez comme suit :

  • use_embed : WEAVIATE_USE_EMBED

Ceux-ci doivent être définis exclusivement, de sorte qu’un seul ensemble de ce qui précède est présent, sinon il déclenchera une exception.

from semantic_kernel.connectors.memory.weaviate import WeaviateStore

store = WeaviateStore()

Vous pouvez également passer votre propre client MongoDB si vous souhaitez avoir plus de contrôle sur la construction du client.

import weaviate
from semantic_kernel.connectors.memory.weaviate import WeaviateStore

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

Vous pouvez également créer une collection directement, sans le magasin.

from semantic_kernel.connectors.memory.weaviate import WeaviateCollection

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

Sérialisation

Le client Weaviate retourne ses propres objets qui sont analysés et transformés en dictes dans le flux normal, pour plus d’informations sur ce concept, consultez la documentation de sérialisation .

Bientôt disponible

Plus d’informations prochainement.