ヒント
従来のメモリ ストアではなく、ベクター ストアの抽象化を使用することをお勧めします。 Vector Store の抽象化の使用方法の詳細については、 こちらを参照してください。
セマンティック カーネルは、プライマリ インターフェイスが Microsoft.SemanticKernel.Memory.IMemoryStore
されているメモリ ストア抽象化のセットを提供します。
メモリ ストアとベクター ストアの抽象化
セマンティック カーネルのベクター ストレージと検索機能を進化させて拡張する取り組みの一環として、メモリ ストアの抽象化を置き換える新しい抽象化セットをリリースしました。 置換抽象化を「ベクターストア抽象化」と呼んでいます。 両方の目的は似ていますが、インターフェイスが異なり、ベクター ストアの抽象化によって機能が拡張されます。
特性 | レガシ メモリ ストア | ベクター ストア |
---|---|---|
メイン インターフェイス | IMemoryStore | VectorStore |
抽象化 NuGet パッケージ | Microsoft.SemanticKernel.Abstractions | Microsoft.Extensions.VectorData.Abstractions |
命名規則 | {Provider}MemoryStore (RedisMemoryStore など) | {Provider}VectorStore (RedisVectorStore など) |
レコードアップサート、取得、削除をサポート | はい | はい |
コレクションの作成と削除をサポートします | はい | はい |
ベクター検索をサポート | はい | はい |
好みのベクター検索インデックスと距離関数の選択をサポート | いいえ | はい |
レコードごとに複数のベクターをサポート | いいえ | はい |
カスタム スキーマをサポートします | いいえ | はい |
複数のベクター型をサポート | いいえ | はい |
ベクター検索のメタデータ事前フィルター処理をサポート | いいえ | はい |
データセット全体をクライアントにダウンロードし、ローカル ベクター検索を実行することで、非ベクター データベースでのベクター検索をサポートします | はい | いいえ |
使用可能なメモリ ストア コネクタ
セマンティック カーネルには、情報の格納と取得に使用できるベクター データベースへのメモリ ストア コネクタがいくつか用意されています。 これには以下が含まれます。
サービス | C# | Python(プログラミング言語) |
---|---|---|
Azure Cosmos DB for NoSQL のベクター データベース | C# | Python |
仮想コア ベースの Azure Cosmos DB for MongoDB のベクター データベース | C# | Python |
Azure AI Search | C# | Python |
Azure PostgreSQL Server | C# | |
Azure SQL データベース | C# | |
クロマ | C# | Python |
DuckDB | C# | |
ミルヴス | C# | Python |
MongoDB Atlas ベクター検索 | C# | Python |
松ぼっくり | C# | Python |
Postgres | C# | Python |
Qdrant | C# | Python |
Redis(レディス) | C# | Python |
Sqlite | C# | |
ウィービエイト | C# | Python |
メモリ ストアからベクター ストアへの移行
メモリ ストアの抽象化を使用してベクター ストアの抽象化に移行する場合は、さまざまな方法でこれを行うことができます。
Vector Store の抽象化で既存のコレクションを使用する
多くの場合、最も簡単な方法は、ベクター ストアの抽象化を使用して、メモリ ストアの抽象化を使用して作成されたコレクションにアクセスすることです。 ベクター ストアの抽象化を使用すると、使用するスキーマを選択できるため、多くの場合、これは可能です。 主な要件は、従来のメモリ ストア実装で使用されたスキーマに一致するデータ モデルを作成することです。
たとえば、Azure AI Search メモリ ストアによって作成されたコレクションにアクセスするには、次の Vector Store データ モデルを使用できます。
using Microsoft.Extensions.VectorData;
class VectorStoreRecord
{
[VectorStoreKey]
public string Id { get; set; }
[VectorStoreData]
public string Description { get; set; }
[VectorStoreData]
public string Text { get; set; }
[VectorStoreData]
public bool IsReference { get; set; }
[VectorStoreData]
public string ExternalSourceName { get; set; }
[VectorStoreData]
public string AdditionalMetadata { get; set; }
[VectorStoreVector(VectorSize)]
public ReadOnlyMemory<float> Embedding { get; set; }
}
ヒント
Vector Store の抽象化を使用してメモリ ストアを使用して作成されたコレクションにアクセスする方法の詳細な例については、 こちらを参照してください。
新しいコレクションの作成
場合によっては、既存のコレクションを直接使用するよりも、新しいコレクションに移行することをお勧めします。 メモリ ストアによって選択されたスキーマは、特にフィルター処理に関して、要件と一致しない場合があります。
たとえば、Redis Memory ストアでは、次の 3 つのフィールドを持つスキーマが使用されます。
- 文字列メタデータ
- 長いタイムスタンプ
- float[] 埋め込み
埋め込みまたはタイムスタンプ以外のすべてのデータは、シリアル化された json 文字列としてメタデータ フィールドに格納されます。 つまり、個々の値にインデックスを付けてフィルター処理することはできません。 たとえば、ExternalSourceName を使用してフィルター処理することもできますが、json 文字列内にある間はこれを行えません。
この場合は、フラット スキーマを使用して新しいコレクションにデータを移行することをお勧めします。 ここには 2 つのオプションがあります。 ソース データから新しいコレクションを作成することも、古いデータから新しいコレクションにデータをマップしてコピーすることもできます。 最初のオプションは、ソース データから埋め込みを再生成する必要があるため、コストが高い場合があります。
ヒント
メモリ ストアの抽象化を使用して作成されたコレクションから Vector Store 抽象化を使用して作成されたコレクションにデータをコピーする方法を示す Redis の使用例については、 こちらを参照してください。