Condividi tramite


Guida alla migrazione delle chiamate di funzioni

Il kernel semantico passa gradualmente dalle funzionalità di chiamata di funzione correnti, rappresentate dalla ToolCallBehavior classe , alle nuove funzionalità avanzate, rappresentate dalla FunctionChoiceBehavior classe . La nuova funzionalità è indipendente dal servizio e non è associata a un servizio di intelligenza artificiale specifico, a differenza del modello corrente. Di conseguenza, si trova nelle astrazioni del kernel semantico e verrà usato da tutti i connettori di intelligenza artificiale che usano modelli di intelligenza artificiale in grado di chiamare le funzioni.

Questa guida consente di eseguire la migrazione del codice alle nuove funzionalità di chiamata di funzione.

Eseguire la migrazione del comportamento toolCallBehavior.AutoInvokeKernelFunctions

Il ToolCallBehavior.AutoInvokeKernelFunctions comportamento equivale al FunctionChoiceBehavior.Auto comportamento nel nuovo modello.

// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };

Eseguire la migrazione del comportamento toolCallBehavior.EnableKernelFunctions

Il ToolCallBehavior.EnableKernelFunctions comportamento è equivalente al FunctionChoiceBehavior.Auto comportamento con la chiamata automatica disabilitata.

// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };

Eseguire la migrazione del comportamento toolCallBehavior.EnableFunctions

Il ToolCallBehavior.EnableFunctions comportamento è equivalente al comportamento configurato con l'elenco FunctionChoiceBehavior.Auto di funzioni con chiamata automatica disabilitata.

var function = kernel.CreateFunctionFromMethod(() => DayOfWeek.Friday, "GetDayOfWeek", "Returns the current day of the week.");

// Before
var executionSettings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.EnableFunctions(functions: [function.Metadata.ToOpenAIFunction()]) };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(functions: [function], autoInvoke: false) };

Eseguire la migrazione del comportamento toolCallBehavior.RequireFunction

Il ToolCallBehavior.RequireFunction comportamento è equivalente al comportamento configurato con l'elenco FunctionChoiceBehavior.Required di funzioni con chiamata automatica disabilitata.

var function = kernel.CreateFunctionFromMethod(() => DayOfWeek.Friday, "GetDayOfWeek", "Returns the current day of the week.");

// Before
var executionSettings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.RequireFunction(functions: [function.Metadata.ToOpenAIFunction()]) };

// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Required(functions: [function], autoInvoke: false) };

Sostituire l'utilizzo delle classi di chiamata di funzione specifiche del connettore

La funzionalità di chiamata di funzioni in Semantic Kernel consente agli sviluppatori di accedere a un elenco di funzioni scelte dal modello di intelligenza artificiale in due modi:

  • Usando classi di chiamata di funzione specifiche del connettore come ChatToolCall o ChatCompletionsFunctionToolCall, disponibili tramite la ToolCalls proprietà dell'elemento specifico di OpenAIChatMessageContent OpenAI nella cronologia delle chat.
  • Usando classi di chiamata di funzione indipendenti dal connettore, ad esempio FunctionCallContent, disponibili tramite la Items proprietà dell'elemento indipendente dal connettore ChatMessageContent nella cronologia delle chat.

Entrambi i modi sono supportati al momento dai modelli correnti e nuovi. È tuttavia consigliabile usare l'approccio indipendente dal connettore per accedere alle chiamate di funzione, poiché è più flessibile e consente al codice di usare qualsiasi connettore di intelligenza artificiale che supporti il nuovo modello di chiamata a funzioni. Inoltre, considerando che il modello corrente sarà deprecato a breve, ora è un buon momento per eseguire la migrazione del codice al nuovo modello per evitare modifiche di rilievo in futuro.

Pertanto, se si usa La chiamata manuale della funzione con le classi di chiamata di funzione specifiche del connettore, come nel frammento di codice seguente:

using System.Text.Json;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using OpenAI.Chat;

var chatHistory = new ChatHistory();

var settings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };

var result = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);

// Current way of accessing function calls using connector specific classes.
var toolCalls = ((OpenAIChatMessageContent)result).ToolCalls.OfType<ChatToolCall>().ToList();

while (toolCalls.Count > 0)
{
    // Adding function call from AI model to chat history
    chatHistory.Add(result);

    // Iterating over the requested function calls and invoking them
    foreach (var toolCall in toolCalls)
    {
        string content = kernel.Plugins.TryGetFunctionAndArguments(toolCall, out KernelFunction? function, out KernelArguments? arguments) ?
            JsonSerializer.Serialize((await function.InvokeAsync(kernel, arguments)).GetValue<object>()) :
            "Unable to find function. Please try again!";

        // Adding the result of the function call to the chat history
        chatHistory.Add(new ChatMessageContent(
            AuthorRole.Tool,
            content,
            metadata: new Dictionary<string, object?>(1) { { OpenAIChatMessageContent.ToolIdProperty, toolCall.Id } }));
    }

    // Sending the functions invocation results back to the AI model to get the final response
    result = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);
    toolCalls = ((OpenAIChatMessageContent)result).ToolCalls.OfType<ChatToolCall>().ToList();
}

È possibile effettuare il refactoring per usare le classi indipendenti dal connettore:

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

var chatHistory = new ChatHistory();

var settings = new PromptExecutionSettings() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };

var messageContent = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);

// New way of accessing function calls using connector agnostic function calling model classes.
var functionCalls = FunctionCallContent.GetFunctionCalls(messageContent).ToArray();

while (functionCalls.Length != 0)
{
    // Adding function call from AI model to chat history
    chatHistory.Add(messageContent);

    // Iterating over the requested function calls and invoking them
    foreach (var functionCall in functionCalls)
    {
        var result = await functionCall.InvokeAsync(kernel);

        chatHistory.Add(result.ToChatMessage());
    }

    // Sending the functions invocation results to the AI model to get the final response
    messageContent = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);
    functionCalls = FunctionCallContent.GetFunctionCalls(messageContent).ToArray();
}

I frammenti di codice precedenti illustrano come eseguire la migrazione del codice che usa il connettore openAI per intelligenza artificiale. Un processo di migrazione simile può essere applicato ai connettori Gemini e Mistral AI quando vengono aggiornati per supportare il nuovo modello di chiamata di funzione.

Passaggi successivi

Dopo aver eseguito la migrazione del codice al nuovo modello di chiamata di funzioni, è possibile apprendere come configurare vari aspetti del modello che potrebbero corrispondere meglio agli scenari specifici facendo riferimento alla sezione comportamenti di chiamata della funzione.

Presto disponibile

Altre informazioni saranno presto disponibili.

Presto disponibile

Altre informazioni saranno presto disponibili.