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


Режимы вызова функции

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

Подсистема вызова функции в семантическом ядре имеет два режима вызова функции: авто и вручную.

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

Автоматическое вызов функции

Автоматическое вызов функции — это режим по умолчанию подсистемы вызова функции семантического ядра. При выборе одной или нескольких функций модель искусственного интеллекта автоматически вызывает выбранные функции семантического ядра. Результаты этих вызовов функций добавляются в журнал чата и автоматически отправляются в модель в последующих запросах. Затем модель причины журнала чата, выбирает дополнительные функции при необходимости или создает окончательный ответ. Этот подход полностью автоматизирован и не требует ручного вмешательства вызывающего объекта.

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

using Microsoft.SemanticKernel;

IKernelBuilder builder = Kernel.CreateBuilder(); 
builder.AddOpenAIChatCompletion("<model-id>", "<api-key>");
builder.Plugins.AddFromType<WeatherForecastUtils>();
builder.Plugins.AddFromType<DateTimeUtils>(); 

Kernel kernel = builder.Build();

// By default, functions are set to be automatically invoked.  
// If you want to explicitly enable this behavior, you can do so with the following code:  
// PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: true) };  
PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() }; 

await kernel.InvokePromptAsync("Given the current time of day and weather, what is the likely color of the sky in Boston?", new(settings));

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

Семантический ядро может вызывать эти функции двумя способами:

  • Последовательно: функции вызываются друг за другом. Это поведение принимается по умолчанию.
  • Одновременно: функции вызываются одновременно. Это можно включить, установив FunctionChoiceBehaviorOptions.AllowConcurrentInvocation для свойства значение true, как показано в приведенном ниже примере.
using Microsoft.SemanticKernel;

IKernelBuilder builder = Kernel.CreateBuilder(); 
builder.AddOpenAIChatCompletion("<model-id>", "<api-key>");
builder.Plugins.AddFromType<NewsUtils>();
builder.Plugins.AddFromType<DateTimeUtils>(); 

Kernel kernel = builder.Build();

// Enable concurrent invocation of functions to get the latest news and the current time.
FunctionChoiceBehaviorOptions options = new() { AllowConcurrentInvocation = true };

PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: options) }; 

await kernel.InvokePromptAsync("Good morning! What is the current time and latest news headlines?", new(settings));

Вызов функции вручную

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

Если вызов функции вручную включен, семантический ядро не вызывает функции, выбранные моделью ИИ. Вместо этого он возвращает список выбранных функций вызывающему объекту, который затем может решить, какие функции вызывать, вызывать их последовательно или параллельно, обрабатывать исключения и т. д. Результаты вызова функции необходимо добавить в журнал чата и вернуться в модель, по каким причинам они и решить, следует ли выбрать дополнительные функции или создать окончательный ответ.

В приведенном ниже примере показано, как использовать вызов функции вручную.

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

IKernelBuilder builder = Kernel.CreateBuilder(); 
builder.AddOpenAIChatCompletion("<model-id>", "<api-key>");
builder.Plugins.AddFromType<WeatherForecastUtils>();
builder.Plugins.AddFromType<DateTimeUtils>(); 

Kernel kernel = builder.Build();

IChatCompletionService chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

// Manual function invocation needs to be enabled explicitly by setting autoInvoke to false.
PromptExecutionSettings settings = new() { FunctionChoiceBehavior = Microsoft.SemanticKernel.FunctionChoiceBehavior.Auto(autoInvoke: false) };

ChatHistory chatHistory = [];
chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?");

while (true)
{
    ChatMessageContent result = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);

    // Check if the AI model has generated a response.
    if (result.Content is not null)
    {
        Console.Write(result.Content);
        // Sample output: "Considering the current weather conditions in Boston with a tornado watch in effect resulting in potential severe thunderstorms,
        // the sky color is likely unusual such as green, yellow, or dark gray. Please stay safe and follow instructions from local authorities."
        break;
    }

    // Adding AI model response containing chosen functions to chat history as it's required by the models to preserve the context.
    chatHistory.Add(result); 

    // Check if the AI model has chosen any function for invocation.
    IEnumerable<FunctionCallContent> functionCalls = FunctionCallContent.GetFunctionCalls(result);
    if (!functionCalls.Any())
    {
        break;
    }

    // Sequentially iterating over each chosen function, invoke it, and add the result to the chat history.
    foreach (FunctionCallContent functionCall in functionCalls)
    {
        try
        {
            // Invoking the function
            FunctionResultContent resultContent = await functionCall.InvokeAsync(kernel);

            // Adding the function result to the chat history
            chatHistory.Add(resultContent.ToChatMessage());
        }
        catch (Exception ex)
        {
            // Adding function exception to the chat history.
            chatHistory.Add(new FunctionResultContent(functionCall, ex).ToChatMessage());
            // or
            //chatHistory.Add(new FunctionResultContent(functionCall, "Error details that the AI model can reason about.").ToChatMessage());
        }
    }
}

Примечание.

Классы FunctionCallContent и FunctionResultContent используются для представления вызовов функций модели ИИ и результатов вызова функции семантического ядра соответственно. Они содержат сведения о выбранной функции, таких как идентификатор функции, имя и аргументы, а также результаты вызова функции, такие как идентификатор вызова функции и результат.

Скоро

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

Скоро

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