SQLite ベクター ストア コネクタの使用 (プレビュー)
警告
セマンティック カーネル ベクター ストア機能はプレビュー段階であり、破壊的変更を必要とする機能強化は、リリース前の限られた状況で引き続き発生する可能性があります。
概要
SQLite ベクター ストア コネクタを使用すると、SQLite のデータにアクセスして管理できます。 コネクタには次の特性があります。
機能領域 | サポート |
---|---|
コレクションのマップ | SQLite テーブル |
サポートされているキー プロパティの種類 |
|
サポートされているデータ プロパティ型 |
|
サポートされているベクター プロパティ型 | ReadOnlyMemory<float> |
サポートされているインデックスの種類 | 該当なし |
サポートされている距離関数 |
|
レコード内の複数のベクターをサポートします | はい |
IsFilterable がサポートされていますか? | いいえ |
IsFullTextSearchable がサポートされていますか? | いいえ |
StoragePropertyName がサポートされていますか? | はい |
制限事項
SQLite では、すぐに使用するベクター検索はサポートされていません。 ベクトル検索機能を有効にするには、SQLite 拡張機能を最初に読み込む必要があります。 SQLite コネクタの現在の実装は、 sqlite-vec ベクター検索拡張機能と互換性があります。
拡張機能をインストールするには、 releases のいずれかを選択した特定の拡張機能バージョンと共に使用します。 install.sh
スクリプトを使用して、事前コンパイル済みバージョンを取得できます。 このスクリプトでは、実行中のアプリケーションと同じフォルダーに配置する必要がある vec0.dll
が生成されます。 これにより、アプリケーションで SqliteConnection.LoadExtension("vec0")
メソッドを呼び出し、ベクター検索拡張機能を読み込むことができます。
作業の開始
SQLite ベクター ストア コネクタ NuGet パッケージをプロジェクトに追加します。
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 ベクター ストア インスタンスを直接構築できます。
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 ベクター ストア コネクタは、データ モデルからストレージにマッピングするときに、既定のマッパーを提供します。 このマッパーは、データ モデルのプロパティの一覧を 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
);
間もなく利用できます
詳細については、近日公開予定です。
間もなく利用できます
詳細については、近日公開予定です。