【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}}

posted @   .Neterr  阅读(63)  评论(0编辑  收藏  举报

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示