Freigeben über


Generieren von Einbettungen für semantische Kernel-Vektorspeicher-Connectors

Warnung

Die Funktionalität des Semantic Kernel-Vektorspeichers befindet sich in der Vorschau, und Verbesserungen, die grundlegende Änderungen erfordern, können in vereinzelten Fällen noch vor der Veröffentlichung auftreten.

Warnung

Die Funktionalität des Semantic Kernel-Vektorspeichers befindet sich in der Vorschau, und Verbesserungen, die grundlegende Änderungen erfordern, können in vereinzelten Fällen noch vor der Veröffentlichung auftreten.

Semantische Kernelvektorspeicher-Connectors unterstützen mehrere Möglichkeiten zum Generieren von Einbettungen. Einbettungen können vom Entwickler generiert und als Teil eines Datensatzes übergeben werden, wenn ein VectorStoreCollection verwendet wird oder intern zum VectorStoreCollection generiert werden.

Das Generieren von Einbettungen durch den Vektorspeicher

Sie können einen Einbettungsgenerator in Ihren Vektorspeicher konfigurieren, sodass Einbettungen während upsert- und Suchvorgängen automatisch generiert werden können, sodass die Notwendigkeit einer manuellen Vorverarbeitung beseitigt wird.

Zum automatischen Generieren von Vektoren beim Upsert wird die Vektoreigenschaft in Ihrem Datenmodell als Quelltyp definiert, z. B. Zeichenfolge, und dennoch mit einem VectorStoreVectorPropertyAttribute versehen.

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

Vor dem Upsert sollte die Embedding Eigenschaft die Zeichenfolge enthalten, aus der ein Vektor generiert werden soll. Der Typ des in der Datenbank gespeicherten Vektors (z. B. float32, float16 usw.) wird vom konfigurierten Einbettungsgenerator abgeleitet.

Von Bedeutung

Diese Vektoreigenschaften unterstützen nicht das Abrufen des generierten Vektors oder des ursprünglichen Texts, aus dem der Vektor generiert wurde. Sie speichern auch nicht den ursprünglichen Text. Wenn der ursprüngliche Text gespeichert werden muss, sollte eine separate Data-Eigenschaft hinzugefügt werden, um ihn zu speichern.

Einbettungsgeneratoren, die die Microsoft.Extensions.AI Abstraktionen implementieren, werden unterstützt und können auf verschiedenen Ebenen konfiguriert werden:

  1. Im Vektorspeicher: Sie können einen Standardeinbettungsgenerator für den gesamten Vektorspeicher festlegen. Dieser Generator wird für alle Sammlungen und Eigenschaften verwendet, sofern keine Überschreibung vorgenommen wird.

    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. In einer Sammlung: Sie können einen Einbettungsgenerator für eine bestimmte Sammlung konfigurieren und den Generator auf Speicherebene außer Kraft setzen.

    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. Bei einer Datensatzdefinition: Beim programmgesteuerten VectorStoreCollectionDefinitionDefinieren von Eigenschaften können Sie einen Einbettungsgenerator für alle Eigenschaften angeben.

    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. Bei einer Vector-Eigenschaftsdefinition: Beim programmgesteuerten Definieren von Eigenschaften können Sie einen Einbettungsgenerator direkt in die Eigenschaft festlegen.

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

Anwendungsbeispiel

Im folgenden Beispiel wird veranschaulicht, wie der Einbettungsgenerator verwendet wird, um Vektoren während der Hochladen- und Einfügevorgänge sowie der Suchvorgänge automatisch zu generieren. Dieser Ansatz vereinfacht Workflows, da keine manuellen Einbettungen vorkompiliert werden müssen.


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

Einbettungen selbst generieren

Erstellen eines Einbettungsgenerators

Beispiele zum Erstellen semantischer Kernelinstanzen finden Sie unter ITextEmbeddingGenerationService.

Informationen darüber, wie man Einbettungsgenerierungsdienste erstellt, finden Sie in Microsoft.Extensions.AI.

Generieren von Embeddings bei Upsert mit Semantischem Kernel 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" }
    });
}

Generieren von Einbettungen bei der Suche mit semantischem Kernel 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);
}

Tipp

Weitere Informationen zur Erstellung von Einbettungen finden Sie unter Einbettungserstellung im Semantischen Kernel.

Einbettungsdimensionen

Vektordatenbanken erfordern in der Regel, dass Sie die Anzahl der Dimensionen angeben, die jeder Vektor beim Erstellen der Auflistung hat. Verschiedene Einbettungsmodelle unterstützen in der Regel das Generieren von Vektoren mit verschiedenen Dimensiongrößen. Beispielsweise generiert OpenAI text-embedding-ada-002 Vektoren mit 1536 Dimensionen. Einige Modelle ermöglichen es entwicklern auch, die Anzahl der gewünschten Dimensionen im Ausgabevektor auszuwählen. Beispielsweise produziert Google text-embedding-004 Vektoren mit 768 Dimensionen standardmäßig, ermöglicht es einem Entwickler jedoch, eine beliebige Anzahl von Dimensionen zwischen 1 und 768 auszuwählen.

Es ist wichtig sicherzustellen, dass die vom Einbettungsmodell generierten Vektoren dieselbe Anzahl von Dimensionen aufweisen wie der übereinstimmende Vektor in der Datenbank.

Wenn Sie eine Auflistung mit den Abstraktionen des semantischen Kernelvektorspeichers erstellen, müssen Sie die Anzahl der Dimensionen angeben, die für jede Vektoreigenschaft entweder über Anmerkungen oder über die Datensatzdefinition erforderlich sind. Hier sind Beispiele für beide Varianten der Festlegung der Anzahl der Dimensionen auf 1536.

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

Tipp

Weitere Informationen zum Kommentieren des Datenmodells finden Sie unter Definieren des Datenmodells.

Tipp

Weitere Informationen zum Erstellen einer Datensatzdefinition finden Sie unter Definieren des Schemas mit einer Datensatzdefinition.

In Kürze verfügbar

Weitere Informationen werden in Kürze verfügbar sein.

In Kürze verfügbar

Weitere Informationen werden in Kürze verfügbar sein.