Partilhar via


Usando o conector SQLite Vetor Store (Visualização)

Aviso

A funcionalidade Semantic Kernel Vetor Store está em pré-visualização, e melhorias que exigem alterações de quebra ainda podem ocorrer em circunstâncias limitadas antes do lançamento.

Descrição geral

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

Área de funcionalidades Suporte
Mapas da coleção para Tabela SQLite
Tipos de propriedade de chave suportados
  • Ulong
  • string
Tipos de propriedade de dados suportados
  • número inteiro
  • long
  • Ulong
  • curtas
  • Ushort
  • string
  • booleano
  • flutuante
  • duplo
  • decimal
  • byte[]
Tipos de propriedade vetorial suportados Float ReadOnlyMemory<>
Tipos de índice suportados N/A
Funções de distância suportadas
  • CosineDistância
  • ManhattanDistância
  • Distância Euclidiana
Suporta vários vetores em um registro Sim
IsFilterable suportado? Não
IsFullTextSearchable suportado? Não
StoragePropertyName suportado? Sim

Limitações

SQLite não suporta 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. Este 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 SQLite Vetor Store ao seu projeto.

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

Você pode adicionar o armazenamento vetorial ao contêiner de injeção de IServiceCollection dependência usando métodos de extensão fornecidos pelo Kernel Semântico.

Nesse caso, uma instância da Microsoft.Data.Sqlite.SqliteConnection classe será inicializada, a conexão será aberta e a extensão de pesquisa vetorial será carregada. O nome da extensão de pesquisa vetorial padrão é 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 requer 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 Vetor 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 SQLite Vetor Store fornece um mapeador padrão ao mapear do modelo de dados para o armazenamento. Este 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 da 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 para usar 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 do registro.

Aqui está um exemplo de um modelo de dados com StoragePropertyName definido 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
);

Brevemente

Mais informações em breve.

Brevemente

Mais informações em breve.