Compartir a través de


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
  • ulong
  • string
Tipos de propiedad de datos admitidos
  • int
  • long
  • ulong
  • short
  • ushort
  • string
  • bool
  • float
  • double
  • decimal
  • byte[]
Tipos de propiedades vectoriales admitidos ReadOnlyMemory<float>
Tipos de índice admitidos N/D
Funciones de distancia admitidas
  • CosineDistance
  • ManhattanDistance
  • EuclideanDistance
Admite varios vectores en un registro
¿Se admite IsFilterable? No
¿Se admite IsFullTextSearchable? No
¿Se admite StoragePropertyName?

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.