深入探讨Function Calling:在Semantic Kernel中的使用实践
导言
上一章咱们了解了 OpenAI
的 function calling
的履行原理,这一章节咱们解说一下 function calling
在 Semantic Kernel
的运用。
在OpenAIPromptExecutionSettings
跟 LLM 交互进程中,ToolCallBehavior
的特点之前咱们的章节有介绍过
-
ToolCallBehavior
:特点用于获取或设置怎么处理东西调用的行为。// Enable auto function calling OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
1.
EnableKernelFunctions
:会向模型供给内核的插件函数信息,但不会主动处理函数调用恳求。模型需求显式主张函数调用恳求,并体系会传达这些恳求给恰当的处理程序来履行。OpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions }; var chatHistory = new ChatHistory(); ChatMessageContent result = await chat.GetChatMessageContentAsync(chatHistory, settings, kernel); //手动调用 IEnumerable<FunctionCallContent> functionCalls = FunctionCallContent.GetFunctionCalls(result);
EnableKernelFunctions:需求经过 FunctionCallContent 手动调用
2.
AutoInvokeKernelFunctions
:除了向模型供给内核的插件函数信息外,还会测验主动处理任何函数调用恳求。模型主张函数调用恳求后,体系会主动履行相应的操作,并将成果回来给模型,而无需模型显式处理函数调用的进程。
模型引荐
主张运用 OpenAI
的最新模型(如 gpt-3.5-turbo-1106
或 gpt-4-1106-preview
)以取得最佳的东西调用体会。OpenAI
的最新模型一般具有更好的功能和更高的准确性,因而运用这些模型可以进步东西调用的作用。
我这里是公司供给的 Azure OpenAI
的服务,我自己经过 yarp
代理了一层做了相关服务的认证
{
"InternalAzureOpenAI": {
"Endpoint": "https://localhost:7079",
"ModelId": "gpt-35-turbo-1106",
"ApiKey": "***"
}
}
实战
接下来咱们会问一下大模型当时北京的气候情况
界说 Prompts
var template = "我想知道现在北京的气候状况?";
界说 kernel
var kernel = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion(config.ModelId, endpoint: config.Endpoint, apiKey: config.ApiKey)
.Build();
注册 kernel function 到 plugins
界说办法
static string GetWeatherForCity(string cityName)
{
return $"{cityName} 25°,气候晴朗。";
}
为 Kernel 供给插件
kernel.ImportPluginFromFunctions("WeatherPlugin", new[]
{
kernel.CreateFunctionFromMethod(GetWeatherForCity, "GetWeatherForCity", "获取指定城市的气候")
});
手动调用 function calling
依据上面的描绘 手动处理function calling
的要害实际上是ToolCallBehavior.EnableKernelFunctions
参数。
OpenAIPromptExecutionSettings settings = new OpenAIPromptExecutionSettings()
{
Temperature = 0,
ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions
};
需求用到Semantic Kernel
的IChatCompletionService
的会话服务
var chatHistory = new ChatHistory();
chatHistory.AddSystemMessage("You are a useful assistant.");
chatHistory.AddUserMessage(template);
Console.WriteLine($"User: {template}");
var chat = kernel.GetRequiredService<IChatCompletionService>();
while (true)
{
ChatMessageContent result = await chat.GetChatMessageContentAsync(chatHistory, settings, kernel);
if (result.Content is not null)
{
Console.Write(result.Content);
}
IEnumerable<FunctionCallContent> functionCalls = FunctionCallContent.GetFunctionCalls(result);
if (!functionCalls.Any())
{
break;
}
chatHistory.Add(result); // Adding LLM response containing function calls(requests) to chat history as it's required by LLMs.
foreach (var functionCall in functionCalls)
{
try
{
FunctionResultContent resultContent = await functionCall.InvokeAsync(kernel); // Executing each function.
chatHistory.Add(resultContent.ToChatMessage());
}
catch (Exception ex)
{
chatHistory.Add(new FunctionResultContent(functionCall, ex).ToChatMessage());
}
}
Console.WriteLine();
}
输出
=====>手动function calling
User: 我想知道现在北京的气候状况?
Assistant:现在北京的气候是晴朗,气温为25°C。
主动调用 function calling
和手动的差异便是上面描绘的OpenAIPromptExecutionSettings
装备的ToolCallBehavior
特点值不同
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new OpenAIPromptExecutionSettings()
{
Temperature = 0,
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
主动function calling
从本质上来讲是躲藏了跟大模型屡次交互的逻辑,有Semantic Kernel
结构主动帮咱们调用
中心代码
var chatHistory = new ChatHistory();
chatHistory.AddSystemMessage("You are a useful assistant.");
chatHistory.AddUserMessage(template);
Console.WriteLine($"User: {template}");
var chatService = kernel.GetRequiredService<IChatCompletionService>();
var result = await chatService.GetChatMessageContentAsync(chatHistory, openAIPromptExecutionSettings, kernel);
Console.Write("Assistant:" + result.ToString());
输出
=====>主动function calling
User: 我想知道现在北京的气候状况?
Assistant:北京现在的气候状况是晴朗,气温为25°C。
最终
在本章中,咱们探讨了在 OpenAI
的 function calling
在 Semantic Kernel
中的运用。经过对 ToolCallBehavior
特点的设置,咱们可以灵敏地操控东西调用的行为,从手动调用到主动调用,为用户供给了愈加快捷和高效的体会。
主张在实践中运用 OpenAI
的最新模型(如 gpt-3.5-turbo-1106
或 gpt-4-1106-preview
)以取得最佳的东西调用作用。一起,经过合理装备 OpenAIPromptExecutionSettings
中的参数,可以更好地适配不同的场景和需求。
期望本章内容可以帮助您更深化地了解 function calling
在 Semantic Kernel
中的运用,为您的项目和运用带来更多可能性和立异。
示例代码
本文源代码