Tryby wywołania funkcji
Gdy model sztucznej inteligencji otrzymuje monit zawierający listę funkcji, może wybrać co najmniej jeden z nich do wywołania, aby ukończyć monit. Gdy funkcja jest wybierana przez model, musi być wywoływana przez jądro semantyczne.
Podsystem wywoływania funkcji w jądrze semantycznym ma dwa tryby wywołania funkcji: automatyczne i ręczne.
W zależności od trybu wywołania jądro semantyczne wykonuje wywołanie funkcji end-to-end lub daje obiekt wywołujący kontrolę nad procesem wywołania funkcji.
Wywołanie funkcji automatycznej
Wywołanie funkcji automatycznej jest domyślnym trybem podsystemu wywoływania funkcji semantycznego jądra. Gdy model sztucznej inteligencji wybierze co najmniej jedną funkcję, semantyczne jądro automatycznie wywołuje wybrane funkcje. Wyniki tych wywołań funkcji są dodawane do historii czatu i wysyłane do modelu automatycznie w kolejnych żądaniach. Następnie model jest przyczyną historii czatu, wybiera dodatkowe funkcje w razie potrzeby lub generuje ostateczną odpowiedź. Takie podejście jest w pełni zautomatyzowane i nie wymaga ręcznej interwencji obiektu wywołującego.
W tym przykładzie pokazano, jak używać wywołania funkcji automatycznej w semantycznym jądrze. Model sztucznej inteligencji decyduje, które funkcje mają być wywoływane w celu ukończenia monitu, a jądro semantyczne wykonuje resztę i wywołuje je automatycznie.
using Microsoft.SemanticKernel;
IKernelBuilder builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion("<model-id>", "<api-key>");
builder.Plugins.AddFromType<WeatherForecastUtils>();
builder.Plugins.AddFromType<DateTimeUtils>();
Kernel kernel = builder.Build();
// By default, functions are set to be automatically invoked.
// If you want to explicitly enable this behavior, you can do so with the following code:
// PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke: true) };
PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
await kernel.InvokePromptAsync("Given the current time of day and weather, what is the likely color of the sky in Boston?", new(settings));
Niektóre modele sztucznej inteligencji obsługują wywołania funkcji równoległych, w których model wybiera wiele funkcji do wywołania. Może to być przydatne w przypadkach, gdy wywoływanie wybranych funkcji trwa długo. Na przykład sztuczna inteligencja może wybrać pobieranie najnowszych wiadomości i bieżącego czasu jednocześnie, a nie wykonywanie rundy na funkcję.
Semantyczne jądro może wywoływać te funkcje na dwa różne sposoby:
- Sekwencyjnie: funkcje są wywoływane jeden po drugim. To jest zachowanie domyślne.
- Jednocześnie: funkcje są wywoływane w tym samym czasie. Można to włączyć, ustawiając
FunctionChoiceBehaviorOptions.AllowConcurrentInvocation
właściwość natrue
, jak pokazano w poniższym przykładzie.
using Microsoft.SemanticKernel;
IKernelBuilder builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion("<model-id>", "<api-key>");
builder.Plugins.AddFromType<NewsUtils>();
builder.Plugins.AddFromType<DateTimeUtils>();
Kernel kernel = builder.Build();
// Enable concurrent invocation of functions to get the latest news and the current time.
FunctionChoiceBehaviorOptions options = new() { AllowConcurrentInvocation = true };
PromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: options) };
await kernel.InvokePromptAsync("Good morning! What is the current time and latest news headlines?", new(settings));
Wywołanie funkcji ręcznej
W przypadkach, gdy obiekt wywołujący chce mieć większą kontrolę nad procesem wywołania funkcji, można użyć wywołania funkcji ręcznej.
Po włączeniu wywołania funkcji ręcznej semantyczne jądro nie wywołuje automatycznie funkcji wybranych przez model AI. Zamiast tego zwraca listę wybranych funkcji do obiektu wywołującego, który może następnie zdecydować, które funkcje mają być wywoływane, wywoływać je sekwencyjnie lub równolegle, obsługiwać wyjątki itd. Wyniki wywołania funkcji należy dodać do historii czatu i wrócić do modelu, co z ich przyczyn i decyduje, czy wybrać dodatkowe funkcje, czy wygenerować ostateczną odpowiedź.
W poniższym przykładzie pokazano, jak używać wywołania funkcji ręcznej.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
IKernelBuilder builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion("<model-id>", "<api-key>");
builder.Plugins.AddFromType<WeatherForecastUtils>();
builder.Plugins.AddFromType<DateTimeUtils>();
Kernel kernel = builder.Build();
IChatCompletionService chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// Manual function invocation needs to be enabled explicitly by setting autoInvoke to false.
PromptExecutionSettings settings = new() { FunctionChoiceBehavior = Microsoft.SemanticKernel.FunctionChoiceBehavior.Auto(autoInvoke: false) };
ChatHistory chatHistory = [];
chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?");
while (true)
{
ChatMessageContent result = await chatCompletionService.GetChatMessageContentAsync(chatHistory, settings, kernel);
// Check if the AI model has generated a response.
if (result.Content is not null)
{
Console.Write(result.Content);
// Sample output: "Considering the current weather conditions in Boston with a tornado watch in effect resulting in potential severe thunderstorms,
// the sky color is likely unusual such as green, yellow, or dark gray. Please stay safe and follow instructions from local authorities."
break;
}
// Adding AI model response containing chosen functions to chat history as it's required by the models to preserve the context.
chatHistory.Add(result);
// Check if the AI model has chosen any function for invocation.
IEnumerable<FunctionCallContent> functionCalls = FunctionCallContent.GetFunctionCalls(result);
if (!functionCalls.Any())
{
break;
}
// Sequentially iterating over each chosen function, invoke it, and add the result to the chat history.
foreach (FunctionCallContent functionCall in functionCalls)
{
try
{
// Invoking the function
FunctionResultContent resultContent = await functionCall.InvokeAsync(kernel);
// Adding the function result to the chat history
chatHistory.Add(resultContent.ToChatMessage());
}
catch (Exception ex)
{
// Adding function exception to the chat history.
chatHistory.Add(new FunctionResultContent(functionCall, ex).ToChatMessage());
// or
//chatHistory.Add(new FunctionResultContent(functionCall, "Error details that the AI model can reason about.").ToChatMessage());
}
}
}
Uwaga
Klasy FunctionCallContent i FunctionResultContent są używane do reprezentowania wywołań funkcji modelu sztucznej inteligencji i wywołań funkcji semantycznej, odpowiednio. Zawierają one informacje o wybranej funkcji, takie jak identyfikator funkcji, nazwa i argumenty oraz wyniki wywołania funkcji, takie jak identyfikator wywołania funkcji i wynik.
Wkrótce
Więcej informacji wkrótce.
Wkrótce
Więcej informacji wkrótce.