Freigeben über


Migrationshandbuch für Funktionsaufrufe

Der semantische Kernel wechselt schrittweise von den aktuellen Funktionsaufruffunktionen, dargestellt durch die ToolCallBehavior Klasse, zu den neuen erweiterten Funktionen, die durch die FunctionChoiceBehavior Klasse dargestellt werden. Die neue Funktion ist serviceagnostisch und ist nicht an einen bestimmten KI-Dienst gebunden, im Gegensatz zum aktuellen Modell. Daher befindet es sich in semantischen Kernelabstraktionen und wird von allen KI-Connectors verwendet, die mit funktionsfähigen KI-Modellen arbeiten.

Dieses Handbuch soll Ihnen helfen, Ihren Code zu den neuen Funktionen zum Aufrufen von Funktionen zu migrieren.

Migrieren von ToolCallBehavior.AutoInvokeKernelFunctions-Verhalten

Das ToolCallBehavior.AutoInvokeKernelFunctions Verhalten entspricht dem FunctionChoiceBehavior.Auto Verhalten im neuen Modell.

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

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

Migrieren von ToolCallBehavior.EnableKernelFunctions-Verhalten

Das ToolCallBehavior.EnableKernelFunctions Verhalten entspricht dem FunctionChoiceBehavior.Auto Verhalten bei deaktiviertem automatischen Aufruf.

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

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

Migrieren von ToolCallBehavior.EnableFunctions-Verhalten

Das ToolCallBehavior.EnableFunctions Verhalten entspricht dem FunctionChoiceBehavior.Auto Verhalten, das mit einer Liste von Funktionen mit deaktiviertem automatischen Aufruf konfiguriert wurde.

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

Migrieren von ToolCallBehavior.RequireFunction-Verhalten

Das ToolCallBehavior.RequireFunction Verhalten entspricht dem FunctionChoiceBehavior.Required Verhalten, das mit einer Liste von Funktionen mit deaktiviertem automatischen Aufruf konfiguriert wurde.

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

Ersetzen der Verwendung von verbindungsspezifischen Funktionsaufrufklassen

Funktionenaufruffunktionen im semantischen Kernel ermöglichen Entwicklern den Zugriff auf eine Vom KI-Modell ausgewählte Liste von Funktionen auf zwei Arten:

  • Verwenden von verbindungsspezifischen Funktionsaufrufklassen wie ChatToolCall oder ChatCompletionsFunctionToolCall, die über die ToolCalls Eigenschaft des OpenAI-spezifischen OpenAIChatMessageContent Elements im Chatverlauf verfügbar sind.
  • Verwendung von verbindungsagnostischen Funktionsaufrufklassen wie FunctionCallContent, verfügbar über die Items Eigenschaft des konnektoragnostischen ChatMessageContent Elements im Chatverlauf.

Beide Möglichkeiten werden derzeit von den aktuellen und neuen Modellen unterstützt. Es wird jedoch dringend empfohlen, den connectoragnostischen Ansatz für den Zugriff auf Funktionsaufrufe zu verwenden, da es flexibler ist und es Ihrem Code ermöglicht, mit jedem KI-Connector zu arbeiten, der das neue Funktionsaufrufmodell unterstützt. Darüber hinaus ist angesichts der Tatsache, dass das aktuelle Modell bald veraltet sein wird, jetzt ein guter Zeitpunkt, um Ihren Code in das neue Modell zu migrieren, um zukünftige Änderungen zu vermeiden.

Wenn Sie also den manuellen Funktionsaufruf mit den verbindungsspezifischen Funktionsaufrufklassen wie in diesem Codeausschnitt verwenden:

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

Sie können ihn umgestalten, um die konnektoragnostischen Klassen zu verwenden:

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

Die obigen Codeausschnitte veranschaulichen, wie Sie Ihren Code migrieren, der den OpenAI AI-Connector verwendet. Ein ähnlicher Migrationsprozess kann auf die Gemini- und Mistral AI-Connectors angewendet werden, wenn sie aktualisiert werden, um das neue Funktionsaufrufmodell zu unterstützen.

Nächste Schritte

Nachdem Sie ihren Code zum neuen Funktionsaufrufmodell migriert haben, können Sie nun erfahren, wie Sie verschiedene Aspekte des Modells konfigurieren, die Ihren spezifischen Szenarien besser entsprechen, indem Sie sich auf den Abschnitt "Funktionsaufrufverhalten" beziehen.

In Kürze verfügbar

Weitere Informationen werden in Kürze verfügbar sein.

In Kürze verfügbar

Weitere Informationen werden in Kürze verfügbar sein.