Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você 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 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 comportamento ToolCallBehavior.EnableFunctions é equivalente ao comportamento FunctionChoiceBehavior.Auto configurado com uma lista de funções onde a invocação automática está 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 FunctionChoiceBehavior.Required que é configurado com uma 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 a utilização 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
ChatToolCallouChatCompletionsFunctionToolCall, disponíveis por meio da propriedadeToolCallsdo itemOpenAIChatMessageContentespecífico do OpenAI no histórico de bate-papo. - Usando classes de chamada de função agnósticas em relação ao conector, como
FunctionCallContent, disponíveis por meio daItemspropriedade do item agnóstico em relação ao conectorChatMessageContentno 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 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 utilizar 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.