Delen via


Embeddings genereren voor Semantische Kernel Vector Store-connectors

Waarschuwing

De Semantische Kernel Vector Store-functionaliteit is in preview en verbeteringen waarvoor wijzigingen die fouten veroorzaken, kunnen nog steeds in beperkte omstandigheden optreden voordat ze worden uitgebracht.

Semantische kernel biedt ondersteuning voor het genereren van insluitingen met behulp van veel populaire AI-services.

Deze services kunnen rechtstreeks worden samengesteld of worden toegevoegd aan een container voor afhankelijkheidsinjectie en kunnen van daaruit worden omgezet.

Een generator voor insluiten maken

U kunt rechtstreeks exemplaren maken van de services voor het insluiten van tekst die door Semantic Kernel worden geleverd. Ze implementeren allemaal de ITextEmbeddingGenerationService interface.

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

U kunt ook helpers gebruiken om ze te registreren bij een container voor afhankelijkheidsinjectie.

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

Insluitingen genereren

Als u de ITextEmbeddingGenerationService gemaakte methode wilt gebruiken, roept u de GenerateEmbeddingAsync methode erop aan.

Hier volgt een voorbeeld van het genereren van insluitingen bij het uploaden van records.

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

Hier volgt een voorbeeld van het genereren van insluitingen bij het zoeken.

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

Dimensies voor insluiten

Voor vectordatabases moet u doorgaans het aantal dimensies opgeven dat elke vector heeft bij het maken van de verzameling. Verschillende insluitmodellen ondersteunen doorgaans het genereren van vectoren met verschillende dimensiegrootten. Open AI text-embedding-ada-002 genereert bijvoorbeeld vectoren met 1536 dimensies. Bij sommige modellen kan een ontwikkelaar ook het gewenste aantal dimensies kiezen in de uitvoervector, bijvoorbeeld Google text-embedding-004 produceert vectoren met standaard 768 dimensies, maar stelt een ontwikkelaar in staat om een willekeurig aantal dimensies tussen 1 en 768 te kiezen.

Het is belangrijk om ervoor te zorgen dat de vectoren die door het insluitmodel worden gegenereerd, hetzelfde aantal dimensies hebben als de overeenkomende vector in de database.

Als u een verzameling maakt met behulp van de Semantische Kernel Vector Store-abstracties, moet u het aantal dimensies opgeven dat vereist is voor elke vectoreigenschap via aantekeningen of via de recorddefinitie. Hier volgen voorbeelden van het instellen van het aantal dimensies op 1536.

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

Tip

Raadpleeg het definiƫren van uw gegevensmodel voor meer informatie over het maken van aantekeningen bij uw gegevensmodel.

Tip

Raadpleeg het definiƫren van uw schema met een recorddefinitie voor meer informatie over het maken van een recorddefinitie.

Binnenkort beschikbaar

Binnenkort meer informatie.

Binnenkort beschikbaar

Binnenkort meer informatie.