共用方式為


函式調用模式

當 AI 模型收到包含函式清單的提示時,可以選擇其中一或多個函式來叫用以完成提示。 模型選擇函式時,需要 由 Semantic Kernel 叫用

語意核心中呼叫子系統的函式有兩種函式調用模式: automanual

根據調用模式,語意核心會執行端對端函式調用,或提供呼叫端對函式調用程式的控制權。

自動函數調用

自動函數調用是語意核心函式呼叫子系統的預設模式。 當 AI 模型選擇一或多個函式時,語意核心會自動叫用所選的函式。 這些函式調用的結果會新增至聊天記錄,並在後續要求中自動傳送至模型。 模型接著會因應聊天記錄、視需要選擇其他函式,或產生最終回應。 此方法是完全自動化的,不需要呼叫端進行手動介入。

此範例示範如何在語意核心中使用自動函數調用。 AI 模型會決定要呼叫哪些函式來完成提示,而語意核心會執行其餘作業,並自動叫用它們。

using Microsoft.SemanticKernel;

IKernelBuilder builder = Kernel.CreateBuilder(); 
builder.AddOpenAIChatCompletion("<model-id>", "<api-key>");
builder.Plugins.AddFromType<WeatherForecastUtils>();
builder.Plugins.AddFromType<DateTimeUtils>(); 

Kernel kernel = builder.Build();

// By default, functions are set to be automatically invoked.  
// If you want to explicitly enable this behavior, you can do so with the following code:  
// PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: true) };  
PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() }; 

await kernel.InvokePromptAsync("Given the current time of day and weather, what is the likely color of the sky in Boston?", new(settings));

某些 AI 模型支援平行函式呼叫,其中模型會選擇多個函式來進行調用。 這在叫用所選函式需要很長的時間的情況下很有用。 例如,AI 可以選擇同時擷取最新的新聞和目前時間,而不是針對每個函式進行往返。

語意核心可以透過兩種不同的方式叫用這些函式:

  • 循序:會逐一叫用函式。 此為預設行為。
  • 同時:同時叫用函式。 您可以將 屬性設定 FunctionChoiceBehaviorOptions.AllowConcurrentInvocationtrue來啟用,如下列範例所示。
using Microsoft.SemanticKernel;

IKernelBuilder builder = Kernel.CreateBuilder(); 
builder.AddOpenAIChatCompletion("<model-id>", "<api-key>");
builder.Plugins.AddFromType<NewsUtils>();
builder.Plugins.AddFromType<DateTimeUtils>(); 

Kernel kernel = builder.Build();

// Enable concurrent invocation of functions to get the latest news and the current time.
FunctionChoiceBehaviorOptions options = new() { AllowConcurrentInvocation = true };

PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: options) }; 

await kernel.InvokePromptAsync("Good morning! What is the current time and latest news headlines?", new(settings));

手動函式調用

如果呼叫端想要對函式調用程式擁有更多控制權,則可以使用手動函式調用。

啟用手動函式調用時,語意核心不會自動叫用 AI 模型所選擇的函式。 相反地,它會將所選函式的清單傳回給呼叫端,然後可以決定要叫用哪些函式、循序叫用或平行叫用、處理例外狀況等等。 函式調用結果必須新增至聊天記錄,並傳回至模型,其原因為何,並決定選擇其他函式或產生最終回應。

下列範例示範如何使用手動函式調用。

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

IKernelBuilder builder = Kernel.CreateBuilder(); 
builder.AddOpenAIChatCompletion("<model-id>", "<api-key>");
builder.Plugins.AddFromType<WeatherForecastUtils>();
builder.Plugins.AddFromType<DateTimeUtils>(); 

Kernel kernel = builder.Build();

IChatCompletionService chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

// Manual function invocation needs to be enabled explicitly by setting autoInvoke to false.
PromptExecutionSettings settings = new() { FunctionChoiceBehavior = Microsoft.SemanticKernel.FunctionChoiceBehavior.Auto(autoInvoke: false) };

ChatHistory chatHistory = [];
chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?");

while (true)
{
    ChatMessageContent result = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);

    // Check if the AI model has generated a response.
    if (result.Content is not null)
    {
        Console.Write(result.Content);
        // Sample output: "Considering the current weather conditions in Boston with a tornado watch in effect resulting in potential severe thunderstorms,
        // the sky color is likely unusual such as green, yellow, or dark gray. Please stay safe and follow instructions from local authorities."
        break;
    }

    // Adding AI model response containing chosen functions to chat history as it's required by the models to preserve the context.
    chatHistory.Add(result); 

    // Check if the AI model has chosen any function for invocation.
    IEnumerable<FunctionCallContent> functionCalls = FunctionCallContent.GetFunctionCalls(result);
    if (!functionCalls.Any())
    {
        break;
    }

    // Sequentially iterating over each chosen function, invoke it, and add the result to the chat history.
    foreach (FunctionCallContent functionCall in functionCalls)
    {
        try
        {
            // Invoking the function
            FunctionResultContent resultContent = await functionCall.InvokeAsync(kernel);

            // Adding the function result to the chat history
            chatHistory.Add(resultContent.ToChatMessage());
        }
        catch (Exception ex)
        {
            // Adding function exception to the chat history.
            chatHistory.Add(new FunctionResultContent(functionCall, ex).ToChatMessage());
            // or
            //chatHistory.Add(new FunctionResultContent(functionCall, "Error details that the AI model can reason about.").ToChatMessage());
        }
    }
}

注意

FunctionCallContent 和 FunctionResultContent 類別分別用來代表 AI 模型函式呼叫和語意核心函式調用結果。 它們包含所選函式的相關信息,例如函式標識碼、名稱和自變數,以及函數調用結果,例如函數調用標識符和結果。

即將推出

更多信息即將推出。

即將推出

更多信息即將推出。