Semantic Kernel 代码示例

2024年2月24日 340点热度 0人点赞 0条评论
内容纲要

在对话中添加参数

使用 CreateFunctionFromPrompt() 为通过提示模板指定的提示创建 KernelFunction 实例。

KernelFunction 表示可以作为语义内核工作负载的一部分调用的函数。Semantic Kernel 中对 LLM 的调用就叫 KernelFunction。KernelFunction 分为 Semantic Function 、Native Function(本地函数)两种。

        private readonly IKernelBuilder _kernelBuilder = Kernel.CreateBuilder();
            _kernelBuilder.AddAzureOpenAIChatCompletion(
                    deploymentName: "aaa",
                    endpoint: "https://1.openai.azure.com",
                    apiKey: "1111111");

            var kernel = _kernelBuilder.Build();
            string translationPrompt = "将这句话翻译为英文\r\n{{$input}}";
            var llm = kernel.CreateFunctionFromPrompt(translationPrompt);
            KernelArguments args = new KernelArguments();
            args.Add("input", input);
            var response = await llm.InvokeAsync(kernel, args);
            return response.GetValue<string>();

然后使用 KernelArguments,为模板中的 $input 参数替换为具体内容。
输入 “我爱学习”,得出:

The English translation is "I love studying."

调用插件的函数

TextPlugin 是一个插件类,其中有一些函数:

file

        [HttpGet("/get")]
        public async Task<string> Get(string input)
        {
            var kernel = _kernelBuilder.Build();

            var textPlugin = kernel.ImportPluginFromType<TextPlugin>();

            // 函数参数
            var arguments = new KernelArguments()
            {
                ["input"] = input
            };

            // textPlugin["Uppercase"] 表示要调用的函数名称
            string? resultValue = await kernel.InvokeAsync<string>(textPlugin["Uppercase"], arguments);
            Console.WriteLine($"string -> {resultValue}");
            return "";
        }
    }

对话配置

代码参考 http://studiogpt.cn/web/#/620853576/285421664

设置聊天背景,并配置聊天的最大 tokens 数量、温度等配置:

var kernel = _kernelBuilder.Build();

string promptTemplate = @"
为给定的事件创造一个创造性的理由或借口。
要有创意,要风趣。让你的想象力天马行空。
事件:我要迟到了。
对不起:我被长颈鹿歹徒勒索了赎金。
事件:我已经一年没去健身房了
对不起:我一直忙于训练我的宠物龙。
事件:{{$input}}
";

var excuseFunction = kernel.CreateFunctionFromPrompt(promptTemplate, new OpenAIPromptExecutionSettings() { MaxTokens = 100, Temperature = 0.4, TopP = 1 });

然后正常聊天并在对话中插入参数:

var result = await kernel.InvokeAsync(excuseFunction, new() { ["input"] = "我错过了F1决赛" });
Console.WriteLine(result.GetValue<string>());

result = await kernel.InvokeAsync(excuseFunction, new() { ["input"] = "对不起,我忘了你的生日" });
Console.WriteLine(result.GetValue<string>());
var fixedFunction = kernel.CreateFunctionFromPrompt($"将此日期{DateTimeOffset.Now:f}转换为法语格式", new OpenAIPromptExecutionSettings() { MaxTokens = 100 });

result = await kernel.InvokeAsync(fixedFunction);
Console.WriteLine(result.GetValue<string>());

痴者工良

高级程序员劝退师

文章评论