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
ofChatCompletionsFunctionToolCall
, beschikbaar via deToolCalls
eigenschap van het OpenAI-specifiekeOpenAIChatMessageContent
item in de chatgeschiedenis. - Met behulp van connector-agnostische functie-aanroepklassen zoals
FunctionCallContent
, beschikbaar via deItems
eigenschap van het connectoragnostischeChatMessageContent
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.