函式調用模式
當 AI 模型收到包含函式清單的提示時,可以選擇其中一或多個函式來叫用以完成提示。 模型選擇函式時,需要 由 Semantic Kernel 叫用 。
語意核心中呼叫子系統的函式有兩種函式調用模式: auto 和 manual。
根據調用模式,語意核心會執行端對端函式調用,或提供呼叫端對函式調用程式的控制權。
自動函數調用
自動函數調用是語意核心函式呼叫子系統的預設模式。 當 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.AllowConcurrentInvocation
為true
來啟用,如下列範例所示。
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 模型函式呼叫和語意核心函式調用結果。 它們包含所選函式的相關信息,例如函式標識碼、名稱和自變數,以及函數調用結果,例如函數調用標識符和結果。
即將推出
更多信息即將推出。
即將推出
更多信息即將推出。