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 |
|
Types de propriétés de données pris en charge |
|
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 |
|
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.