Sdílet prostřednictvím


Generování vložených konektorů pro sémantické úložiště vektorů jádra

Upozornění

Funkce sémantického úložiště vektorů jádra je ve verzi Preview a vylepšení, která vyžadují zásadní změny, se můžou vyskytovat za omezených okolností před vydáním.

Upozornění

Funkce sémantického úložiště vektorů jádra je ve verzi Preview a vylepšení, která vyžadují zásadní změny, se můžou vyskytovat za omezených okolností před vydáním.

Sémantické konektory Jádra Vector Store podporují různé způsoby generování vložených objektů. Embeddiny může vygenerovat vývojář a předat jako součást záznamu při použití VectorStoreCollection, nebo mohou být generovány interně uvnitř VectorStoreCollectionsouboru.

Nechat úložiště vektorů generovat vložené položky

V úložišti vektorů můžete nakonfigurovat generátor vkládání, který umožňuje automatické generování vkládání během operací upsertu i vyhledávání, což eliminuje potřebu ručního předběžného zpracování.

Aby bylo možné automaticky generovat vektory u upsertu, je vlastnost vektoru ve vašem datovém modelu definována jako typ zdroje, například řetězec, ale stále zdobený znakem VectorStoreVectorPropertyAttribute.

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

Před upsertem Embedding by vlastnost měla obsahovat řetězec, ze kterého by měl být vygenerován vektor. Typ vektoru uloženého v databázi (např. float32, float16 atd.) bude odvozen z nakonfigurovaného generátoru vkládání.

Důležité

Tyto vlastnosti vektoru nepodporují načtení generovaného vektoru nebo původního textu, ze kterého byl vektor generován. Neukládají ani původní text. Pokud je potřeba uložit původní text, měla by být pro uložení přidána samostatná vlastnost Data.

Generátory vkládání implementující Microsoft.Extensions.AI abstrakce jsou podporovány a lze je konfigurovat na různých úrovních:

  1. Ve vektorovém úložišti: Můžete nastavit výchozí generátor vkládání pro celé úložiště vektorů. Tento generátor se použije pro všechny kolekce a vlastnosti, pokud nebude přepsán.

    using Microsoft.Extensions.AI;
    using Microsoft.SemanticKernel.Connectors.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. Na kolekci: Můžete nakonfigurovat generátor vkládání pro konkrétní kolekci, čímž přepíšete generátor na úrovni úložiště.

    using Microsoft.Extensions.AI;
    using Microsoft.SemanticKernel.Connectors.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. Definice záznamu: Při programovém definování vlastností pomocí VectorStoreCollectionDefinition můžete specifikovat generátor vkládání pro všechny vlastnosti.

    using Microsoft.Extensions.AI;
    using Microsoft.Extensions.VectorData;
    using Microsoft.SemanticKernel.Connectors.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. Při definici vektorové vlastnosti: Při programovém definování vlastností můžete nastavit generátor vkládání přímo na vlastnost.

    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
    };
    

Příklad použití

Následující příklad ukazuje, jak pomocí generátoru vkládání automaticky generovat vektory během operací upsert i vyhledávání. Tento přístup zjednodušuje pracovní postupy tím, že eliminuje nutnost ručního dokončování vkládání.


// 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}");
}

Generování embeddingů vlastnoručně

Vytvoření generátoru zakódování

Příklady vytvoření sémantických instancí jádra najdete v tématu ITextEmbeddingGenerationService.

Informace o tom, jak vytvořit služby pro vkládání, najdete v tématu Microsoft.Extensions.AI.

Generování vkládání v upsertu pomocí sémantického jádra 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" }
    });
}

Generování embeddingů pro vyhledávání pomocí sémantického jádra 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);
}

Návod

Další informace o generování embeddingů najdete v sekci Generování embeddingů v sémantickém jádru.

Vložené dimenze

Vektorové databáze obvykle vyžadují, abyste při vytváření kolekce určili počet dimenzí, které má každý vektor. Různé modely vkládání obvykle podporují generování vektorů s různými velikostmi dimenzí. Například OpenAI text-embedding-ada-002 generuje vektory s rozměry 1536. Některé modely také umožňují vývojáři zvolit požadovaný počet dimenzí ve výstupním vektoru. Google například text-embedding-004 ve výchozím nastavení vytváří vektory s rozměry 768, ale umožňuje vývojáři zvolit libovolný počet dimenzí mezi 1 a 768.

Je důležité zajistit, aby vektory generované modelem vkládání měly stejný počet dimenzí jako odpovídající vektor v databázi.

Pokud vytváříte kolekci pomocí abstrakcí sémantického úložiště vektorů jádra, musíte určit počet dimenzí požadovaných pro každou vektorovou vlastnost prostřednictvím poznámek nebo prostřednictvím definice záznamu. Tady jsou příklady nastavení počtu dimenzí na 1536.

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

Návod

Další informace o tom, jak anotovat datový model, najdete v tématu definování datového modelu.

Návod

Další informace o vytvoření definice záznamu najdete v definování vašeho schématu pomocí definice záznamu.

Již brzy

Další informace budou brzy k dispozici.

Již brzy

Další informace budou brzy k dispozici.