Compartilhar via


Usando o conector do SQLite Vector Store (versão prévia)

Aviso

A funcionalidade do Repositório de Vetores do Kernel Semântico está em versão prévia e as melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Visão geral

O conector do SQLite Vector Store pode ser usado para acessar e gerenciar dados no SQLite. O conector tem as seguintes características.

Área de recurso Suporte
A coleção é mapeada para Tabela SQLite
Tipos de propriedade de chave com suporte
  • ulong
  • string
Tipos de propriedade de dados com suporte
  • INT
  • longo
  • ulong
  • short
  • ushort
  • string
  • bool
  • FLOAT
  • duplo
  • decimal
  • byte[]
Tipos de propriedade de vetor com suporte Float ReadOnlyMemory<>
Tipos de índice com suporte N/D
Funções de distância suportadas
  • Distância do cosseno
  • ManhattanDistância
  • Distância Euclidiana
Cláusulas de filtro com suporte
  • EqualTo
Suporta vários vetores em um registro Sim
IsFilterable suportado? Não
IsFullTextSearchable suportado? Não
StoragePropertyName com suporte? Sim

Limitações

O SQLite não oferece suporte à pesquisa vetorial pronta para uso. A extensão SQLite deve ser carregada primeiro para habilitar o recurso de pesquisa vetorial. A implementação atual do conector SQLite é compatível com a extensão de pesquisa vetorial sqlite-vec .

Para instalar a extensão, use uma das versões com a versão de extensão específica de sua escolha. É possível obter uma versão pré-compilada com o install.sh script. Esse script produzirá vec0.dll, que deve estar localizado na mesma pasta que o aplicativo em execução. Isso permitirá que o aplicativo chame o SqliteConnection.LoadExtension("vec0") método e carregue a extensão de pesquisa vetorial.

Introdução

Adicione o pacote NuGet do conector do Repositório de Vetores SQLite ao seu projeto.

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

Você pode adicionar o repositório de vetores ao IServiceCollection contêiner de injeção de dependência usando métodos de extensão fornecidos pelo Semantic Kernel.

Nesse caso, uma instância da classe será inicializada, a conexão será aberta e a extensão de Microsoft.Data.Sqlite.SqliteConnection pesquisa vetorial será carregada. O nome padrão da extensão de pesquisa vetorial é vec0, mas pode ser substituído usando a SqliteVectorStoreOptions.VectorSearchExtensionName propriedade.

using Microsoft.SemanticKernel;

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

Métodos de extensão que não usam parâmetros também são fornecidos. Isso exige que uma instância da Microsoft.Data.Sqlite.SqliteConnection classe seja registrada separadamente com o contêiner de injeção de dependência.

Nesse caso, a conexão será aberta somente se não tiver sido aberta antes e o método de extensão assumirá que a extensão de pesquisa vetorial já foi carregada para a instância 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();

Você pode construir uma instância do SQLite Vector Store diretamente.

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

É possível construir uma referência direta a uma coleção nomeada.

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

Mapeamento de dados

O conector do SQLite Vector Store fornece um mapeador padrão ao mapear do modelo de dados para o armazenamento. Esse mapeador faz uma conversão direta da lista de propriedades no modelo de dados para as colunas no SQLite.

Também é possível substituir o comportamento padrão do mapeador fornecendo um mapeador personalizado por meio da SqliteVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper propriedade.

Com a extensão de pesquisa vetorial, os vetores são armazenados em tabelas virtuais, separadamente das propriedades de chave e dados. Por padrão, a tabela virtual com vetores usará o mesmo nome que a tabela com propriedades de chave e dados, mas com um vec_ prefixo. Por exemplo, se o nome da coleção em SqliteVectorStoreRecordCollection for skhotels, o nome da tabela virtual com vetores será vec_skhotels. É possível substituir o nome da tabela virtual usando as SqliteVectorStoreOptions.VectorVirtualTableName propriedades or SqliteVectorStoreRecordCollectionOptions<TRecord>.VectorVirtualTableName .

Substituição do nome da propriedade

Você pode substituir nomes de propriedade a serem usados no armazenamento que é diferente dos nomes de propriedade no modelo de dados. A substituição do nome da propriedade é feita definindo a StoragePropertyName opção por meio dos atributos de propriedade do modelo de dados ou da definição de registro.

Aqui está um exemplo de um modelo de dados com StoragePropertyName set em seus atributos e como isso será representado na 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
);

Em breve

Mais informações em breve.

JDBC

O conector JDBC pode ser usado para se conectar ao SQLite.