Udostępnij za pośrednictwem


Korzystanie z łącznika SQLite Vector Store (wersja zapoznawcza)

Ostrzeżenie

Funkcja semantycznego magazynu wektorów jądra jest dostępna w wersji zapoznawczej, a ulepszenia wymagające zmian powodujących niezgodność mogą nadal występować w ograniczonych okolicznościach przed wydaniem.

Omówienie

Łącznik SQLite Vector Store może służyć do uzyskiwania dostępu do danych w programie SQLite i zarządzania nimi. Łącznik ma następujące cechy.

Obszar funkcji Pomoc techniczna
Mapowania kolekcji na Tabela SQLite
Obsługiwane typy właściwości kluczy
  • ulong
  • string
Obsługiwane typy właściwości danych
  • int
  • długi
  • ulong
  • short
  • ushort
  • string
  • bool
  • liczba zmiennoprzecinkowa
  • double
  • decimal
  • byte[]
Obsługiwane typy właściwości wektorów ReadOnlyMemory<float>
Obsługiwane typy indeksów Nie dotyczy
Obsługiwane funkcje odległości
  • CosineDistance
  • ManhattanDistance
  • EuclideanDistance
Obsługiwane klauzule filtru
  • EqualTo
Obsługuje wiele wektorów w rekordzie Tak
Czy filtrowanie jest obsługiwane? Nie.
Czy jest obsługiwany element IsFullTextSearchable? Nie.
Obsługiwana nazwa_właściwości_magazynu? Tak

Ograniczenia

SqLite nie obsługuje wyszukiwania wektorowego poza polem. Aby włączyć funkcję wyszukiwania wektorowego, należy najpierw załadować rozszerzenie SQLite. Bieżąca implementacja łącznika SQLite jest zgodna z rozszerzeniem wyszukiwania wektorów sqlite-vec .

Aby zainstalować rozszerzenie, użyj jednej z wersji z wybraną określoną wersją rozszerzenia. Istnieje możliwość pobrania wstępnie skompilowanej wersji za pomocą skryptu install.sh . Ten skrypt spowoduje wygenerowanie vec0.dllelementu , który musi znajdować się w tym samym folderze co uruchomiona aplikacja. Umożliwi to aplikacji wywołanie SqliteConnection.LoadExtension("vec0") metody i załadowanie rozszerzenia wyszukiwania wektorowego.

Wprowadzenie

Dodaj pakiet NuGet łącznika SQLite Vector Store do projektu.

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

Magazyn wektorów można dodać do kontenera IServiceCollection wstrzykiwania zależności przy użyciu metod rozszerzeń udostępnianych przez jądro semantyczne.

W takim przypadku wystąpienie Microsoft.Data.Sqlite.SqliteConnection klasy zostanie zainicjowane, połączenie zostanie otwarte, a rozszerzenie wyszukiwania wektorowego zostanie załadowane. Domyślna nazwa rozszerzenia wyszukiwania wektorów to vec0, ale można ją zastąpić za pomocą SqliteVectorStoreOptions.VectorSearchExtensionName właściwości .

using Microsoft.SemanticKernel;

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

Dostępne są również metody rozszerzeń, które nie przyjmują parametrów. Wymagają one osobnego zarejestrowania Microsoft.Data.Sqlite.SqliteConnection wystąpienia klasy w kontenerze wstrzykiwania zależności.

W takim przypadku połączenie zostanie otwarte tylko wtedy, gdy nie zostało otwarte wcześniej, a metoda rozszerzenia zakłada, że rozszerzenie wyszukiwania wektorowego zostało już załadowane dla zarejestrowanego Microsoft.Data.Sqlite.SqliteConnection wystąpienia.

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

Wystąpienie magazynu wektorów SQLite można skonstruować bezpośrednio.

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

Istnieje możliwość utworzenia bezpośredniego odwołania do nazwanej kolekcji.

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

Mapowanie danych

Łącznik SQLite Vector Store udostępnia domyślny maper podczas mapowania z modelu danych na magazyn. Ten maper wykonuje bezpośrednią konwersję listy właściwości modelu danych na kolumny w sqlite.

Istnieje również możliwość zastąpienia domyślnego zachowania mapera przez udostępnienie niestandardowego SqliteVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper mapera za pośrednictwem właściwości .

W przypadku rozszerzenia wyszukiwania wektorów wektory są przechowywane w tabelach wirtualnych, niezależnie od właściwości klucza i danych. Domyślnie tabela wirtualna z wektorami będzie używać takiej samej nazwy jak tabela z właściwościami klucza i danych, ale z prefiksem vec_ . Jeśli na przykład nazwa kolekcji w SqliteVectorStoreRecordCollection pliku to skhotels, nazwa tabeli wirtualnej z wektorami będzie .vec_skhotels Można zastąpić nazwę tabeli wirtualnej przy użyciu SqliteVectorStoreOptions.VectorVirtualTableName właściwości lub SqliteVectorStoreRecordCollectionOptions<TRecord>.VectorVirtualTableName .

Zastępowanie nazwy właściwości

Nazwy właściwości można zastąpić do użycia w magazynie, który różni się od nazw właściwości w modelu danych. Zastępowanie nazwy właściwości odbywa się przez ustawienie StoragePropertyName opcji za pomocą atrybutów właściwości modelu danych lub definicji rekordu.

Oto przykład modelu danych z ustawionymi atrybutami StoragePropertyName i sposobem, w jaki będzie reprezentowany w zapytaniu 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
);

Wkrótce

Więcej informacji wkrótce.

Wkrótce

Więcej informacji wkrótce.