Partager via


Utilisation du connecteur SQLite Vector Store (préversion)

Avertissement

La fonctionnalité de magasin de vecteurs du noyau sémantique est en préversion et des améliorations nécessitant des modifications cassants peuvent toujours se produire dans des circonstances limitées avant la mise en production.

Vue d’ensemble

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

Zone Fonctionnalités Support
Mappages de collection à Table SQLite
Types de propriétés de clé pris en charge
  • ulong
  • string
Types de propriétés de données pris en charge
  • int
  • long
  • ulong
  • short
  • ushort
  • string
  • bool
  • virgule flottante
  • double
  • decimal
  • byte[]
Types de propriétés vectorielles pris en charge Float ReadOnlyMemory<>
Types d’index pris en charge S/O
Fonctions de distance prises en charge
  • CosineDistance
  • ManhattanDistance
  • EuclideanDistance
Prend en charge plusieurs vecteurs dans un enregistrement Oui
Est-il pris en charge ? Non
IsFullTextSearchable pris en charge ? Non
StoragePropertyName pris en charge ? Oui

Limites

SQLite ne prend pas en charge la recherche vectorielle prête à l’emploi. L’extension SQLite doit d’abord être chargée pour activer la fonctionnalité de recherche vectorielle. L’implémentation actuelle du connecteur SQLite est compatible avec l’extension de recherche vectorielle sqlite-vec .

Pour installer l’extension, utilisez l’une des versions avec la version d’extension spécifique de votre choix. Il est possible d’obtenir une version précompilée avec le install.sh script. Ce script produit vec0.dll, qui doit se trouver dans le même dossier que l’application en cours d’exécution. Cela permet à l’application d’appeler la SqliteConnection.LoadExtension("vec0") méthode et de charger l’extension de recherche vectorielle.

Mise en route

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

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

Vous pouvez ajouter le magasin de vecteurs au conteneur d’injection de dépendances à l’aide IServiceCollection de méthodes d’extension fournies par le noyau sémantique.

Dans ce cas, une instance de la Microsoft.Data.Sqlite.SqliteConnection classe est initialisée, la connexion est ouverte et l’extension de recherche vectorielle est chargée. Le nom de l’extension de recherche vectorielle par défaut est vec0, mais il peut être substitué à l’aide de la SqliteVectorStoreOptions.VectorSearchExtensionName propriété.

using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSqliteVectorStore("Data Source=:memory:");

Les méthodes d’extension qui ne prennent aucun paramètre sont également fournies. Celles-ci nécessitent qu’une instance de la Microsoft.Data.Sqlite.SqliteConnection classe soit inscrite séparément auprès du conteneur d’injection de dépendances.

Dans ce cas, la connexion est ouverte uniquement si elle n’a pas été ouverte avant et que la méthode d’extension suppose que l’extension de recherche vectorielle a déjà été chargée pour l’instance inscrite Microsoft.Data.Sqlite.SqliteConnection .

using Microsoft.Data.Sqlite;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<SqliteConnection>(sp => 
{
    var connection = new SqliteConnection("Data Source=:memory:");

    connection.LoadExtension("vector-search-extension-name");

    return connection;
});

builder.Services.AddSqliteVectorStore();

Vous pouvez construire une instance SQLite Vector Store directement.

using Microsoft.Data.Sqlite;
using Microsoft.SemanticKernel.Connectors.Sqlite;

var connection = new SqliteConnection("Data Source=:memory:");

connection.LoadExtension("vector-search-extension-name");

var vectorStore = new SqliteVectorStore(connection);

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

using Microsoft.Data.Sqlite;
using Microsoft.SemanticKernel.Connectors.Sqlite;

var connection = new SqliteConnection("Data Source=:memory:");

connection.LoadExtension("vector-search-extension-name");

var collection = new SqliteVectorStoreRecordCollection<Hotel>(connection, "skhotels");

Mappage de données

Le connecteur SQLite Vector Store fournit un mappeur par défaut lors du mappage du modèle de données au stockage. Ce mappeur effectue une conversion directe de la liste des propriétés du modèle de données vers les colonnes dans SQLite.

Il est également possible de remplacer le comportement du mappeur par défaut en fournissant un mappeur personnalisé via la SqliteVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper propriété.

Avec l’extension de recherche vectorielle, les vecteurs sont stockés dans des tables virtuelles, séparément des propriétés de clé et de données. Par défaut, la table virtuelle avec des vecteurs utilise le même nom que la table avec des propriétés de clé et de données, mais avec un vec_ préfixe. Par exemple, si le nom de la collection est SqliteVectorStoreRecordCollection skhotels, le nom de la table virtuelle avec des vecteurs est vec_skhotels. Il est possible de remplacer le nom de la table virtuelle à l’aide des propriétés ou SqliteVectorStoreRecordCollectionOptions<TRecord>.VectorVirtualTableName des SqliteVectorStoreOptions.VectorVirtualTableName propriétés.

Remplacement du nom de propriété

Vous pouvez remplacer les noms de propriétés à utiliser dans le stockage différent des noms de propriétés sur le modèle de données. Le remplacement du nom de propriété est effectué en définissant l’option StoragePropertyName via les attributs de propriété du modèle de données ou la définition d’enregistrement.

Voici un exemple de modèle de données avec StoragePropertyName défini sur ses attributs et comment cela sera représenté dans la requête SQLite.

using Microsoft.Extensions.VectorData;

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

    [VectorStoreRecordData(StoragePropertyName = "hotel_name")]
    public string? HotelName { get; set; }

    [VectorStoreRecordData(StoragePropertyName = "hotel_description")]
    public string? Description { get; set; }

    [VectorStoreRecordVector(Dimensions: 4, DistanceFunction.CosineDistance)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
CREATE TABLE Hotels (
    HotelId INTEGER PRIMARY KEY,
    hotel_name TEXT,
    hotel_description TEXT
);

CREATE VIRTUAL TABLE vec_Hotels (
    HotelId INTEGER PRIMARY KEY,
    DescriptionEmbedding FLOAT[4] distance_metric=cosine
);

Bientôt disponible

Plus d’informations prochainement.

Bientôt disponible

Plus d’informations prochainement.