Menghasilkan penyematan untuk konektor Kernel Semantik Vector Store

Peringatan

Fungsionalitas Penyimpanan Vektor Kernel Semantik sedang dalam pratinjau, dan peningkatan yang memerlukan perubahan drastis mungkin masih terjadi dalam keadaan terbatas sebelum dirilis.

Peringatan

Fungsionalitas Penyimpanan Vektor Kernel Semantik sedang dalam pratinjau, dan peningkatan yang memerlukan perubahan drastis mungkin masih terjadi dalam keadaan terbatas sebelum dirilis.

Konektor Kernel Semantik Vector Store mendukung beberapa cara untuk menghasilkan embedding vektor. Penyematan dapat dihasilkan oleh pengembang dan diteruskan sebagai bagian dari rekaman saat menggunakan VectorStoreCollection atau dapat dihasilkan secara internal ke VectorStoreCollection.

Membiarkan Vector Store menghasilkan penyematan

Anda dapat mengonfigurasi generator penyematan pada penyimpanan vektor Anda, yang memungkinkan penyematan dibuat secara otomatis selama operasi upsert dan pencarian, menghilangkan kebutuhan akan praproscesing manual.

Untuk mengaktifkan pembuatan vektor secara otomatis pada upsert, properti vektor pada model data Anda didefinisikan sebagai jenis sumber, misalnya string tetapi masih dihiasi dengan VectorStoreVectorPropertyAttribute.

    [VectorStoreVector(1536)]
    public string Embedding { get; set; }

Sebelum upsert, properti Embedding harus berisi string dari mana vektor akan dibuat. Jenis vektor yang disimpan dalam database (misalnya float32, float16, dll.) akan berasal dari generator penyematan yang dikonfigurasi.

Penting

Properti vektor ini tidak mendukung pengambilan vektor yang dihasilkan atau teks asli tempat vektor dihasilkan. Mereka juga tidak menyimpan teks asli. Jika teks asli perlu disimpan, properti Data terpisah harus ditambahkan untuk menyimpannya.

Generator penyematan yang mengimplementasikan Microsoft.Extensions.AI abstraksi yang didukung dan dapat dikonfigurasi pada berbagai tingkat.

  1. Di Penyimpanan Vektor: Anda dapat mengatur generator penyematan default untuk seluruh penyimpanan vektor. Generator ini akan digunakan untuk semua koleksi dan properti kecuali dibatalkan.

    using Microsoft.Extensions.AI;
    using CommunityToolkit.VectorData.Qdrant;
    using OpenAI;
    using Qdrant.Client;
    
    var embeddingGenerator = new OpenAIClient("your key")
        .GetEmbeddingClient("your chosen model")
        .AsIEmbeddingGenerator();
    
    var vectorStore = new QdrantVectorStore(
        new QdrantClient("localhost"),
        ownsClient: true,
        new QdrantVectorStoreOptions
        {
             EmbeddingGenerator = embeddingGenerator
        });
    
  2. Pada Koleksi: Anda dapat mengonfigurasi generator penyisipan untuk koleksi tertentu, menggantikan generator pada tingkat toko.

    using Microsoft.Extensions.AI;
    using CommunityToolkit.VectorData.Qdrant;
    using OpenAI;
    using Qdrant.Client;
    
    var embeddingGenerator = new OpenAIClient("your key")
        .GetEmbeddingClient("your chosen model")
        .AsIEmbeddingGenerator();
    
    var collectionOptions = new QdrantCollectionOptions
    {
        EmbeddingGenerator = embeddingGenerator
    };
    var collection = new QdrantCollection<ulong, MyRecord>(
        new QdrantClient("localhost"),
        "myCollection",
        ownsClient: true,
        collectionOptions);
    
  3. Pada Definisi Rekaman: Saat menentukan properti secara terprogram menggunakan VectorStoreCollectionDefinition, Anda dapat menentukan generator penyematan untuk semua properti.

    using Microsoft.Extensions.AI;
    using Microsoft.Extensions.VectorData;
    using CommunityToolkit.VectorData.Qdrant;
    using OpenAI;
    using Qdrant.Client;
    
    var embeddingGenerator = new OpenAIClient("your key")
        .GetEmbeddingClient("your chosen model")
        .AsIEmbeddingGenerator();
    
    var definition = new VectorStoreCollectionDefinition
    {
        EmbeddingGenerator = embeddingGenerator,
        Properties = new List<VectorStoreProperty>
        {
            new VectorStoreKeyProperty("Key", typeof(ulong)),
            new VectorStoreVectorProperty("DescriptionEmbedding", typeof(string), dimensions: 1536)
        }
    };
    
    var collectionOptions = new QdrantCollectionOptions
    {
        Definition = definition
    };
    var collection = new QdrantCollection<ulong, MyRecord>(
        new QdrantClient("localhost"),
        "myCollection",
        ownsClient: true,
        collectionOptions);
    
  4. Pada Definisi Properti Vektor: Saat menentukan properti secara terprogram, Anda dapat mengatur generator penyematan langsung pada properti .

    using Microsoft.Extensions.AI;
    using Microsoft.Extensions.VectorData;
    using OpenAI;
    
    var embeddingGenerator = new OpenAIClient("your key")
        .GetEmbeddingClient("your chosen model")
        .AsIEmbeddingGenerator();
    
    var vectorProperty = new VectorStoreVectorProperty("DescriptionEmbedding", typeof(string), dimensions: 1536)
    {
         EmbeddingGenerator = embeddingGenerator
    };
    

