共用方式為


函式呼叫移轉指南

語意核心會逐漸從類別所 ToolCallBehavior 代表的目前函式呼叫功能轉換為 類別所 FunctionChoiceBehavior 代表的新增強功能。 新功能與服務無關,與目前模型不同,不會系結至任何特定的 AI 服務。 因此,它位於語意核心抽象概念中,且將由所有 AI 連接器使用功能於功能可呼叫的 AI 模型。

本指南旨在協助您將程式代碼移轉至新的函式呼叫功能。

移轉 ToolCallBehavior.AutoInvokeKernelFunctions 行為

ToolCallBehavior.AutoInvokeKernelFunctions 行為相當於 FunctionChoiceBehavior.Auto 新模型中的行為。

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

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

移轉 ToolCallBehavior.EnableKernelFunctions 行為

ToolCallBehavior.EnableKernelFunctions 行為相當於 FunctionChoiceBehavior.Auto 停用自動調用的行為。

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

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

移轉 ToolCallBehavior.EnableFunctions 行為

ToolCallBehavior.EnableFunctions 行為相當於 FunctionChoiceBehavior.Auto 使用已停用自動調用之函式清單所設定的行為。

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

移轉 ToolCallBehavior.RequireFunction 行為

ToolCallBehavior.RequireFunction 行為相當於 FunctionChoiceBehavior.Required 使用已停用自動調用之函式清單所設定的行為。

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

取代連接器特定函式呼叫類別的使用方式

Semantic Kernel 中的函式呼叫功能可讓開發人員以兩種方式存取 AI 模型選擇的函式清單:

  • 使用連接器特定的函式呼叫類別,例如 ChatToolCallChatCompletionsFunctionToolCall,可透過 ToolCalls 聊天記錄中 OpenAI 特定 OpenAIChatMessageContent 項目的 屬性取得。
  • 使用連接器無關的函式呼叫類別,例如 FunctionCallContent,可透過 Items 聊天記錄中連接器無關 ChatMessageContent 項目的屬性取得。

目前和新的模型支援這兩種方式。 不過,我們強烈建議使用與連接器無關的方法來存取函式呼叫,因為它更具彈性,並可讓您的程式代碼使用任何支援新函式呼叫模型的 AI 連接器。 此外,考慮到目前的模型即將淘汰,現在是將程式代碼移轉至新模型的好時機,以避免未來發生重大變更。

因此,如果您使用 手動函式調用 搭配連接器特定的函式呼叫類別,如下列代碼段所示:

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

您可以重構它以使用與連接器無關的類別:

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

上述代碼段示範如何移轉使用 OpenAI AI 連接器的程式代碼。 當雙子座和Mistral AI連接器更新以支援新的函式呼叫模型時,也可以將類似的移轉程式套用至 Gemini 和 Mistral AI 連接器。

下一步

現在,將程式代碼移轉至新的函式呼叫模型之後,您可以繼續瞭解如何設定模型的各個層面,以參考函式呼叫行為一節,以更妥善地對應至您的特定案例。

即將推出

更多信息即將推出。

即將推出

更多信息即將推出。