Modos de invocación de función
Cuando el modelo de IA recibe un mensaje que contiene una lista de funciones, puede elegir uno o varios de ellos para que la invocación complete el mensaje. Cuando el modelo elige una función, el kernel se debe invocar mediante kernel semántico.
El subsistema de llamada de función en kernel semántico tiene dos modos de invocación de función: automático y manual.
En función del modo de invocación, el kernel semántico realiza la invocación de funciones de un extremo a otro o proporciona al autor de la llamada el control sobre el proceso de invocación de función.
Invocación de función automática
La invocación de función automática es el modo predeterminado del subsistema de llamada a funciones semánticas del kernel. Cuando el modelo de IA elige una o varias funciones, el kernel semántico invoca automáticamente las funciones elegidas. Los resultados de estas invocaciones de función se agregan al historial de chat y se envían al modelo automáticamente en las solicitudes posteriores. A continuación, el modelo tiene motivos sobre el historial de chat, elige funciones adicionales si es necesario o genera la respuesta final. Este enfoque está totalmente automatizado y no requiere ninguna intervención manual del autor de la llamada.
En este ejemplo se muestra cómo usar la invocación de función automática en kernel semántico. El modelo de IA decide qué funciones llamar para completar el símbolo del sistema y el kernel semántico hace el resto e los invoca automáticamente.
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));
Algunos modelos de IA admiten llamadas a funciones paralelas, donde el modelo elige varias funciones para la invocación. Esto puede ser útil en los casos en los que la invocación de funciones elegidas tarda mucho tiempo. Por ejemplo, la inteligencia artificial puede optar por recuperar las noticias más recientes y la hora actual simultáneamente, en lugar de realizar un recorrido de ida y vuelta por función.
El kernel semántico puede invocar estas funciones de dos maneras diferentes:
- Secuencialmente: las funciones se invocan una después de otra. Este es el comportamiento predeterminado.
- Simultáneamente: las funciones se invocan al mismo tiempo. Esto se puede habilitar estableciendo la
FunctionChoiceBehaviorOptions.AllowConcurrentInvocation
propiedadtrue
en , como se muestra en el ejemplo siguiente.
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));
Invocación de función manual
En los casos en los que el autor de la llamada quiere tener más control sobre el proceso de invocación de función, se puede usar la invocación de función manual.
Cuando se habilita la invocación de función manual, el kernel semántico no invoca automáticamente las funciones elegidas por el modelo de IA. En su lugar, devuelve una lista de funciones elegidas al autor de la llamada, que luego puede decidir qué funciones invocar, invocarlas secuencialmente o en paralelo, controlar excepciones, etc. Los resultados de la invocación de función deben agregarse al historial de chat y devolverse al modelo, lo que causa sobre ellos y decide si elegir funciones adicionales o generar la respuesta final.
En el ejemplo siguiente se muestra cómo usar la invocación manual de funciones.
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());
}
}
}
Nota:
Las clases FunctionCallContent y FunctionResultContent se usan para representar llamadas de función del modelo de IA y resultados de invocación de función de kernel semántica, respectivamente. Contienen información sobre la función elegida, como el identificador de función, el nombre y los argumentos, y los resultados de la invocación de función, como el identificador de llamada de función y el resultado.
Próximamente
Más información próximamente.
Próximamente
Más información próximamente.