Compartir a través de


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 o ChatCompletionsFunctionToolCall, disponibles a través de la ToolCalls propiedad del elemento específico OpenAIChatMessageContent de OpenAI en el historial de chats.
  • Usar clases de llamada de función independiente del conector, como FunctionCallContent, disponibles a través de la Items propiedad del elemento independiente ChatMessageContent 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.