Поделиться через


Использование соединителя sqLite Vector Store (предварительная версия)

Предупреждение

Функции хранилища векторов семантического ядра доступны в предварительной версии и улучшения, требующие критических изменений, могут по-прежнему возникать в ограниченных обстоятельствах перед выпуском.

Обзор

Соединитель SQLite Vector Store можно использовать для доступа к данным и управления ими в SQLite. Соединитель имеет следующие характеристики.

Область функций Поддержка
Коллекция сопоставляется с Таблица SQLite
Поддерживаемые типы свойств ключей
  • ulong
  • строка
Поддерживаемые типы свойств данных
  • INT
  • длинный
  • ulong
  • short
  • ushort
  • строка
  • bool
  • с плавающей запятой
  • двойной точности
  • десятичное
  • byte[]
Поддерживаемые типы свойств вектора ReadOnlyMemory<float>
Поддерживаемые типы индексов Н/П
Поддерживаемые функции расстояния
  • CosineDistance
  • МанхэттенDistance
  • EuclideanDistance
Поддержка нескольких векторов в записи Да
Поддерживается IsFilterable? No
Поддерживается ЛиFullTextSearchable? No
Поддерживается StoragePropertyName? Да

Ограничения

SQLite не поддерживает векторный поиск вне поля. Расширение SQLite должно быть загружено сначала, чтобы включить возможности поиска векторов. Текущая реализация соединителя SQLite совместима с расширением векторного поиска sqlite-vec .

Чтобы установить расширение, используйте один из выпусков с определенной версией расширения. Можно получить предварительно скомпилированную версию с помощью скрипта install.sh . Этот скрипт создаст vec0.dll, который должен находиться в той же папке, что и запущенное приложение. Это позволит приложению вызывать SqliteConnection.LoadExtension("vec0") метод и загружать расширение векторного поиска.

Начало работы

Добавьте в проект пакет NuGet соединителя SQLite Vector Store.

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

Хранилище векторов можно добавить в IServiceCollection контейнер внедрения зависимостей с помощью методов расширения, предоставляемых семантического ядра.

В этом случае экземпляр класса будет инициализирован, подключение будет открыто, а расширение векторного Microsoft.Data.Sqlite.SqliteConnection поиска будет загружено. Имя vec0расширения векторного поиска по умолчанию, но его можно переопределить с помощью SqliteVectorStoreOptions.VectorSearchExtensionName свойства.

using Microsoft.SemanticKernel;

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

Методы расширения, которые не принимают параметров, также предоставляются. Для них требуется, чтобы экземпляр Microsoft.Data.Sqlite.SqliteConnection класса был отдельно зарегистрирован в контейнере внедрения зависимостей.

В этом случае подключение будет открыто только в том случае, если оно не было открыто раньше, а метод расширения предполагает, что расширение векторного поиска уже загружено для зарегистрированного 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();

Экземпляр SQLite Vector Store можно создать напрямую.

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

Можно создать прямую ссылку на именованную коллекцию.

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

Сопоставление данных

Соединитель SQLite Vector Store предоставляет схему по умолчанию при сопоставлении модели данных с хранилищем. В этом средстве сопоставления выполняется прямое преобразование списка свойств модели данных в столбцы в SQLite.

Кроме того, можно переопределить поведение карты по умолчанию, предоставив настраиваемую схему через SqliteVectorStoreRecordCollectionOptions<TRecord>.DictionaryCustomMapper свойство.

С расширением векторного поиска векторы хранятся в виртуальных таблицах отдельно от свойств ключей и данных. По умолчанию виртуальная таблица с векторами будет использовать то же имя, что и таблица со свойствами ключа и данных, но с vec_ префиксом. Например, если имя коллекции включено SqliteVectorStoreRecordCollection skhotels, имя виртуальной таблицы с векторами будет vec_skhotels. Можно переопределить имя виртуальной таблицы с помощью SqliteVectorStoreOptions.VectorVirtualTableName или SqliteVectorStoreRecordCollectionOptions<TRecord>.VectorVirtualTableName свойства.

Переопределение имени свойства

Имена свойств можно переопределить для использования в хранилище, которое отличается от имен свойств в модели данных. Переопределение имени свойства выполняется путем задания StoragePropertyName параметра с помощью атрибутов свойства модели данных или определения записи.

Ниже приведен пример модели данных с StoragePropertyName набором атрибутов и способом представления в запросе 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
);

Скоро

Дополнительные сведения в ближайшее время.

Скоро

Дополнительные сведения в ближайшее время.