Udostępnij za pośrednictwem


Generowanie osadzania dla łączników semantycznego magazynu wektorów jądra

Ostrzeżenie

Funkcja semantycznego magazynu wektorów jądra jest dostępna w wersji zapoznawczej, a ulepszenia wymagające zmian powodujących niezgodność mogą nadal występować w ograniczonych okolicznościach przed wydaniem.

Semantyczne jądro obsługuje generowanie osadzeń przy użyciu wielu popularnych usług sztucznej inteligencji.

Te usługi można skonstruować bezpośrednio lub dodać do kontenera wstrzykiwania zależności i rozwiązać z tego miejsca.

Konstruowanie generatora osadzania

Wystąpienia usług osadzania tekstu można tworzyć bezpośrednio przez jądro semantyczne. Wszystkie implementują ITextEmbeddingGenerationService interfejs.

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

Możesz również użyć pomocników do zarejestrowania ich w kontenerze iniekcji zależności.

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

Generowanie osadzania

Aby użyć utworzonego elementu ITextEmbeddingGenerationService , wystarczy wywołać metodę GenerateEmbeddingAsync .

Oto przykład generowania osadzania podczas przekazywania rekordów.

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

Oto przykład generowania osadzania podczas wyszukiwania.

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

Osadzanie wymiarów

Bazy danych wektorów zwykle wymagają określenia liczby wymiarów, które ma każdy wektor podczas tworzenia kolekcji. Różne modele osadzania zwykle obsługują generowanie wektorów o różnych rozmiarach wymiarów. Np. Open AI text-embedding-ada-002 generuje wektory o wymiarach 1536. Niektóre modele umożliwiają deweloperowi wybór liczby wymiarów, które chcą w wektorze wyjściowym, np. firma Google text-embedding-004 tworzy wektory z wymiarem 768 domyślnie, ale umożliwia deweloperowi wybranie dowolnej liczby wymiarów z zakresu od 1 do 768.

Należy upewnić się, że wektory generowane przez model osadzania mają taką samą liczbę wymiarów jak wektor pasujący w bazie danych.

W przypadku tworzenia kolekcji przy użyciu abstrakcji semantycznego magazynu wektorów jądra należy określić liczbę wymiarów wymaganych dla każdej właściwości wektora za pomocą adnotacji lub definicji rekordu. Poniżej przedstawiono przykłady ustawiania liczby wymiarów na 1536.

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

Napiwek

Aby uzyskać więcej informacji na temat dodawania adnotacji do modelu danych, zobacz Definiowanie modelu danych.

Napiwek

Aby uzyskać więcej informacji na temat tworzenia definicji rekordu, zapoznaj się z definiowaniem schematu przy użyciu definicji rekordu.

Wkrótce

Więcej informacji wkrótce.

Wkrótce

Więcej informacji wkrótce.