Guía de migración de llamadas a funciones
El kernel semántico pasa gradualmente de las funcionalidades de llamada de función actuales, representadas por la ToolCallBehavior
clase , a las nuevas funcionalidades mejoradas, representadas por la FunctionChoiceBehavior
clase .
La nueva funcionalidad es independiente del servicio y no está vinculada a ningún servicio de IA específico, a diferencia del modelo actual. Por lo tanto, reside en abstracciones semánticas del kernel y todos los conectores de IA que trabajan con modelos de IA compatibles con llamadas a funciones.
Esta guía está pensada para ayudarle a migrar el código a las nuevas funcionalidades de llamada de función.
Migración del comportamiento toolCallBehavior.AutoInvokeKernelFunctions
El ToolCallBehavior.AutoInvokeKernelFunctions
comportamiento es equivalente al FunctionChoiceBehavior.Auto
comportamiento del nuevo modelo.
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
Migración del comportamiento de ToolCallBehavior.EnableKernelFunctions
El ToolCallBehavior.EnableKernelFunctions
comportamiento es equivalente al FunctionChoiceBehavior.Auto
comportamiento con la invocación automática deshabilitada.
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };
Migración del comportamiento de ToolCallBehavior.EnableFunctions
El ToolCallBehavior.EnableFunctions
comportamiento es equivalente al FunctionChoiceBehavior.Auto
comportamiento configurado con la lista de funciones con invocación automática deshabilitada.
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) };
Migración del comportamiento ToolCallBehavior.RequireFunction
El ToolCallBehavior.RequireFunction
comportamiento es equivalente al FunctionChoiceBehavior.Required
comportamiento configurado con la lista de funciones con invocación automática deshabilitada.
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) };
Reemplazar el uso de clases de llamada de función específicas del conector
La funcionalidad de llamada de funciones en kernel semántico permite a los desarrolladores acceder a una lista de funciones elegidas por el modelo de IA de dos maneras:
- Usar clases de llamada de función específicas del conector como
ChatToolCall
oChatCompletionsFunctionToolCall
, disponibles a través de laToolCalls
propiedad del elemento específicoOpenAIChatMessageContent
de OpenAI en el historial de chats. - Usar clases de llamada de función independiente del conector, como
FunctionCallContent
, disponibles a través de laItems
propiedad del elemento independienteChatMessageContent
del conector en el historial de chat.
En este momento, los modelos actuales y nuevos admiten ambas formas. Sin embargo, se recomienda encarecidamente usar el enfoque independiente del conector para acceder a las llamadas de función, ya que es más flexible y permite que el código funcione con cualquier conector de IA que admita el nuevo modelo de llamada a funciones. Además, teniendo en cuenta que el modelo actual quedará en desuso pronto, ahora es un buen momento para migrar el código al nuevo modelo para evitar cambios importantes en el futuro.
Por lo tanto, si usa la invocación de función manual con las clases de llamada de función específicas del conector, como en este fragmento 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();
}
Puede refactorizarlo para usar las clases independientes del 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();
}
Los fragmentos de código anteriores muestran cómo migrar el código que usa el conector openAI AI. Un proceso de migración similar se puede aplicar a los conectores de Inteligencia artificial DeGéminis y Mistral cuando se actualizan para admitir el nuevo modelo de llamada de función.
Pasos siguientes
Ahora después de migrar el código al nuevo modelo de llamada de función, puede continuar para aprender a configurar varios aspectos del modelo que podrían corresponder mejor a sus escenarios específicos haciendo referencia a la sección comportamientos de llamada de función.
Próximamente
Más información próximamente.
Próximamente
Más información próximamente.