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
ellerChatCompletionsFunctionToolCall
, som är tillgängliga viaToolCalls
egenskapen för det OpenAI-specifikaOpenAIChatMessageContent
objektet i chatthistoriken. - Använda anslutnings-agnostiska funktionsanropsklasser som
FunctionCallContent
, tillgängliga viaItems
egenskapen för det anslutningsagnostiskaChatMessageContent
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.