Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Semantyczne jądro stopniowo przechodzi od bieżących funkcji wywołujących funkcje reprezentowane przez ToolCallBehavior klasę do nowych rozszerzonych możliwości reprezentowanych przez klasę FunctionChoiceBehavior .
Nowa funkcja jest niezależna od usługi i nie jest powiązana z żadną konkretną usługą sztucznej inteligencji, w przeciwieństwie do bieżącego modelu. W związku z tym znajduje się ona w abstrakcji jądra semantycznego i będzie używana przez wszystkie łączniki sztucznej inteligencji współpracujące z modelami sztucznej inteligencji obsługującymi wywoływanie funkcji.
Ten przewodnik ułatwia migrowanie kodu do nowych funkcji wywołujących funkcje.
Migrowanie zachowania ToolCallBehavior.AutoInvokeKernelFunctions
Zachowanie ToolCallBehavior.AutoInvokeKernelFunctions jest równoważne zachowaniu FunctionChoiceBehavior.Auto w nowym modelu.
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
Migrowanie zachowania ToolCallBehavior.EnableKernelFunctions
Zachowanie ToolCallBehavior.EnableKernelFunctions jest równoważne zachowaniu FunctionChoiceBehavior.Auto z wyłączonym wywołaniem automatycznym.
// Before
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };
// After
var executionSettings = new OpenAIPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: false) };
Migrowanie zachowania ToolCallBehavior.EnableFunctions
Zachowanie ToolCallBehavior.EnableFunctions jest równoważne zachowaniu FunctionChoiceBehavior.Auto skonfigurowanemu z listą funkcji z wyłączonym wywołaniem automatycznym.
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) };
Migrowanie zachowania ToolCallBehavior.RequireFunction
Zachowanie ToolCallBehavior.RequireFunction jest równoważne zachowaniu FunctionChoiceBehavior.Required skonfigurowanemu z listą funkcji z wyłączonym wywołaniem automatycznym.
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) };
Zastępowanie użycia klas wywołań funkcji specyficznych dla łącznika
Funkcja wywoływania funkcji w jądrze semantycznym umożliwia deweloperom uzyskanie dostępu do listy funkcji wybranych przez model AI na dwa sposoby:
- Używanie klas wywołań funkcji specyficznych dla łącznika, takich jak
ChatToolCalllubChatCompletionsFunctionToolCall, dostępnych za pośrednictwemToolCallswłaściwości elementu specyficznego dlaOpenAIChatMessageContentinterfejsu OpenAI w historii czatów. - Używanie klas wywołań funkcji niezależnej od łącznika, takich jak
FunctionCallContent, dostępne za pośrednictwem właściwości elementu niezależnegoChatMessageContentodItemsłącznika w historii czatów.
Oba sposoby są obecnie obsługiwane przez bieżące i nowe modele. Zdecydowanie zalecamy jednak użycie niezależnego od łącznika podejścia do uzyskiwania dostępu do wywołań funkcji, ponieważ jest bardziej elastyczne i umożliwia pracę kodu z dowolnym łącznikiem sztucznej inteligencji obsługującym nowy model wywoływania funkcji. Ponadto biorąc pod uwagę, że bieżący model zostanie wkrótce przestarzały, teraz jest dobrym momentem na migrację kodu do nowego modelu, aby uniknąć zmian powodujących niezgodność w przyszłości.
Dlatego jeśli używasz wywołania funkcji ręcznej z klasami wywołań funkcji specyficznych dla łącznika, takimi jak w tym fragmencie kodu:
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();
}
Można go refaktoryzować, aby używać klas niezależnego od łącznika:
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();
}
Powyższe fragmenty kodu pokazują, jak przeprowadzić migrację kodu korzystającego z łącznika OpenAI AI. Podobny proces migracji można zastosować do łączników Gemini i Mistral AI po zaktualizowaniu w celu obsługi nowego modelu wywoływania funkcji.
Następne kroki
Teraz po zmigrowaniu kodu do nowego modelu wywoływania funkcji możesz dowiedzieć się, jak skonfigurować różne aspekty modelu, które mogą lepiej odpowiadać konkretnym scenariuszom, odwołując się do sekcji zachowań wywołujących funkcję.
Wkrótce
Więcej informacji wkrótce.
Wkrótce
Więcej informacji wkrótce.