Uso del conector de almacén de vectores de SQLite (versión preliminar)
Advertencia
La funcionalidad Almacén de vectores de kernel semántico está en versión preliminar y las mejoras que requieren cambios importantes pueden producirse en circunstancias limitadas antes de la versión.
Información general
El conector del almacén de vectores de SQLite se puede usar para acceder a los datos y administrarlos en SQLite. El conector tiene las siguientes características.
Área de características | Soporte técnico |
---|---|
La colección se asigna a | Tabla SQLite |
Tipos de propiedades de clave admitidos |
|
Tipos de propiedad de datos admitidos |
|
Tipos de propiedades vectoriales admitidos | ReadOnlyMemory<float> |
Tipos de índice admitidos | N/D |
Funciones de distancia admitidas |
|
Admite varios vectores en un registro | Sí |
¿Se admite IsFilterable? | No |
¿Se admite IsFullTextSearchable? | No |
¿Se admite StoragePropertyName? | Sí |
Limitaciones
SQLite no admite la búsqueda de vectores lista para usar. La extensión SQLite debe cargarse primero para habilitar la funcionalidad de búsqueda de vectores. La implementación actual del conector de SQLite es compatible con la extensión de búsqueda vectorial sqlite-vec .
Para instalar la extensión, use una de las versiones con la versión de extensión específica de su elección. Es posible obtener una versión precompilada con el install.sh
script. Este script generará vec0.dll
, que debe encontrarse en la misma carpeta que la aplicación en ejecución. Esto permitirá que la aplicación llame al SqliteConnection.LoadExtension("vec0")
método y cargue la extensión de búsqueda vectorial.
Introducción
Agregue el paquete NuGet del conector sqLite Vector Store al proyecto.
dotnet add package Microsoft.SemanticKernel.Connectors.Sqlite --prerelease
Puede agregar el almacén de vectores al IServiceCollection
contenedor de inserción de dependencias mediante métodos de extensión proporcionados por kernel semántico.
En este caso, se inicializará una instancia de la Microsoft.Data.Sqlite.SqliteConnection
clase , se abrirá la conexión y se cargará la extensión de búsqueda vectorial. El nombre predeterminado de la extensión de búsqueda vectorial es vec0
, pero se puede invalidar mediante la SqliteVectorStoreOptions.VectorSearchExtensionName
propiedad .
using Microsoft.SemanticKernel;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSqliteVectorStore("Data Source=:memory:");
También se proporcionan métodos de extensión que no toman parámetros. Estos requieren que una instancia de la Microsoft.Data.Sqlite.SqliteConnection
clase se registre por separado con el contenedor de inserción de dependencias.
En este caso, la conexión se abrirá solo si no se abrió antes y el método de extensión presupone que la extensión de búsqueda vectorial ya se cargó para la instancia registrada 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();
Puede construir una instancia de SQLite Vector Store directamente.
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);
Es posible construir una referencia directa a una colección con nombre.
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");
Asignación de datos
El conector del almacén de vectores de SQLite proporciona un asignador predeterminado al asignar desde el modelo de datos al almacenamiento. Este asignador realiza una conversión directa de la lista de propiedades del modelo de datos a las columnas de SQLite.
También es posible invalidar el comportamiento predeterminado del asignador proporcionando un asignador personalizado a través de la SqliteVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper
propiedad .
Con la extensión de búsqueda vectorial, los vectores se almacenan en tablas virtuales, independientemente de las propiedades de clave y datos.
De forma predeterminada, la tabla virtual con vectores usará el mismo nombre que la tabla con propiedades de clave y datos, pero con un vec_
prefijo. Por ejemplo, si el nombre de la colección de SqliteVectorStoreRecordCollection
es skhotels
, el nombre de la tabla virtual con vectores será vec_skhotels
. Es posible invalidar el nombre de la tabla virtual mediante las SqliteVectorStoreOptions.VectorVirtualTableName
propiedades o SqliteVectorStoreRecordCollectionOptions<TRecord>.VectorVirtualTableName
.
Invalidación del nombre de propiedad
Puede invalidar los nombres de propiedad que se usarán en el almacenamiento que sea diferente a los nombres de propiedad del modelo de datos.
La invalidación del nombre de propiedad se realiza estableciendo la StoragePropertyName
opción a través de los atributos de propiedad del modelo de datos o la definición de registro.
Este es un ejemplo de un modelo de datos con StoragePropertyName
establecido en sus atributos y cómo se representará en la consulta 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
);
Próximamente
Más información próximamente.
Próximamente
Más información próximamente.