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


Создание текстового встраивания в семантическом ядре

С помощью генерации векторных представлений текста можно использовать модель искусственного интеллекта для создания векторов (также известных как эмбеддинги). Эти векторы кодируют семантический смысл текста таким образом, чтобы математические уравнения можно использовать в двух векторах для сравнения сходства исходного текста. Это полезно для таких сценариев, как RAG (генерация с дополнением извлечения), где мы хотим искать в базе данных информацию, связанную с пользовательским запросом. Затем любые соответствующие сведения можно предоставить в качестве входных данных для завершения чата, чтобы модель ИИ имеет больше контекста при ответе на запрос пользователя.

При выборе модели внедрения необходимо учитывать следующее:

  • Какой размер векторов, создаваемых моделью, и его можно настроить, так как это повлияет на затраты на хранилище векторов.
  • Какой тип элементов содержит созданные векторы, например float32, float16 и т. д., так как это повлияет на стоимость хранения векторов.
  • Насколько быстро он создает векторы?
  • Сколько стоит поколение?

Чаевые

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

Совет

Дополнительные сведения об использовании RAG с векторными хранилищами в семантическом ядре см. в разделе Как использовать векторные хранилища с поиском по тексту в семантическом ядре и Что такое плагины поиска по тексту в семантическом ядре?

Настройка локальной среды

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

Локальная настройка отсутствует.

Установка необходимых пакетов

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

dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI

Создание служб генерации текстовых встраиваний

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

Добавление непосредственно в ядро

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

Важный

Коннектор для генерации встраиваний Azure OpenAI в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #pragma warning disable SKEXP0010.

using Microsoft.SemanticKernel;

#pragma warning disable SKEXP0010
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddAzureOpenAITextEmbeddingGeneration(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
    endpoint: "YOUR_AZURE_ENDPOINT",           // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
    apiKey: "YOUR_API_KEY",
    modelId: "MODEL_ID",          // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
    serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel.
    httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used.
    dimensions: 1536              // Optional number of dimensions to generate embeddings with.
);
Kernel kernel = kernelBuilder.Build();

Использование механизма внедрения зависимостей

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

Важный

Соединитель генерации эмбеддингов Azure OpenAI в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #pragma warning disable SKEXP0010.

using Microsoft.SemanticKernel;

var builder = Host.CreateApplicationBuilder(args);

#pragma warning disable SKEXP0010
builder.Services.AddAzureOpenAITextEmbeddingGeneration(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
    endpoint: "YOUR_AZURE_ENDPOINT",           // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
    apiKey: "YOUR_API_KEY",
    modelId: "MODEL_ID",          // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
    serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel.
    dimensions: 1536              // Optional number of dimensions to generate embeddings with.
);

builder.Services.AddTransient((serviceProvider)=> {
    return new Kernel(serviceProvider);
});

Создание автономных экземпляров

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

Важный

Коннектор генерации встраиваний Azure OpenAI в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #pragma warning disable SKEXP0010.

using Microsoft.SemanticKernel.Connectors.AzureOpenAI;

#pragma warning disable SKEXP0010
AzureOpenAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
    endpoint: "YOUR_AZURE_ENDPOINT",           // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
    apiKey: "YOUR_API_KEY",
    modelId: "MODEL_ID",          // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
    httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used.
    dimensions: 1536              // Optional number of dimensions to generate embeddings with.
);

Использование служб создания текстовых встраиваний

Все службы генерации встраивания текста реализуют ITextEmbeddingGenerationService с одним методом GenerateEmbeddingsAsync, который может создавать ReadOnlyMemory<float> векторы из предоставленных string значений. Метод расширения GenerateEmbeddingAsync также доступен для версий, рассчитанных на одиночные значения той же операции.

Ниже приведен пример вызова службы с несколькими значениями.

IList<ReadOnlyMemory<float>> embeddings =
    await textEmbeddingGenerationService.GenerateEmbeddingsAsync(
    [
        "sample text 1",
        "sample text 2"
    ]);

Ниже приведен пример вызова службы с одним значением.

using Microsoft.SemanticKernel.Embeddings;

ReadOnlyMemory<float> embedding =
    await textEmbeddingGenerationService.GenerateEmbeddingAsync("sample text");

Скоро

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

Скоро

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