次の方法で共有


SQLite ベクター ストア コネクタの使用 (プレビュー)

警告

セマンティック カーネル ベクター ストア機能はプレビュー段階であり、破壊的変更を必要とする機能強化は、リリース前の限られた状況で引き続き発生する可能性があります。

概要

SQLite ベクター ストア コネクタを使用すると、SQLite のデータにアクセスして管理できます。 コネクタには次の特性があります。

機能領域 サポート
コレクションのマップ SQLite テーブル
サポートされているキー プロパティの種類
  • ulong
  • string
サポートされているデータ プロパティ型
  • int
  • long
  • ulong
  • short
  • ushort
  • string
  • [bool]
  • float
  • 倍精度浮動小数点
  • 小数
  • byte[]
サポートされているベクター プロパティ型 ReadOnlyMemory<float>
サポートされているインデックスの種類 該当なし
サポートされている距離関数
  • CosineDistance
  • ManhattanDistance
  • EuclideanDistance
レコード内の複数のベクターをサポートします はい
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
);

間もなく利用できます

詳細については、近日公開予定です。

間もなく利用できます

詳細については、近日公開予定です。