Partager via


Guide de migration des appels de fonction

Le noyau sémantique passe progressivement des fonctionnalités d’appel de fonction actuelle, représentées par la ToolCallBehavior classe, aux nouvelles fonctionnalités améliorées, représentées par la FunctionChoiceBehavior classe. La nouvelle fonctionnalité est indépendante du service et n’est liée à aucun service IA spécifique, contrairement au modèle actuel. Par conséquent, il réside dans les abstractions du noyau sémantique et sera utilisé par tous les connecteurs IA fonctionnant avec des modèles IA compatibles avec les appels de fonction.

Ce guide est destiné à vous aider à migrer votre code vers les nouvelles fonctionnalités d’appel de fonction.

Migrer le comportement ToolCallBehavior.AutoInvokeKernelFunctions

Le ToolCallBehavior.AutoInvokeKernelFunctions comportement est équivalent au FunctionChoiceBehavior.Auto comportement dans le nouveau modèle.

// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };

Migrer le comportement ToolCallBehavior.EnableKernelFunctions

Le ToolCallBehavior.EnableKernelFunctions comportement est équivalent au FunctionChoiceBehavior.Auto comportement avec appel automatique désactivé.

// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };

Migrer le comportement ToolCallBehavior.EnableFunctions

Le ToolCallBehavior.EnableFunctions comportement équivaut au comportement configuré avec la FunctionChoiceBehavior.Auto liste des fonctions avec appel automatique désactivé.

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) };

Migrer le comportement ToolCallBehavior.RequireFunction

Le ToolCallBehavior.RequireFunction comportement équivaut au comportement configuré avec la FunctionChoiceBehavior.Required liste des fonctions avec appel automatique désactivé.

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) };

Remplacer l’utilisation des classes d’appel de fonction spécifiques au connecteur

La fonctionnalité d’appel de fonction dans le noyau sémantique permet aux développeurs d’accéder à une liste de fonctions choisies par le modèle IA de deux façons :

  • À l’aide de classes d’appel de fonction spécifiques au connecteur comme ChatToolCall ou ChatCompletionsFunctionToolCall, disponibles via la ToolCalls propriété de l’élément spécifique OpenAIChatMessageContent à OpenAI dans l’historique des conversations.
  • À l’aide de classes d’appel de fonction indépendant du connecteur telles que FunctionCallContent, disponibles via la Items propriété de l’élément indépendant ChatMessageContent du connecteur dans l’historique des conversations.

Les deux méthodes sont prises en charge pour le moment par les modèles actuels et nouveaux. Toutefois, nous vous recommandons vivement d’utiliser l’approche indépendante du connecteur pour accéder aux appels de fonction, car elle est plus flexible et permet à votre code d’utiliser n’importe quel connecteur IA qui prend en charge le nouveau modèle d’appel de fonction. De plus, compte tenu du fait que le modèle actuel sera bientôt déprécié, il est maintenant judicieux de migrer votre code vers le nouveau modèle pour éviter les changements cassants à l’avenir.

Par conséquent, si vous utilisez l’appel de fonction manuelle avec les classes d’appel de fonction spécifiques au connecteur, comme dans cet extrait de code :

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();
}

Vous pouvez la refactoriser pour utiliser les classes indépendantes du connecteur :

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();
}

Les extraits de code ci-dessus montrent comment migrer votre code qui utilise le connecteur OpenAI AI. Un processus de migration similaire peut être appliqué aux connecteurs Gemini et Mistral AI lorsqu’ils sont mis à jour pour prendre en charge le nouveau modèle d’appel de fonction.

Étapes suivantes

Une fois que vous avez migré votre code vers le nouveau modèle d’appel de fonction, vous pouvez continuer à apprendre à configurer différents aspects du modèle qui pourraient mieux correspondre à vos scénarios spécifiques en faisant référence à la section comportements d’appel de fonction.

Bientôt disponible

Plus d’informations prochainement.

Bientôt disponible

Plus d’informations prochainement.