Dela via


Migreringsguide för funktionssamtal

Semantisk kernel övergår gradvis från de aktuella funktionsanropsfunktionerna, som representeras av ToolCallBehavior klassen, till de nya förbättrade funktionerna som representeras av FunctionChoiceBehavior klassen. Den nya funktionen är tjänstagnostisk och är inte kopplad till någon specifik AI-tjänst, till skillnad från den aktuella modellen. Därför finns den i semantiska kernelabstraktioner och används av alla AI-anslutningsappar som arbetar med funktionsanropskompatibla AI-modeller.

Den här guiden är avsedd att hjälpa dig att migrera koden till de nya funktionerna för funktionsanrop.

Migrera ToolCallBehavior.AutoInvokeKernelFunctions-beteende

Beteendet ToolCallBehavior.AutoInvokeKernelFunctions motsvarar FunctionChoiceBehavior.Auto beteendet i den nya modellen.

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

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

Migrera ToolCallBehavior.EnableKernelFunctions-beteende

Beteendet ToolCallBehavior.EnableKernelFunctions motsvarar FunctionChoiceBehavior.Auto beteendet med inaktiverat automatiskt anrop.

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

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

Migrera ToolCallBehavior.EnableFunctions-beteende

Beteendet ToolCallBehavior.EnableFunctions motsvarar det FunctionChoiceBehavior.Auto beteende som konfigurerats med en lista över funktioner med inaktiverat automatiskt anrop.

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

Migrera ToolCallBehavior.RequireFunction-beteende

Beteendet ToolCallBehavior.RequireFunction motsvarar det FunctionChoiceBehavior.Required beteende som konfigurerats med en lista över funktioner med inaktiverat automatiskt anrop.

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

Ersätt användningen av anslutningsspecifika funktionsanropsklasser

Funktionsanropsfunktioner i Semantic Kernel gör det möjligt för utvecklare att komma åt en lista över funktioner som valts av AI-modellen på två sätt:

  • Använda anslutningsspecifika funktionsanropsklasser som ChatToolCall eller ChatCompletionsFunctionToolCall, som är tillgängliga via ToolCalls egenskapen för det OpenAI-specifika OpenAIChatMessageContent objektet i chatthistoriken.
  • Använda anslutnings-agnostiska funktionsanropsklasser som FunctionCallContent, tillgängliga via Items egenskapen för det anslutningsagnostiska ChatMessageContent objektet i chatthistoriken.

Båda sätten stöds just nu av de aktuella och nya modellerna. Vi rekommenderar dock starkt att du använder den anslutningsagnostiska metoden för att komma åt funktionsanrop, eftersom den är mer flexibel och gör att din kod kan fungera med alla AI-anslutningsappar som stöder den nya funktionsanropsmodellen. Med tanke på att den aktuella modellen kommer att bli inaktuell snart är det nu ett bra tillfälle att migrera koden till den nya modellen för att undvika icke-bakåtkompatibla ändringar i framtiden.

Så om du använder manuell funktionsanrop med anslutningsspecifika funktionsanropsklasser som i det här kodfragmentet:

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

Du kan omstrukturera den så att den använder de anslutningsbaserade agnostiska klasserna:

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

Kodfragmenten ovan visar hur du migrerar din kod som använder OpenAI AI-anslutningsappen. En liknande migreringsprocess kan tillämpas på Anslutningsapparna Gemini och Mistral AI när de uppdateras för att stödja den nya funktionsanropsmodellen.

Nästa steg

Nu när du har migrerat koden till den nya funktionsanropsmodellen kan du fortsätta att lära dig hur du konfigurerar olika aspekter av modellen som bättre kan motsvara dina specifika scenarier genom att referera till avsnittet funktionsanropsbeteenden.

Kommer snart

Mer information kommer snart.

Kommer snart

Mer information kommer snart.