Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 do serviço e não está vinculado a nenhum serviço de IA específico, ao contrário do modelo atual. Portanto, ele reside em abstrações do Kernel Semântico e será usado por todos os conectores de IA que trabalham com modelos de IA capazes de chamar funções.
Este guia destina-se a ajudá-lo a migrar seu código para os novos recursos de chamada de função.
Migração do comportamento 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 "ToolCallBehavior.EnableKernelFunctions"
O ToolCallBehavior.EnableKernelFunctions comportamento é equivalente ao FunctionChoiceBehavior.Auto comportamento com invocação automática desativada.
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };
Migrar o comportamento das funções ativadas de ToolCallBehavior.EnableFunctions
O comportamento ToolCallBehavior.EnableFunctions é equivalente ao comportamento FunctionChoiceBehavior.Auto que é configurado com uma lista de funções com invocação automática desativada.
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 do ToolCallBehavior.RequireFunction
O comportamento ToolCallBehavior.RequireFunction é equivalente ao comportamento FunctionChoiceBehavior.Required que é configurado com a lista de funções com invocação automática desativada.
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) };
Substitua a utilização de classes de chamadas de funções específicas do conector
A funcionalidade de chamada de função no Kernel Semântico 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
ChatToolCallouChatCompletionsFunctionToolCall, disponíveis através da propriedadeToolCallsdo item específico do OpenAIOpenAIChatMessageContentno histórico de bate-papo. - Usando classes de chamada de função agnósticas ao conector como
FunctionCallContent, disponível através da propriedade do itemChatMessageContentagnóstico ao conector no histórico de bate-papo.
Ambos os caminhos são suportados no momento pelo modelo atual e novo. No entanto, recomendamos vivamente a utilização da abordagem independente do conector para aceder a chamadas de função, uma vez que é mais flexível e permite que o seu código funcione com qualquer conector de IA que suporte o 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 Manual de Função 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 refatorar para utilizar classes agnósticas a conectores:
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 trechos 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 suportar o novo modelo de chamada de função.
Próximos passos
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 aspetos do modelo que podem corresponder melhor aos seus cenários específicos, consultando a seção Comportamentos de chamada de função.
Brevemente
Mais informações em breve.
Brevemente
Mais informações em breve.