Udostępnij przez


Przewodnik po migracji wywoływania funkcji

Semantyczne jądro stopniowo przechodzi od bieżących funkcji wywołujących funkcje reprezentowane przez ToolCallBehavior klasę do nowych rozszerzonych możliwości reprezentowanych przez klasę FunctionChoiceBehavior . Nowa funkcja jest niezależna od usługi i nie jest powiązana z żadną konkretną usługą sztucznej inteligencji, w przeciwieństwie do bieżącego modelu. W związku z tym znajduje się ona w abstrakcji jądra semantycznego i będzie używana przez wszystkie łączniki sztucznej inteligencji współpracujące z modelami sztucznej inteligencji obsługującymi wywoływanie funkcji.

Ten przewodnik ułatwia migrowanie kodu do nowych funkcji wywołujących funkcje.

Migrowanie zachowania ToolCallBehavior.AutoInvokeKernelFunctions

Zachowanie ToolCallBehavior.AutoInvokeKernelFunctions jest równoważne zachowaniu FunctionChoiceBehavior.Auto w nowym modelu.

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

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

Migrowanie zachowania ToolCallBehavior.EnableKernelFunctions

Zachowanie ToolCallBehavior.EnableKernelFunctions jest równoważne zachowaniu FunctionChoiceBehavior.Auto z wyłączonym wywołaniem automatycznym.

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

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

Migrowanie zachowania ToolCallBehavior.EnableFunctions

Zachowanie ToolCallBehavior.EnableFunctions jest równoważne zachowaniu FunctionChoiceBehavior.Auto skonfigurowanemu z listą funkcji z wyłączonym wywołaniem automatycznym.

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

Migrowanie zachowania ToolCallBehavior.RequireFunction

Zachowanie ToolCallBehavior.RequireFunction jest równoważne zachowaniu FunctionChoiceBehavior.Required skonfigurowanemu z listą funkcji z wyłączonym wywołaniem automatycznym.

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

Zastępowanie użycia klas wywołań funkcji specyficznych dla łącznika

Funkcja wywoływania funkcji w jądrze semantycznym umożliwia deweloperom uzyskanie dostępu do listy funkcji wybranych przez model AI na dwa sposoby:

  • Używanie klas wywołań funkcji specyficznych dla łącznika, takich jak ChatToolCall lub ChatCompletionsFunctionToolCall, dostępnych za pośrednictwem ToolCalls właściwości elementu specyficznego dla OpenAIChatMessageContent interfejsu OpenAI w historii czatów.
  • Używanie klas wywołań funkcji niezależnej od łącznika, takich jak FunctionCallContent, dostępne za pośrednictwem właściwości elementu niezależnego ChatMessageContent od Items łącznika w historii czatów.

Oba sposoby są obecnie obsługiwane przez bieżące i nowe modele. Zdecydowanie zalecamy jednak użycie niezależnego od łącznika podejścia do uzyskiwania dostępu do wywołań funkcji, ponieważ jest bardziej elastyczne i umożliwia pracę kodu z dowolnym łącznikiem sztucznej inteligencji obsługującym nowy model wywoływania funkcji. Ponadto biorąc pod uwagę, że bieżący model zostanie wkrótce przestarzały, teraz jest dobrym momentem na migrację kodu do nowego modelu, aby uniknąć zmian powodujących niezgodność w przyszłości.

Dlatego jeśli używasz wywołania funkcji ręcznej z klasami wywołań funkcji specyficznych dla łącznika, takimi jak w tym fragmencie kodu:

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

Można go refaktoryzować, aby używać klas niezależnego od łącznika:

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

Powyższe fragmenty kodu pokazują, jak przeprowadzić migrację kodu korzystającego z łącznika OpenAI AI. Podobny proces migracji można zastosować do łączników Gemini i Mistral AI po zaktualizowaniu w celu obsługi nowego modelu wywoływania funkcji.

Następne kroki

Teraz po zmigrowaniu kodu do nowego modelu wywoływania funkcji możesz dowiedzieć się, jak skonfigurować różne aspekty modelu, które mogą lepiej odpowiadać konkretnym scenariuszom, odwołując się do sekcji zachowań wywołujących funkcję.

Wkrótce

Więcej informacji wkrótce.

Wkrótce

Więcej informacji wkrótce.