Freigeben über


Funktionsaufrufmodi

Wenn das KI-Modell eine Eingabeaufforderung mit einer Liste von Funktionen empfängt, kann es eine oder mehrere davon auswählen, um die Eingabeaufforderung abzuschließen. Wenn eine Funktion vom Modell ausgewählt wird, muss sie vom semantischen Kernel aufgerufen werden.

Das Funktionsaufrufsubsystem im semantischen Kernel verfügt über zwei Funktionsaufrufmodi: auto und manuell.

Abhängig vom Aufrufmodus führt der semantische Kernel entweder End-to-End-Funktionsaufrufe durch oder gibt dem Aufrufer die Steuerung des Funktionsaufrufs.

Auto Function Invocation

Der Aufruf automatischer Funktionen ist der Standardmodus des semantischen Kernel-Subsystems, das die Funktion aufruft. Wenn das KI-Modell eine oder mehrere Funktionen auswählt, ruft der semantische Kernel automatisch die ausgewählten Funktionen auf. Die Ergebnisse dieser Funktionsaufrufe werden dem Chatverlauf hinzugefügt und automatisch in nachfolgenden Anforderungen an das Modell gesendet. Das Modell hat dann Gründe für den Chatverlauf, wählt bei Bedarf zusätzliche Funktionen aus oder generiert die endgültige Antwort. Dieser Ansatz ist vollständig automatisiert und erfordert keinen manuellen Eingriff des Anrufers.

In diesem Beispiel wird veranschaulicht, wie der Automatische Funktionsaufruf im semantischen Kernel verwendet wird. Das KI-Modell entscheidet, welche Funktionen aufgerufen werden sollen, um die Eingabeaufforderung abzuschließen, und der semantische Kernel erledigt den Rest und ruft sie automatisch auf.

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

Einige KI-Modelle unterstützen parallele Funktionsaufrufe, bei denen das Modell mehrere Funktionen für den Aufruf auswählt. Dies kann in Fällen hilfreich sein, wenn das Aufrufen ausgewählter Funktionen eine lange Zeit in Anspruch nimmt. Beispielsweise kann die KI die neuesten Nachrichten und die aktuelle Zeit gleichzeitig abrufen, anstatt einen Roundtrip pro Funktion vorzunehmen.

Der semantische Kernel kann diese Funktionen auf zwei verschiedene Arten aufrufen:

  • Sequenziell: Die Funktionen werden nacheinander aufgerufen. Dies ist die Standardeinstellung.
  • Gleichzeitig: Die Funktionen werden gleichzeitig aufgerufen. Dies kann durch Festlegen der FunctionChoiceBehaviorOptions.AllowConcurrentInvocation Eigenschaft auf true, wie im folgenden Beispiel gezeigt, aktiviert werden.
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));

Manuelle Funktionsaufrufe

In Fällen, in denen der Aufrufer mehr Kontrolle über den Aufrufprozess der Funktion haben möchte, können manuelle Funktionsaufrufe verwendet werden.

Wenn der manuelle Funktionsaufruf aktiviert ist, ruft der semantische Kernel nicht automatisch die vom KI-Modell ausgewählten Funktionen auf. Stattdessen wird eine Liste ausgewählter Funktionen an den Aufrufer zurückgegeben, der dann entscheiden kann, welche Funktionen aufgerufen werden sollen, sie sequenziell oder parallel aufrufen, Ausnahmen behandeln usw. Die Ergebnisse des Funktionsaufrufs müssen dem Chatverlauf hinzugefügt und an das Modell zurückgegeben werden, aus welchen Gründen sie vorliegen und entscheiden, ob zusätzliche Funktionen ausgewählt oder die endgültige Antwort generiert werden sollen.

Das folgende Beispiel veranschaulicht, wie manuelle Funktionsaufrufe verwendet werden.

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

Hinweis

Die Klassen FunctionCallContent und FunctionResultContent werden verwendet, um AI-Modellfunktionsaufrufe bzw. semantische Kernel-Funktionsaufrufe darzustellen. Sie enthalten Informationen über die ausgewählte Funktion, z. B. die Funktions-ID, den Namen und Argumente sowie Die Ergebnisse des Funktionsaufrufs, z. B. Funktionsaufruf-ID und Ergebnis.

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.