Semantic Kernel:Plugins
插件是Semantic Kernel的核心组件。通过插件,你可以将现有的API封装成一个集合,供AI调用,从而赋予AI原本无法执行的操作能力。
在背后,Semantic Kernel利用了最新大型语言模型(LLM)中的原生功能——Function Calling,来帮助LLM进行规划并调用API。通过函数调用,LLM可以请求特定函数的执行。Semantic Kernel会将这个请求传递给代码中的对应函数,并将结果返回给LLM,供其生成最终响应。
并不是所有的AI SDK都有类似插件的概念(大多数只提供函数或工具)。但在企业应用场景中,插件非常有用,因为它们封装了一组功能,契合企业开发者常用的服务和API开发方式。插件还支持依赖注入。在插件的构造函数中,你可以注入执行任务所需的服务(例如数据库连接、HTTP客户端等)。而没有插件功能的SDK通常难以实现这一点。
一、用方法组改入插件
#pragma warning disable SKEXP0001 using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Connectors.OpenAI; using System; using System.ComponentModel; using System.Globalization; var chatModelId = "gpt-4o"; var key = File.ReadAllText(@"C:\GPT\key.txt"); var builder = Kernel.CreateBuilder(); builder.AddOpenAIChatCompletion(chatModelId, key); var kernel = builder.Build(); kernel.ImportPluginFromFunctions("dataPlugin", [ kernel.CreateFunctionFromMethod(GetJapaneseDate, "GetJapaneseDate", "按日本历法,获取当前日期") ]); [KernelFunction] string GetJapaneseDate() { var japaneseFormat = new CultureInfo("ja-JP", false).DateTimeFormat; japaneseFormat.Calendar = new JapaneseCalendar(); return DateTime.Now.ToString("gg yy年MM月dd日", japaneseFormat); } var settings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions }; var result = await kernel.InvokePromptAsync("今天是几号?", new KernelArguments(settings)); Console.WriteLine(result);
结果:
二、用Type导入插件
…… kernel.ImportPluginFromType<CurrentDateTime>(); var settings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions }; var result = await kernel.InvokePromptAsync("今天是几号?", new KernelArguments(settings)); Console.WriteLine(result); //定义一个类型 public class CurrentDateTime { [KernelFunction, Description("获取当前日本历法的日期")] public string GetJapaneseDate() { var japaneseFormat = new CultureInfo("ja-JP", false).DateTimeFormat; japaneseFormat.Calendar = new JapaneseCalendar(); return DateTime.Now.ToString("gg yy年MM月dd日", japaneseFormat); } }
结果与前面相同。
三、把对象导成插件
…… kernel.ImportPluginFromObject(new CurrentDateTime()); var settings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions }; var result = await kernel.InvokePromptAsync("今天是几号?", new KernelArguments(settings)); Console.WriteLine(result); ……
结果与前面相同。
四、语义函数组成插件
前面几个都是本地函数,看一个语义函数导入成插件的情况。语义函数可以通过定义一组文件夹和文件来定义,结构如下:
config.json
{ "schema": 1, "description": "把给定的内容翻译成日文", "execution_settings": { "default": { "max_tokens": 512, "temperature": 0.0, "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 } }, "input_variables": [ { "name": "input", "description": "翻译内容", "default": "", "is_required": true } ] }
skprompt.txt
把{{$input}}翻译成日文
导入语义函数插件:
var translateDirectory = Path.Combine( System.IO.Directory.GetCurrentDirectory(), "plugins", "TranslatePlugin"); kernel.ImportPluginFromPromptDirectory(translateDirectory); //method 04 var result = await kernel.InvokeAsync("TranslatePlugin", "translate", new() { { "input", "今天是星期一" } }); Console.WriteLine(result);
结果:
文章来源微信公众号
想要更快更方便的了解相关知识,可以关注微信公众号
****欢迎关注我的asp.net core系统课程****
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524
分类:
.net
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下