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 |
|
Tipos de propriedade de dados com suporte |
|
Tipos de propriedade de vetor com suporte | Float ReadOnlyMemory<> |
Tipos de índice com suporte | N/D |
Funções de distância suportadas |
|
Cláusulas de filtro com suporte |
|
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.