Compartilhar via


Guia de migração de chamada de função

O Kernel Semântico está gradualmente fazendo a transição dos recursos atuais de chamada de função, representados pela ToolCallBehavior classe, para os novos recursos aprimorados, representados pela FunctionChoiceBehavior classe. O novo recurso é independente de serviço e não está vinculado a nenhum serviço específico de IA, ao contrário do modelo atual. Portanto, ele reside em abstrações de Kernel Semântico e será usado por todos os conectores de IA que trabalham com modelos de IA com capacidade de chamada de função.

Este guia destina-se a ajudá-lo a migrar seu código para os novos recursos de chamada de função.

Migrar o comportamento de ToolCallBehavior.AutoInvokeKernelFunctions

O ToolCallBehavior.AutoInvokeKernelFunctions comportamento é equivalente ao FunctionChoiceBehavior.Auto comportamento no novo modelo.

// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };

Migrar o comportamento de ToolCallBehavior.EnableKernelFunctions

O ToolCallBehavior.EnableKernelFunctions comportamento é equivalente ao comportamento com a FunctionChoiceBehavior.Auto invocação automática desabilitada.

// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };

Migrar o comportamento de ToolCallBehavior.EnableFunctions

O ToolCallBehavior.EnableFunctions comportamento é equivalente ao comportamento configurado com a FunctionChoiceBehavior.Auto lista de funções com a invocação automática desabilitada.

var function = kernel.CreateFunctionFromMethod(() => DayOfWeek.Friday, "GetDayOfWeek", "Returns the current day of the week.");

// Before
var executionSettings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.EnableFunctions(functions: [function.Metadata.ToOpenAIFunction()]) };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(functions: [function], autoInvoke: false) };

Migrar o comportamento de ToolCallBehavior.RequireFunction

O ToolCallBehavior.RequireFunction comportamento é equivalente ao comportamento configurado com a FunctionChoiceBehavior.Required lista de funções com a invocação automática desabilitada.

var function = kernel.CreateFunctionFromMethod(() => DayOfWeek.Friday, "GetDayOfWeek", "Returns the current day of the week.");

// Before
var executionSettings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.RequireFunction(functions: [function.Metadata.ToOpenAIFunction()]) };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Required(functions: [function], autoInvoke: false) };

Substituir o uso de classes de chamada de função específicas do conector

A funcionalidade de chamada de função no Semantic Kernel permite que os desenvolvedores acessem uma lista de funções escolhidas pelo modelo de IA de duas maneiras:

  • Usando classes de chamada de função específicas do conector, como ChatToolCall ou ChatCompletionsFunctionToolCall, disponíveis por meio da ToolCalls propriedade do item específico OpenAIChatMessageContent do OpenAI no histórico de bate-papo.
  • Usando classes de chamada de função independentes de conector, como FunctionCallContent, disponíveis por meio da Items propriedade do item independente ChatMessageContent de conector no histórico de bate-papo.

Ambas as formas são suportadas no momento pelos modelos atuais e novos. No entanto, é altamente recomendável usar a abordagem independente de conector para acessar chamadas de função, pois ela é mais flexível e permite que seu código funcione com qualquer conector de IA que dê suporte ao novo modelo de chamada de função. Além disso, considerando que o modelo atual será preterido em breve, agora é um bom momento para migrar seu código para o novo modelo para evitar alterações significativas no futuro.

Portanto, se você usar a Invocação de Função Manual com as classes de chamada de função específicas do conector, como neste trecho de código:

using System.Text.Json;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using OpenAI.Chat;

var chatHistory = new ChatHistory();

var settings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };

var result = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);

// Current way of accessing function calls using connector specific classes.
var toolCalls = ((OpenAIChatMessageContent)result).ToolCalls.OfType<ChatToolCall>().ToList();

while (toolCalls.Count > 0)
{
    // Adding function call from AI model to chat history
    chatHistory.Add(result);

    // Iterating over the requested function calls and invoking them
    foreach (var toolCall in toolCalls)
    {
        string content = kernel.Plugins.TryGetFunctionAndArguments(toolCall, out KernelFunction? function, out KernelArguments? arguments) ?
            JsonSerializer.Serialize((await function.InvokeAsync(kernel, arguments)).GetValue<object>()) :
            "Unable to find function. Please try again!";

        // Adding the result of the function call to the chat history
        chatHistory.Add(new ChatMessageContent(
            AuthorRole.Tool,
            content,
            metadata: new Dictionary<string, object?>(1) { { OpenAIChatMessageContent.ToolIdProperty, toolCall.Id } }));
    }

    // Sending the functions invocation results back to the AI model to get the final response
    result = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);
    toolCalls = ((OpenAIChatMessageContent)result).ToolCalls.OfType<ChatToolCall>().ToList();
}

Você pode refatorá-lo para usar as classes independentes de conector:

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

var chatHistory = new ChatHistory();

var settings = new PromptExecutionSettings() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };

var messageContent = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);

// New way of accessing function calls using connector agnostic function calling model classes.
var functionCalls = FunctionCallContent.GetFunctionCalls(messageContent).ToArray();

while (functionCalls.Length != 0)
{
    // Adding function call from AI model to chat history
    chatHistory.Add(messageContent);

    // Iterating over the requested function calls and invoking them
    foreach (var functionCall in functionCalls)
    {
        var result = await functionCall.InvokeAsync(kernel);

        chatHistory.Add(result.ToChatMessage());
    }

    // Sending the functions invocation results to the AI model to get the final response
    messageContent = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);
    functionCalls = FunctionCallContent.GetFunctionCalls(messageContent).ToArray();
}

Os snippets de código acima demonstram como migrar seu código que usa o conector OpenAI AI. Um processo de migração semelhante pode ser aplicado aos conectores Gemini e Mistral AI quando eles são atualizados para dar suporte ao novo modelo de chamada de função.

Próximas etapas

Agora, depois de migrar seu código para o novo modelo de chamada de função, você pode continuar a aprender a configurar vários aspectos do modelo que podem corresponder melhor aos seus cenários específicos consultando a seção de comportamentos de chamada de função.

Em breve

Mais informações em breve.

Em breve

Mais informações em breve.