共用方式為


函式選擇行為

函式選擇行為是可讓開發人員設定的組態位:

  1. 哪些函式會公告給 AI 模型。
  2. 模型應該如何選擇它們來叫用。
  3. Semantic Kernel 如何叫用這些函式。

自今天起,函式選擇行為會以 類別的 FunctionChoiceBehavior 三個靜態方法表示:

  • 自動:允許 AI 模型決定從零或多個提供的函式中選擇來叫用。
  • 必要:強制 AI 模型選擇提供的函式。
  • :指示 AI 模型不要選擇任何函式。

警告

函式呼叫功能是實驗性的,而且可能會有所變更。 預計到2024年11月中旬,它將正式上市。 請參閱 移轉指南 ,將您的程式代碼移轉至最新的函式呼叫功能。

注意

函式呼叫功能目前僅受少數 AI 連接器支援,如需詳細資訊,請參閱 下方支援的 AI 連接器 一節。

函式廣告

函式廣告是將函式提供給 AI 模型以進一步呼叫和叫用的程式。 這三種函式選擇行為都會接受函式清單,以做為 functions 參數公告。 根據預設,它是 null,這表示核心上註冊之外掛程式的所有函式都會提供給 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();

// All functions from the DateTimeUtils and WeatherForecastUtils plugins will be sent to AI model together with the prompt.
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 模型:

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

KernelFunction getWeatherForCity = kernel.Plugins.GetFunction("WeatherForecastUtils", "GetWeatherForCity");
KernelFunction getCurrentTime = kernel.Plugins.GetFunction("DateTimeUtils", "GetCurrentUtcDateTime");

// Only the specified getWeatherForCity and getCurrentTime functions will be sent to AI model alongside the prompt.
PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(functions: [getWeatherForCity, getCurrentTime]) }; 

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

函式的空白清單表示 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();

// Disables function calling. Equivalent to var settings = new() { FunctionChoiceBehavior = null } or var settings = new() { }.
PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(functions: []) }; 

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

使用自動函數選擇行為

Auto 式選擇行為會指示 AI 模型決定從零或多個提供的函式中選擇來叫用。

在此範例中,來自和 WeatherForecastUtils 外掛程式的所有函DateTimeUtils式都會與提示一起提供給 AI 模型。 模型會先選擇 GetCurrentTime 函式來叫用以取得目前的日期和時間,因為需要這項資訊作為函式的 GetWeatherForCity 輸入。 接下來,它將選擇 GetWeatherForCity 調用的功能,以使用取得的日期和時間取得波士頓市的天氣預報。 利用這項資訊,模型將能夠判斷波士頓天空的可能色彩。

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

// All functions from the DateTimeUtils and WeatherForecastUtils plugins will be provided to AI model alongside the prompt.
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));

您可以在 YAML 提示字元樣本組態中輕鬆建立相同的範例模型:

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

string promptTemplateConfig = """
    template_format: semantic-kernel
    template: Given the current time of day and weather, what is the likely color of the sky in Boston?
    execution_settings:
      default:
        function_choice_behavior:
          type: auto
    """;

KernelFunction promptFunction = KernelFunctionYaml.FromPromptYaml(promptTemplateConfig);

Console.WriteLine(await kernel.InvokeAsync(promptFunction));

使用必要的函式選擇行為

行為 Required 會強制模型為調用選擇提供的函式。 這適用於 AI 模型必須從指定的函式取得必要資訊,而不是從其本身的知識取得所需的信息的情況。

注意

行為只會公告第一個要求中的函式,並停止在後續要求中傳送函式,以防止無限迴圈,讓模型持續選擇相同的函式來重複叫用。

在這裡,我們指定 AI 模型必須選擇 GetWeatherForCity 調用函式,以取得波士頓市的天氣預報,而不是根據自己的知識進行猜測。 模型會先選擇叫用函 GetWeatherForCity 式來擷取天氣預報。 有了這項資訊,模型就可以使用呼叫 GetWeatherForCity的響應,判斷波士頓天空的可能色彩。