Contoh Penggunaan

Contoh berikut menunjukkan cara menggunakan generator penyematan untuk secara otomatis menghasilkan vektor selama operasi upsert dan pencarian. Pendekatan ini menyederhanakan alur kerja dengan menghilangkan kebutuhan untuk melakukan pra-komputasi penyematan secara manual.

// The data model
internal class FinanceInfo
{
    [VectorStoreKey]
    public string Key { get; set; } = string.Empty;

    [VectorStoreData]
    public string Text { get; set; } = string.Empty;

    // Note that the vector property is typed as a string, and
    // its value is derived from the Text property. The string
    // value will however be converted to a vector on upsert and
    // stored in the database as a vector.
    [VectorStoreVector(1536)]
    public string Embedding => this.Text;
}

// Create an OpenAI embedding generator.
var embeddingGenerator = new OpenAIClient("your key")
    .GetEmbeddingClient("your chosen model")
    .AsIEmbeddingGenerator();

// Use the embedding generator with the vector store.
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<string, FinanceInfo>("finances");
await collection.EnsureCollectionExistsAsync();

// Create some test data.
string[] budgetInfo =
{
    "The budget for 2020 is EUR 100 000",
    "The budget for 2021 is EUR 120 000",
    "The budget for 2022 is EUR 150 000",
    "The budget for 2023 is EUR 200 000",
    "The budget for 2024 is EUR 364 000"
};

// Embeddings are generated automatically on upsert.
var records = budgetInfo.Select((input, index) => new FinanceInfo { Key = index.ToString(), Text = input });
await collection.UpsertAsync(records);

// Embeddings for the search is automatically generated on search.
var searchResult = collection.SearchAsync(
    "What is my budget for 2024?",
    top: 1);

// Output the matching result.
await foreach (var result in searchResult)
{
    Console.WriteLine($"Key: {result.Record.Key}, Text: {result.Record.Text}");
}

Menghasilkan embedding sendiri

Membuat generator penyematan

Lihat Menyematkan Generasi untuk contoh tentang cara membuat instans Kernel ITextEmbeddingGenerationService Semantik.

Lihat Microsoft.Extensions.AI.Abstractions untuk informasi tentang cara membuat Microsoft.Extensions.AI layanan pembuatan penyematan.

Menghasilkan penyematan pada upsert dengan Kernel Semantik ITextEmbeddingGenerationService

public async Task GenerateEmbeddingsAndUpsertAsync(
    ITextEmbeddingGenerationService textEmbeddingGenerationService,
    VectorStoreCollection<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" }
    });
}

Menghasilkan embedding pada pencarian dengan Kernel Semantik ITextEmbeddingGenerationService

public async Task GenerateEmbeddingsAndSearchAsync(
    ITextEmbeddingGenerationService textEmbeddingGenerationService,
    VectorStoreCollection<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.
    IAsyncEnumerable<VectorSearchResult<Hotel>> searchResult = collection.SearchAsync(searchEmbedding, top: 1);
    List<VectorSearchResult<Hotel>> resultItems = await searchResult.ToListAsync();

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

Tips

Untuk informasi selengkapnya tentang pembuatan penyematan, lihat Embedding generation di Kernel Semantik.

Menyematkan dimensi

Database vektor biasanya mengharuskan Anda menentukan jumlah dimensi yang dimiliki setiap vektor saat membuat koleksi. Model penyematan yang berbeda biasanya mendukung pembuatan vektor dengan berbagai ukuran dimensi. Misalnya, OpenAI text-embedding-ada-002 menghasilkan vektor dengan 1536 dimensi. Beberapa model juga memungkinkan pengembang untuk memilih jumlah dimensi yang mereka inginkan di vektor output. Misalnya, Google text-embedding-004 menghasilkan vektor dengan 768 dimensi secara default, tetapi memungkinkan pengembang untuk memilih sejumlah dimensi antara 1 dan 768.

Penting untuk memastikan bahwa vektor yang dihasilkan oleh model penyematan memiliki jumlah dimensi yang sama dengan vektor yang cocok dalam database.

Jika membuat koleksi menggunakan abstraksi Kernel Semantik Vector Store, Anda perlu menentukan jumlah dimensi yang diperlukan untuk setiap properti vektor baik melalui anotasi atau melalui definisi rekaman. Berikut adalah contoh keduanya mengatur jumlah dimensi ke 1536.

[VectorStoreVector(Dimensions: 1536)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
new VectorStoreVectorProperty("DescriptionEmbedding", typeof(float), dimensions: 1536);

Tips

Untuk informasi selengkapnya tentang cara membuat anotasi model data Anda, lihat menentukan model data Anda.

Tips

Untuk informasi selengkapnya tentang cara membuat definisi rekaman, lihat penentuan skema Anda menggunakan definisi rekaman.

Segera hadir

Info lebih lanjut akan segera hadir.

Segera hadir

Info lebih lanjut akan segera hadir.