次の方法で共有


セマンティック カーネル ベクター ストア コネクタの埋め込みの生成

警告

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

セマンティック カーネルでは、多くの一般的な AI サービスをすぐに使用して埋め込みを生成できます。

これらのサービスは、直接構築することも、依存関係挿入コンテナーに追加してそこから解決することもできます。

埋め込みジェネレーターの構築

セマンティック カーネルによって提供されるテキスト埋め込みサービスのインスタンスを直接構築できます。 これらはすべて、 ITextEmbeddingGenerationService インターフェイスを実装します。

// Constructing an Azure Open AI embedding generation service directly.
ITextEmbeddingGenerationService azureOpenAITES = new AzureOpenAITextEmbeddingGenerationService(
    "text-embedding-ada-002",
    "https://{myservice}.openai.azure.com/",
    "apikey");

// Constructing an Olama embedding generation service directly.
ITextEmbeddingGenerationService olamaTES = new OllamaTextEmbeddingGenerationService(
    "mxbai-embed-large",
    new Uri("http://localhost:11434"));

ヘルパーを使用して、依存関係挿入コンテナーに登録することもできます。

// Registering Google AI embedding generation service with a service collection.
var services = new ServiceCollection();
services.AddGoogleAIEmbeddingGeneration("text-embedding-004", "apiKey");

// Registering Mistral AI embedding generation service with the dependency injection container on
// the kernel builder.
var kernelBuilder = Kernel
    .CreateBuilder()
    .AddMistralTextEmbeddingGeneration("mistral-embed", "apiKey");

埋め込みの生成

作成した ITextEmbeddingGenerationService を使用するには、 GenerateEmbeddingAsync メソッドを呼び出します。

レコードをアップロードするときに埋め込みを生成する例を次に示します。

public async Task GenerateEmbeddingsAndUpsertAsync(
    ITextEmbeddingGenerationService textEmbeddingGenerationService,
    IVectorStoreRecordCollection<ulong, Hotel> collection)
{
    // Upsert a record.
    string descriptionText = "A place where everyone can be happy.";
    ulong hotelId = 1;

    // Generate the embedding.
    ReadOnlyMemory<float> embedding =
        await textEmbeddingGenerationService.GenerateEmbeddingAsync(descriptionText);

    // Create a record and upsert with the already generated embedding.
    await collection.UpsertAsync(new Hotel
    {
        HotelId = hotelId,
        HotelName = "Hotel Happy",
        Description = descriptionText,
        DescriptionEmbedding = embedding,
        Tags = new[] { "luxury", "pool" }
    });
}

検索時に埋め込みを生成する例を次に示します。

public async Task GenerateEmbeddingsAndSearchAsync(
    ITextEmbeddingGenerationService textEmbeddingGenerationService,
    IVectorStoreRecordCollection<ulong, Hotel> collection)
{
    // Upsert a record.
    string descriptionText = "Find me a hotel with happiness in mind.";

    // Generate the embedding.
    ReadOnlyMemory<float> searchEmbedding =
        await textEmbeddingGenerationService.GenerateEmbeddingAsync(descriptionText);

    // Search using the already generated embedding.
    List<VectorSearchResult<Hotel>> searchResult = await collection.VectorizedSearchAsync(searchEmbedding).ToListAsync();

    // Print the first search result.
    Console.WriteLine("Score for first result: " + searchResult.FirstOrDefault()?.Score);
    Console.WriteLine("Hotel description for first result: " + searchResult.FirstOrDefault()?.Record.Description);
}

埋め込みディメンション

ベクター データベースでは、通常、コレクションの作成時に各ベクターに含まれる次元の数を指定する必要があります。 通常、埋め込みモデルによって、異なるディメンション サイズのベクターの生成がサポートされます。 たとえば、Open AI text-embedding-ada-002 では、1536 次元のベクターが生成されます。 また、一部のモデルでは、開発者は出力ベクターで必要な次元の数を選択することもできます。たとえば、Google text-embedding-004 では既定で 768 次元のベクトルが生成されますが、開発者は 1 から 768 の次元の任意の数を選択できます。

埋め込みモデルによって生成されるベクターの次元数が、データベース内の一致するベクターと同じになるようにすることが重要です。

セマンティック カーネル ベクター ストアの抽象化を使用してコレクションを作成する場合は、注釈またはレコード定義を使用して、各ベクター プロパティに必要な次元の数を指定する必要があります。 ディメンションの数を 1536 に設定する両方の例を次に示します。

[VectorStoreRecordVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
new VectorStoreRecordVectorProperty("DescriptionEmbedding", typeof(float)) { Dimensions = 1536 }

ヒント

データ モデルに注釈を付ける方法の詳細については、「 データ モデルの定義」を参照してください

ヒント

レコード定義の作成の詳細については、「 レコード定義を使用してスキーマを定義するを参照してください。

間もなく利用できます

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

間もなく利用できます

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