Delen via


Modus voor functie-aanroep

Wanneer het AI-model een prompt met een lijst met functies ontvangt, kan het een of meer ervan kiezen voor aanroep om de prompt te voltooien. Wanneer een functie wordt gekozen door het model, moet deze worden aangeroepen door Semantic Kernel.

Het subsysteem voor het aanroepen van functies in Semantische Kernel heeft twee modi van functieaanroepen: automatisch en handmatig.

Afhankelijk van de aanroepmodus, voert Semantische kernel een end-to-end functie aanroep uit of geeft de aanroeper controle over het functie-aanroepproces.

Automatische functieaanroepen

Automatische functieaanroep is de standaardmodus van het subsysteem voor Semantische kernelfuncties. Wanneer het AI-model een of meer functies kiest, roept Semantische kernel automatisch de gekozen functies aan. De resultaten van deze functie-aanroepen worden toegevoegd aan de chatgeschiedenis en automatisch verzonden naar het model in volgende aanvragen. Het model heeft vervolgens redenen voor de chatgeschiedenis, kiest indien nodig extra functies of genereert het uiteindelijke antwoord. Deze aanpak is volledig geautomatiseerd en vereist geen handmatige tussenkomst van de beller.

In dit voorbeeld ziet u hoe u de automatische functieaanroep gebruikt in Semantische kernel. Ai-model bepaalt welke functies moeten worden aangeroepen om de prompt te voltooien en Semantische kernel doet de rest en roept deze automatisch aan.

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

Sommige AI-modellen ondersteunen het aanroepen van parallelle functies, waarbij het model meerdere functies kiest voor aanroepen. Dit kan handig zijn in gevallen waarin het aanroepen van gekozen functies lang duurt. De AI kan er bijvoorbeeld voor kiezen om het laatste nieuws en de huidige tijd tegelijkertijd op te halen, in plaats van een retour per functie te maken.

Semantische kernel kan deze functies op twee verschillende manieren aanroepen:

  • Opeenvolgend: De functies worden na elkaar aangeroepen. Dit is het standaardgedrag.
  • Gelijktijdig: de functies worden tegelijkertijd aangeroepen. Dit kan worden ingeschakeld door de FunctionChoiceBehaviorOptions.AllowConcurrentInvocation eigenschap in te stellen op true, zoals wordt weergegeven in het onderstaande voorbeeld.
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));

Handmatige functie aanroepen

In gevallen waarin de aanroeper meer controle wil hebben over het aanroepproces van de functie, kan handmatige functie-aanroep worden gebruikt.

Wanneer handmatige functie-aanroep is ingeschakeld, roept Semantische kernel niet automatisch de functies aan die zijn gekozen door het AI-model. In plaats daarvan wordt een lijst met gekozen functies geretourneerd aan de aanroeper, die vervolgens kan bepalen welke functies moeten worden aangeroepen, ze opeenvolgend of parallel kunnen aanroepen, uitzonderingen kunnen verwerken, enzovoort. De resultaten van de functie-aanroep moeten worden toegevoegd aan de chatgeschiedenis en aan het model worden geretourneerd. Hier worden redenen voor gebruikt en wordt bepaald of er extra functies moeten worden gekozen of het uiteindelijke antwoord moet worden gegenereerd.

In het onderstaande voorbeeld ziet u hoe u handmatige functie-aanroep gebruikt.

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

Notitie

De klassen FunctionCallContent en FunctionResultContent worden gebruikt om respectievelijk aanroepen van AI-modelfuncties en aanroepen van Semantische kernelfuncties weer te geven. Ze bevatten informatie over de gekozen functie, zoals de functie-id, naam en argumenten, en resultaten van functieoproep, zoals functie-aanroep-id en resultaat.

Binnenkort beschikbaar

Binnenkort meer informatie.

Binnenkort beschikbaar

Binnenkort meer informatie.