Delen via


Migratiehandleiding voor functiegesprekken

Semantische kernel gaat geleidelijk over van de huidige functieaanroepende mogelijkheden, vertegenwoordigd door de ToolCallBehavior klasse, naar de nieuwe verbeterde mogelijkheden, vertegenwoordigd door de FunctionChoiceBehavior klasse. De nieuwe mogelijkheid is serviceneutraal en is niet gekoppeld aan een specifieke AI-service, in tegenstelling tot het huidige model. Daarom bevindt het zich in Semantische kernelabstracties en wordt deze gebruikt door alle AI-connectors die werken met ai-modellen die geschikt zijn voor functie-aanroepen.

Deze handleiding is bedoeld om u te helpen uw code te migreren naar de nieuwe mogelijkheden voor het aanroepen van functies.

Het gedrag ToolCallBehavior.AutoInvokeKernelFunctions migreren

Het ToolCallBehavior.AutoInvokeKernelFunctions gedrag is gelijk aan het FunctionChoiceBehavior.Auto gedrag in het nieuwe model.

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

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

Het gedrag ToolCallBehavior.EnableKernelFunctions migreren

Het ToolCallBehavior.EnableKernelFunctions gedrag is gelijk aan het FunctionChoiceBehavior.Auto gedrag met uitgeschakelde automatische aanroep.

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

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

Migrate ToolCallBehavior.EnableFunctions behavior

Het ToolCallBehavior.EnableFunctions gedrag is gelijk aan het FunctionChoiceBehavior.Auto gedrag dat is geconfigureerd met een lijst met functies met uitgeschakelde automatische aanroep.

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

Migrate ToolCallBehavior.RequireFunction behavior

Het ToolCallBehavior.RequireFunction gedrag is gelijk aan het FunctionChoiceBehavior.Required gedrag dat is geconfigureerd met een lijst met functies met uitgeschakelde automatische aanroep.

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

Het gebruik van connectorspecifieke functieoproepklassen vervangen

Met functionaliteit voor het aanroepen van functies in Semantic Kernel kunnen ontwikkelaars op twee manieren toegang krijgen tot een lijst met functies die door het AI-model zijn gekozen:

  • Het gebruik van connectorspecifieke functieoproepklassen zoals ChatToolCall of ChatCompletionsFunctionToolCall, beschikbaar via de ToolCalls eigenschap van het OpenAI-specifieke OpenAIChatMessageContent item in de chatgeschiedenis.
  • Met behulp van connector-agnostische functie-aanroepklassen zoals FunctionCallContent, beschikbaar via de Items eigenschap van het connectoragnostische ChatMessageContent item in de chatgeschiedenis.

Beide manieren worden momenteel ondersteund door de huidige en nieuwe modellen. We raden u echter ten zeerste aan om de connectoragnostische benadering te gebruiken voor toegang tot functie-aanroepen, omdat deze flexibeler is en uw code kan werken met elke AI-connector die het nieuwe model voor functieoproepen ondersteunt. Gezien het feit dat het huidige model binnenkort wordt afgeschaft, is het nu een goed moment om uw code naar het nieuwe model te migreren om wijzigingen in de toekomst te voorkomen.

Als u handmatige functie-aanroep gebruikt met de verbindingslijnspecifieke functie-aanroepklassen, zoals in dit codefragment:

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

U kunt deze herstructureren om de connectoragnostische klassen te gebruiken:

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

De bovenstaande codefragmenten laten zien hoe u uw code migreert die gebruikmaakt van de OpenAI AI-connector. Een vergelijkbaar migratieproces kan worden toegepast op de Gemini- en Mistral AI-connectors wanneer ze worden bijgewerkt ter ondersteuning van het nieuwe model voor het aanroepen van functies.

Volgende stappen

Nadat u uw code hebt gemigreerd naar het nieuwe model voor het aanroepen van functies, kunt u doorgaan met het configureren van verschillende aspecten van het model die beter overeenkomen met uw specifieke scenario's door te verwijzen naar de sectie gedrag van functieaanroepen.

Binnenkort beschikbaar

Binnenkort meer informatie.

Binnenkort beschikbaar

Binnenkort meer informatie.