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


Завершение чата

С завершением чата можно имитировать обратную и вперед беседу с агентом ИИ. Это, конечно, полезно для создания чат-ботов, но его также можно использовать для создания автономных агентов, которые могут выполнять бизнес-процессы, создавать код и многое другое. Как основной тип модели, предоставляемый OpenAI, Google, Mistral, Facebook и другие, завершение чата является наиболее распространенной службой искусственного интеллекта, которую вы добавите в проект семантического ядра.

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

  • Какие модальности поддерживает модель (например, текст, изображение, звук и т. д.)?
  • Поддерживает ли она вызов функции?
  • Насколько быстро он получает и создает маркеры?
  • Сколько стоит каждый токен?

Внимание

Из всех приведенных выше вопросов самое важное — поддерживает ли модель вызов функции. Если это не так, вы не сможете использовать модель для вызова существующего кода. Большинство последних моделей из OpenAI, Google, Mistral и Amazon все поддерживают вызовы функций. Однако поддержка небольших языковых моделей по-прежнему ограничена.

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

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

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

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

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

dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI

Создание служб завершения чата

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

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

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

using Microsoft.SemanticKernel;

IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddAzureOpenAIChatCompletion(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT",
    modelId: "gpt-4", // Optional name of the underlying model if the deployment name doesn't match the model name
    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
);
Kernel kernel = kernelBuilder.Build();

Внедрение зависимостей

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

using Microsoft.SemanticKernel;

var builder = Host.CreateApplicationBuilder(args);

builder.Services.AddAzureOpenAIChatCompletion(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT",
    modelId: "gpt-4", // Optional name of the underlying model if the deployment name doesn't match the model name
    serviceId: "YOUR_SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);

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

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

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

using Microsoft.SemanticKernel.Connectors.AzureOpenAI;

AzureOpenAIChatCompletionService chatCompletionService = new (
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT",
    modelId: "gpt-4", // Optional name of the underlying model if the deployment name doesn't match the model name
    httpClient: new HttpClient() // Optional; if not provided, the HttpClient from the kernel will be used
);

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

Совет/Чаевые

Существует три метода предоставления необходимых сведений службам ИИ. Вы можете предоставить сведения непосредственно через конструктор, задать необходимые переменные среды или создать env-файл в каталоге проекта, содержащий переменные среды. На этой странице можно найти все необходимые переменные среды для каждого поставщика услуг ИИ: https://github.com/microsoft/semantic-kernel/blob/main/python/samples/concepts/setup/ALL_SETTINGS.md

from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion

chat_completion_service = AzureChatCompletion(
    deployment_name="my-deployment",  
    api_key="my-api-key",
    endpoint="my-api-endpoint", # Used to point to your service
    service_id="my-service-id", # Optional; for targeting specific services within Semantic Kernel
)

# You can do the following if you have set the necessary environment variables or created a .env file
chat_completion_service = AzureChatCompletion(service_id="my-service-id")

Примечание.

Служба AzureChatCompletion также поддерживает проверку подлинности Microsoft Entra. Если ключ API не указан, служба попытается пройти проверку подлинности с помощью токена Entra.

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

from semantic_kernel import Kernel

# Initialize the kernel
kernel = Kernel()

# Add the chat completion service created above to the kernel
kernel.add_service(chat_completion_service)

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

import com.azure.ai.openai.OpenAIAsyncClient;
import com.azure.ai.openai.OpenAIClientBuilder;
import com.microsoft.semantickernel.Kernel;
import com.microsoft.semantickernel.services.chatcompletion.ChatCompletionService;

// Create the client
OpenAIAsyncClient client = new OpenAIClientBuilder()
    .credential(azureOpenAIClientCredentials)
    .endpoint(azureOpenAIClientEndpoint)
    .buildAsyncClient();

// Create the chat completion service
ChatCompletionService openAIChatCompletion = OpenAIChatCompletion.builder()
    .withOpenAIAsyncClient(client)
    .withModelId(modelId)
    .build();

// Initialize the kernel
Kernel kernel = Kernel.builder()
    .withAIService(ChatCompletionService.class, openAIChatCompletion)
    .build();

Получение служб завершения чата

После добавления служб завершения чата в ядро их можно получить с помощью метода получения службы. Ниже приведен пример получения службы завершения чата из ядра.

var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase

# Retrieve the chat completion service by type
chat_completion_service = kernel.get_service(type=ChatCompletionClientBase)

# Retrieve the chat completion service by id
chat_completion_service = kernel.get_service(service_id="my-service-id")

# Retrieve the default inference settings
execution_settings = kernel.get_prompt_execution_settings_from_service_id("my-service-id")
ChatCompletionService chatCompletionService = kernel.getService(ChatCompletionService.class);

Совет/Чаевые

Добавление службы завершения чата в ядро не требуется, если вам не нужно использовать другие службы в ядре. Службу завершения чата можно использовать непосредственно в коде.

Использование служб завершения чата

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

  • не потоковый: Вы ждёте, пока служба сгенерирует весь ответ перед тем, как вернуть его пользователю.
  • Стриминг: отдельные фрагменты ответа создаются и возвращаются пользователю по мере их генерации.

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

from semantic_kernel.connectors.ai.open_ai import OpenAIChatPromptExecutionSettings

execution_settings = OpenAIChatPromptExecutionSettings()

Совет

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

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

Завершение чата без потоковой передачи

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

ChatHistory history = [];
history.AddUserMessage("Hello, how are you?");

var response = await chatCompletionService.GetChatMessageContentAsync(
    history,
    kernel: kernel
);
chat_history = ChatHistory()
chat_history.add_user_message("Hello, how are you?")

response = await chat_completion.get_chat_message_content(
    chat_history=history,
    settings=execution_settings,
)
ChatHistory history = new ChatHistory();
history.addUserMessage("Hello, how are you?");

InvocationContext optionalInvocationContext = null;

List<ChatMessageContent<?>> response = chatCompletionService.getChatMessageContentsAsync(
    history,
    kernel,
    optionalInvocationContext
);

Завершение потокового чата

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

ChatHistory history = [];
history.AddUserMessage("Hello, how are you?");

var response = chatCompletionService.GetStreamingChatMessageContentsAsync(
    chatHistory: history,
    kernel: kernel
);

await foreach (var chunk in response)
{
    Console.Write(chunk);
}
chat_history = ChatHistory()
chat_history.add_user_message("Hello, how are you?")

response = chat_completion.get_streaming_chat_message_content(
    chat_history=history,
    settings=execution_settings,
)

async for chunk in response:
    print(chunk, end="")

Примечание.

Семантический ядро для Java не поддерживает модель потоковой передачи ответа.

Следующие шаги

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