Поделиться через


Создание внедренных модулей для соединителей хранилища векторов семантического ядра

Предупреждение

Функции хранилища векторов семантического ядра доступны в предварительной версии и улучшения, требующие критических изменений, могут по-прежнему возникать в ограниченных обстоятельствах перед выпуском.

Семантический ядро поддерживает создание внедрения с помощью многих популярных служб ИИ из поля.

Эти службы можно создавать напрямую или добавлять в контейнер внедрения зависимостей и разрешать их оттуда.

Создание генератора внедрения

Вы можете создавать экземпляры служб внедрения текста, предоставляемых семантического ядра напрямую. Все они реализуют ITextEmbeddingGenerationService интерфейс.

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

Вы также можете использовать вспомогательные средства для регистрации их в контейнере внедрения зависимостей.

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

Создание внедрения

Чтобы использовать ITextEmbeddingGenerationService созданный метод, просто вызовите GenerateEmbeddingAsync его.

Ниже приведен пример создания внедрения при отправке записей.

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

Ниже приведен пример создания внедрения при поиске.

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

Измерения внедрения

Для баз данных векторов обычно требуется указать количество измерений, которые каждый вектор имеет при создании коллекции. Различные модели внедрения обычно поддерживают создание векторов с разными размерами измерений. Например, Open AI text-embedding-ada-002 создает векторы с 1536 измерениями. Некоторые модели также позволяют разработчику выбирать количество измерений, которые они хотят в векторе вывода, например Google text-embedding-004 создает векторы с измерением 768 по умолчанию, но позволяет разработчику выбрать любое количество измерений от 1 до 768.

Важно убедиться, что векторы, созданные моделью внедрения, имеют то же количество измерений, что и соответствующий вектор в базе данных.

При создании коллекции с помощью абстракций векторного хранилища семантических ядер необходимо указать количество измерений, необходимых для каждого свойства вектора с помощью заметок или с помощью определения записи. Ниже приведены примеры того, как задать число измерений 1536.

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

Совет

Дополнительные сведения о том, как означать модель данных, см. в определении модели данных.

Совет

Дополнительные сведения о создании определения записи см . в определении схемы с определением записи.

Скоро

Дополнительные сведения в ближайшее время.

Скоро

Дополнительные сведения в ближайшее время.