Использование соединителя sqLite Vector Store (предварительная версия)
Предупреждение
Функции хранилища векторов семантического ядра доступны в предварительной версии и улучшения, требующие критических изменений, могут по-прежнему возникать в ограниченных обстоятельствах перед выпуском.
Обзор
Соединитель SQLite Vector Store можно использовать для доступа к данным и управления ими в SQLite. Соединитель имеет следующие характеристики.
Область функций | Поддержка |
---|---|
Коллекция сопоставляется с | Таблица SQLite |
Поддерживаемые типы свойств ключей |
|
Поддерживаемые типы свойств данных |
|
Поддерживаемые типы свойств вектора | ReadOnlyMemory<float> |
Поддерживаемые типы индексов | Н/П |
Поддерживаемые функции расстояния |
|
Поддержка нескольких векторов в записи | Да |
Поддерживается 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
);
Скоро
Дополнительные сведения в ближайшее время.
Скоро
Дополнительные сведения в ближайшее время.