.NET AI アプリ用のベクター データベース

ベクター データベースは、ベクター 埋め込みを格納および管理します。 埋め込みとは、セマンティックな意味を保持するデータの数値表現です。 単語、ドキュメント、画像、オーディオ、その他の種類のデータはすべてベクトル化できます。 埋め込みを使用すると、AI モデルが入力の意味を理解するのに役立ちます。これにより、テキストの要約、コンテキストに関連するデータの検索、テキストの説明からの画像の作成などの比較と変換を実行できます。

たとえば、ベクトル データベースを使用して次のことができます。

  • コンテンツ、テーマ、センチメント、スタイルに基づいて、類似の画像、ドキュメント、曲を識別します。
  • 特性、特徴、およびユーザー グループに基づいて類似製品を識別します。
  • ユーザー設定に基づいてコンテンツ、製品、またはサービスを推奨します。
  • 複雑な要件を満たすために、多くの選択肢の中から最適なオプションを特定します。
  • 主要なパターンまたは通常のパターンとは異なるデータの異常または不正なアクティビティを特定します。

ベクトル データベースは、プロパティ フィールドの完全一致ではなく、データ特性に基づいて類似の項目を検索するベクトル検索機能を提供します。 ベクター検索は、Azure OpenAI 埋め込みモデルなどの AI 埋め込みモデルを使用して作成したデータのベクター表現を分析することによって機能します。 検索プロセスでは、データ ベクトルとクエリ ベクトル間の距離が測定されます。 クエリ ベクターに最も近いデータ ベクターは、意味的に最も似ています。

最新のデータベース製品のほとんどは、従来のクエリと共にベクター検索をサポートしています。これは、Azure SQL/SQL ServerAzure Cosmos DBPostgreSQL、その他多くの主要な製品の場合です。 別の方法として、専用の特殊なベクター データベース製品が幅広く存在します。 これらの製品はベクター検索を実行するように高度に最適化されており、通常はベクター検索ワークロードを処理するために従来のデータベースと共にインストールされます。

.NETと OpenAI を使用したベクター検索ワークフロー

ベクター データベースとその検索機能は、RAG パターンワークフローで特にAzure OpenAI で役立ちます。 このパターンを使用すると、データに関する意味的に豊富な知識を持つ AI モデルを拡張できます。 ベクター データベースを使用する一般的な AI ワークフローには、次の手順が含まれます。

  1. OpenAI 埋め込みモデルを使用して、データの埋め込みを作成します。
  2. ベクトル データベースまたは検索サービスに埋め込みを格納し、インデックスを付けます。
  3. ユーザー プロンプトをアプリケーションから埋め込みに変換します。
  4. ユーザー プロンプトの埋め込みをデータベース内の埋め込みと比較して、データ間でベクター検索を実行します。
  5. gpt-4o などの言語モデルを使用して、ベクター検索結果からわかりやすい補完を組み立てます。

このフローの実践的な例として、.NET アプリでベクター検索を用いてRAG で Azure OpenAI を実装する方法についてのチュートリアルを参照してください。

RAG パターンのその他の利点は次のとおりです。

  • AI モデルからのユーザー プロンプトに対するコンテキストに関連した正確な応答を生成します。
  • LLM トークンの制限をデータベースベクター検索で克服します。主要な処理はこの検索によって行われています。
  • 更新されたデータに対して頻繁に微調整を行い、コストを削減します。

Microsoft。Extensions.VectorData ライブラリ

.NETからのベクター検索を使用するには、追加のライブラリや API を必要とせずに、通常のデータベース ドライバーまたは SDK を使用できます。 たとえば、SQL Serverでは、標準の .NET ドライバーである SqlClient を使用する場合、T-SQL でベクター検索を実行できます。 ただし、この方法でベクター検索にアクセスすることは、多くの場合、非常に低レベルであり、シリアル化/逆シリアル化を処理するためにかなりの儀式が必要であり、結果のコードはデータベース間で移植できません。

別の方法として、Microsoft。Extensions.VectorData ライブラリは、.NET内のベクター ストアと対話するための抽象化の統一されたレイヤーを提供します。

主要な抽象化

コレクションを作成し、レコードをアップサートし、ベクター検索を実行する、最小限のエンドツーエンドの例を次に示します。

using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.InMemory;

// Configure an embedding generator to transform text to embeddings
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = ...;

// Create a vector store and get a collection with the embedding generator
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<int, Movie>("movies");
await collection.EnsureCollectionExistsAsync();

// Upsert some records
await collection.UpsertAsync(new Movie { Key = 1, Title = "The Lion King", Description = "An animated film about a young lion prince" });
await collection.UpsertAsync(new Movie { Key = 2, Title = "Inception", Description = "A thief who steals corporate secrets through dream-sharing technology" });
await collection.UpsertAsync(new Movie { Key = 3, Title = "Finding Nemo", Description = "A fish searches the ocean for his lost son" });

// Search for movies similar to the query text
await foreach (var result in collection.SearchAsync("animals in the wild", top: 2))
{
    Console.WriteLine($"{result.Record.Title} (score: {result.Score})");
}

// Define the data model
class Movie
{
    [VectorStoreKey]
    public int Key { get; set; }

    [VectorStoreData]
    public string Title { get; set; }

    [VectorStoreVector(Dimensions: 1536)]
    public string Description { get; set; }
}

ベクター ストア プロバイダー

Microsoft.Extensions.VectorData.Abstractions パッケージは抽象化を定義し、個別の provider パッケージは特定のベクター データベースの実装を提供します。 ベクター データベースに一致するプロバイダーを選択します (例: Microsoft。SemanticKernel.Connectors.AzureAISearch

パッケージ名に "SemanticKernel" が含まれているにもかかわらず、これらのプロバイダーはSemantic Kernelとは関係なく、Agent Framework を含む.NETの任意の場所で使用できます。

すべてのプロバイダーが同じ VectorStoreVectorStoreCollection<TKey,TRecord> 抽象クラスを実装するため、アプリケーション ロジックを変更せずにそれらを切り替えることができます。

ヒント

初期の開発やプロトタイプ作成の際には、メモリ内プロバイダー (Microsoft.SemanticKernel.Connectors.InMemory) を使用してください。これは外部サービスや構成を必要とせず、後に運用環境用のプロバイダーに置き換えることができます。 このプロバイダーと運用データベースには重要な違いがあるため、テストには InMemory プロバイダーを使用しないでください。 testcontainer を使用して運用データベース システムに対してテストを実行することを検討してください。