【semantic Kernel】Function Calling(函数调用)
参考:
https://www.cnblogs.com/ruipeng/p/18221666
代码:
var builder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(modelId: Config.OpenAiChatModel, Config.OpenAiKey);
var kernel = builder.Build();
kernel.ImportPluginFromType<FileIOPlugin>("FileIO");
kernel.ImportPluginFromType<TimePlugin>("Time");
kernel.ImportPluginFromType<MathPlugin>("Math");
kernel.ImportPluginFromType<EmailPluginFake>("Email");
kernel.ImportPluginFromType<OrderPlugin>("Order");
var settings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
var history = new ChatHistory();
string? userInput;
do
{
// Collect user input
Console.Write("User > ");
userInput = Console.ReadLine();
// Add user input
history.AddUserMessage(userInput);
// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(history, kernel: kernel,executionSettings: settings);
// Print the results
Console.WriteLine("Assistant > " + result);
Console.WriteLine("----------------------");
// Add the message from the agent to the chat history
history.AddMessage(result.Role, result.Content ?? string.Empty);
} while (userInput is not null);
OrderPlugin:
public sealed class OrderPlugin
{
public class Order
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public override string ToString()
{
return $"id:{Id},Name:{Name},Address:{Address}";
}
}
List<Order> Orders = new List<Order>()
{
new Order(){Id=1,Name="iPhone15",Address="武汉"},
new Order(){Id=2,Name="iPad",Address="北京"},
new Order(){Id=3,Name="MacBook",Address="上海"},
new Order(){Id=4,Name = "HuaWei Mate60 ",Address = "深圳"},
new Order(){Id = 5,Name = "小米14",Address = "广州"}
};
[KernelFunction, Description("根据Id获取订单")]
[return: Description("获取到的订单")]
public string GetOrderById(
[Description("订单的Id")] int id)
{
var order = Orders.Where(x => x.Id == id).FirstOrDefault();
if (order != null)
{
return order.ToString();
}
else
{
return "找不到该Id的订单";
}
}
}
演示:
prompt中函数调用
SK还提供了类似函数调用的方式,可以在prompt中实现多种技能的组合,而且并不限制是Semantic Function 还是 Native Function。
{
var builder = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId: Config.OpenAiChatModel, Config.OpenAiKey);
var kernel = builder.Build();
kernel.Plugins.AddFromType<Time>();
var prompt =
"""
当前时间是 {{time.now}},增加 {{$years}}年{{$days}}天后的日期是?
""";
var funcResult = await kernel.InvokePromptAsync(prompt, new() { ["days"] = "1", ["years"] = "2" });
#pragma warning disable SKEXP0001
Console.WriteLine($"生成的prompt:{funcResult.RenderedPrompt}");
#pragma warning restore SKEXP0001
Console.WriteLine($"result:{funcResult.ToString()}");
//生成的prompt: 当前时间是 11 / 07 / 2024 02:30:23,增加 2年1天后的日期是?
//result: 如果在当前时间(11 / 07 / 2024 02:30:23)上增加2年1天,那么新的日期将是 11 / 08 / 2026 02:30:23。
}
public class Time
{
[KernelFunction, Description("today date")]
public DateTime Now()
{
return DateTime.UtcNow;
}
}
输出:
函数传递变量:{{weather.getForecast $city}}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步