Migrationshandbuch für Funktionsaufrufe
Der semantische Kernel wechselt schrittweise von den aktuellen Funktionsaufruffunktionen, dargestellt durch die ToolCallBehavior
Klasse, zu den neuen erweiterten Funktionen, die durch die FunctionChoiceBehavior
Klasse dargestellt werden.
Die neue Funktion ist serviceagnostisch und ist nicht an einen bestimmten KI-Dienst gebunden, im Gegensatz zum aktuellen Modell. Daher befindet es sich in semantischen Kernelabstraktionen und wird von allen KI-Connectors verwendet, die mit funktionsfähigen KI-Modellen arbeiten.
Dieses Handbuch soll Ihnen helfen, Ihren Code zu den neuen Funktionen zum Aufrufen von Funktionen zu migrieren.
Migrieren von ToolCallBehavior.AutoInvokeKernelFunctions-Verhalten
Das ToolCallBehavior.AutoInvokeKernelFunctions
Verhalten entspricht dem FunctionChoiceBehavior.Auto
Verhalten im neuen Modell.
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
Migrieren von ToolCallBehavior.EnableKernelFunctions-Verhalten
Das ToolCallBehavior.EnableKernelFunctions
Verhalten entspricht dem FunctionChoiceBehavior.Auto
Verhalten bei deaktiviertem automatischen Aufruf.
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };
Migrieren von ToolCallBehavior.EnableFunctions-Verhalten
Das ToolCallBehavior.EnableFunctions
Verhalten entspricht dem FunctionChoiceBehavior.Auto
Verhalten, das mit einer Liste von Funktionen mit deaktiviertem automatischen Aufruf konfiguriert wurde.
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) };
Migrieren von ToolCallBehavior.RequireFunction-Verhalten
Das ToolCallBehavior.RequireFunction
Verhalten entspricht dem FunctionChoiceBehavior.Required
Verhalten, das mit einer Liste von Funktionen mit deaktiviertem automatischen Aufruf konfiguriert wurde.
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) };
Ersetzen der Verwendung von verbindungsspezifischen Funktionsaufrufklassen
Funktionenaufruffunktionen im semantischen Kernel ermöglichen Entwicklern den Zugriff auf eine Vom KI-Modell ausgewählte Liste von Funktionen auf zwei Arten:
- Verwenden von verbindungsspezifischen Funktionsaufrufklassen wie
ChatToolCall
oderChatCompletionsFunctionToolCall
, die über dieToolCalls
Eigenschaft des OpenAI-spezifischenOpenAIChatMessageContent
Elements im Chatverlauf verfügbar sind. - Verwendung von verbindungsagnostischen Funktionsaufrufklassen wie
FunctionCallContent
, verfügbar über dieItems
Eigenschaft des konnektoragnostischenChatMessageContent
Elements im Chatverlauf.
Beide Möglichkeiten werden derzeit von den aktuellen und neuen Modellen unterstützt. Es wird jedoch dringend empfohlen, den connectoragnostischen Ansatz für den Zugriff auf Funktionsaufrufe zu verwenden, da es flexibler ist und es Ihrem Code ermöglicht, mit jedem KI-Connector zu arbeiten, der das neue Funktionsaufrufmodell unterstützt. Darüber hinaus ist angesichts der Tatsache, dass das aktuelle Modell bald veraltet sein wird, jetzt ein guter Zeitpunkt, um Ihren Code in das neue Modell zu migrieren, um zukünftige Änderungen zu vermeiden.
Wenn Sie also den manuellen Funktionsaufruf mit den verbindungsspezifischen Funktionsaufrufklassen wie in diesem Codeausschnitt verwenden:
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();
}
Sie können ihn umgestalten, um die konnektoragnostischen Klassen zu verwenden:
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();
}
Die obigen Codeausschnitte veranschaulichen, wie Sie Ihren Code migrieren, der den OpenAI AI-Connector verwendet. Ein ähnlicher Migrationsprozess kann auf die Gemini- und Mistral AI-Connectors angewendet werden, wenn sie aktualisiert werden, um das neue Funktionsaufrufmodell zu unterstützen.
Nächste Schritte
Nachdem Sie ihren Code zum neuen Funktionsaufrufmodell migriert haben, können Sie nun erfahren, wie Sie verschiedene Aspekte des Modells konfigurieren, die Ihren spezifischen Szenarien besser entsprechen, indem Sie sich auf den Abschnitt "Funktionsaufrufverhalten" beziehen.
In Kürze verfügbar
Weitere Informationen werden in Kürze verfügbar sein.
In Kürze verfügbar
Weitere Informationen werden in Kürze verfügbar sein.