Guida alla migrazione delle chiamate di funzioni
Il kernel semantico passa gradualmente dalle funzionalità di chiamata di funzione correnti, rappresentate dalla ToolCallBehavior
classe , alle nuove funzionalità avanzate, rappresentate dalla FunctionChoiceBehavior
classe .
La nuova funzionalità è indipendente dal servizio e non è associata a un servizio di intelligenza artificiale specifico, a differenza del modello corrente. Di conseguenza, si trova nelle astrazioni del kernel semantico e verrà usato da tutti i connettori di intelligenza artificiale che usano modelli di intelligenza artificiale in grado di chiamare le funzioni.
Questa guida consente di eseguire la migrazione del codice alle nuove funzionalità di chiamata di funzione.
Eseguire la migrazione del comportamento toolCallBehavior.AutoInvokeKernelFunctions
Il ToolCallBehavior.AutoInvokeKernelFunctions
comportamento equivale al FunctionChoiceBehavior.Auto
comportamento nel nuovo modello.
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
Eseguire la migrazione del comportamento toolCallBehavior.EnableKernelFunctions
Il ToolCallBehavior.EnableKernelFunctions
comportamento è equivalente al FunctionChoiceBehavior.Auto
comportamento con la chiamata automatica disabilitata.
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };
Eseguire la migrazione del comportamento toolCallBehavior.EnableFunctions
Il ToolCallBehavior.EnableFunctions
comportamento è equivalente al comportamento configurato con l'elenco FunctionChoiceBehavior.Auto
di funzioni con chiamata automatica disabilitata.
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) };
Eseguire la migrazione del comportamento toolCallBehavior.RequireFunction
Il ToolCallBehavior.RequireFunction
comportamento è equivalente al comportamento configurato con l'elenco FunctionChoiceBehavior.Required
di funzioni con chiamata automatica disabilitata.
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) };
Sostituire l'utilizzo delle classi di chiamata di funzione specifiche del connettore
La funzionalità di chiamata di funzioni in Semantic Kernel consente agli sviluppatori di accedere a un elenco di funzioni scelte dal modello di intelligenza artificiale in due modi:
- Usando classi di chiamata di funzione specifiche del connettore come
ChatToolCall
oChatCompletionsFunctionToolCall
, disponibili tramite laToolCalls
proprietà dell'elemento specifico diOpenAIChatMessageContent
OpenAI nella cronologia delle chat. - Usando classi di chiamata di funzione indipendenti dal connettore, ad esempio
FunctionCallContent
, disponibili tramite laItems
proprietà dell'elemento indipendente dal connettoreChatMessageContent
nella cronologia delle chat.
Entrambi i modi sono supportati al momento dai modelli correnti e nuovi. È tuttavia consigliabile usare l'approccio indipendente dal connettore per accedere alle chiamate di funzione, poiché è più flessibile e consente al codice di usare qualsiasi connettore di intelligenza artificiale che supporti il nuovo modello di chiamata a funzioni. Inoltre, considerando che il modello corrente sarà deprecato a breve, ora è un buon momento per eseguire la migrazione del codice al nuovo modello per evitare modifiche di rilievo in futuro.
Pertanto, se si usa La chiamata manuale della funzione con le classi di chiamata di funzione specifiche del connettore, come nel frammento di codice seguente:
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();
}
È possibile effettuare il refactoring per usare le classi indipendenti dal connettore:
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();
}
I frammenti di codice precedenti illustrano come eseguire la migrazione del codice che usa il connettore openAI per intelligenza artificiale. Un processo di migrazione simile può essere applicato ai connettori Gemini e Mistral AI quando vengono aggiornati per supportare il nuovo modello di chiamata di funzione.
Passaggi successivi
Dopo aver eseguito la migrazione del codice al nuovo modello di chiamata di funzioni, è possibile apprendere come configurare vari aspetti del modello che potrebbero corrispondere meglio agli scenari specifici facendo riferimento alla sezione comportamenti di chiamata della funzione.
Presto disponibile
Altre informazioni saranno presto disponibili.
Presto disponibile
Altre informazioni saranno presto disponibili.