using Microsoft.SemanticKernel;

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

Kernel kernel = builder.Build();

KernelFunction getWeatherForCity = kernel.Plugins.GetFunction("WeatherForecastUtils", "GetWeatherForCity");

PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Required(functions: [getWeatherFunction]) };

await kernel.InvokePromptAsync("Given that it is now the 10th of September 2024, 11:29 AM, what is the likely color of the sky in Boston?", new(settings));

YAML 樣本組態中的相同範例:

using Microsoft.SemanticKernel;

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

Kernel kernel = builder.Build();

string promptTemplateConfig = """
    template_format: semantic-kernel
    template: Given that it is now the 10th of September 2024, 11:29 AM, what is the likely color of the sky in Boston?
    execution_settings:
      default:
        function_choice_behavior:
          type: auto
          functions:
            - WeatherForecastUtils.GetWeatherForCity
    """;

KernelFunction promptFunction = KernelFunctionYaml.FromPromptYaml(promptTemplateConfig);

Console.WriteLine(await kernel.InvokeAsync(promptFunction));

或者,您可以視需要將核心中註冊的所有函式提供給 AI 模型。 不過,語意核心只會叫用 AI 模型選擇的第一個要求所產生的要求。 後續要求中不會將函式傳送至 AI 模型,以防止無限迴圈,如上述所述。

using Microsoft.SemanticKernel;

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

Kernel kernel = builder.Build();

PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Required() };

await kernel.InvokePromptAsync("Given that it is now the 10th of September 2024, 11:29 AM, what is the likely color of the sky in Boston?", new(settings));

使用 None 函式選擇行為

行為 None 會指示 AI 模型使用提供的函式,而不需要選擇其中任何函式來產生回應。 當呼叫端可能想要查看模型會選擇哪些函式,而不實際叫用函式時,這很適合執行。 當您想要 AI 模型從使用者擷取資訊時,也很有用,例如,在 AI 模型下方的範例中正確找出波士頓是城市名稱。

在這裡,我們會將和 WeatherForecastUtils 外掛程式的所有函DateTimeUtils式公告至 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();

KernelFunction getWeatherForCity = kernel.Plugins.GetFunction("WeatherForecastUtils", "GetWeatherForCity");

PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.None() };

await kernel.InvokePromptAsync("Specify which provided functions are needed to determine the color of the sky in Boston on a specified date.", new(settings))

// Sample response: To determine the color of the sky in Boston on a specified date, first call the DateTimeUtils-GetCurrentUtcDateTime function to obtain the 
// current date and time in UTC. Next, use the WeatherForecastUtils-GetWeatherForCity function, providing 'Boston' as the city name and the retrieved UTC date and time. 
// These functions do not directly provide the sky's color, but the GetWeatherForCity function offers weather data, which can be used to infer the general sky condition (e.g., clear, cloudy, rainy).

YAML 提示範本組態中的對應範例:

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

string promptTemplateConfig = """
    template_format: semantic-kernel
    template: Specify which provided functions are needed to determine the color of the sky in Boston on a specified date.
    execution_settings:
      default:
        function_choice_behavior:
          type: none
    """;

KernelFunction promptFunction = KernelFunctionYaml.FromPromptYaml(promptTemplateConfig);

Console.WriteLine(await kernel.InvokeAsync(promptFunction));

函式調用

函式調用是 Sematic Kernel 叫用 AI 模型所選擇函式的程式。 如需函式調用的詳細資訊,請參閱 函式調用一文

支援的 AI 連接器

從目前起,語意核心中的下列 AI 連接器支援函式呼叫模型:

AI 連接器 FunctionChoiceBehavior ToolCallBehavior
Anthropic 計劃
AzureAIInference 即將推出
AzureOpenAI ✔️ ✔️
雙子座 計劃 ✔️
HuggingFace 計劃
Mistral 計劃 ✔️
Ollama 即將推出
Onnx 即將推出
OpenAI ✔️ ✔️

即將推出

更多信息即將推出。

即將推出

更多信息即將推出。