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
ouChatCompletionsFunctionToolCall
, disponibles via laToolCalls
propriété de l’élément spécifiqueOpenAIChatMessageContent
à OpenAI dans l’historique des conversations. - À l’aide de classes d’appel de fonction indépendant du connecteur telles que
FunctionCallContent
, disponibles via laItems
propriété de l’élément indépendantChatMessageContent
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.