C#使用Semantic Kernel:添加插件

devtools/2025/3/1 10:18:51/

SemanticKernel介绍

Semantic Kernel是一个SDK,它将OpenAI、Azure OpenAI等大型语言模型与C#、Python和Java等传统编程语言集成在一起。Semantic Kernel通过允许您定义插件来实现这一点。

为什么需要添加插件?

大语言模型虽然具有强大的自然语言理解和生成能力,但它们通常是基于预训练的模型,其功能受限于训练时所接触的数据和任务。为大语言模型添加插件是为了扩展其功能、提高其灵活性和实用性。比如你问一个大语言模型今天是几号?它无法提供实时信息甚至会出现幻觉,这时候插件就派上用场了。

实践

插件分为提示词插件与本地函数插件,本次示例用的是本地函数。创建一个FunctionTest类:

public class FunctionTest
{[KernelFunction, Description("获取当前的时间")]public object GetCurrentTime(){return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");}[KernelFunction, Description("获取城市的天气状况")]public object GetWeather([Description("城市名称")] string CityName, [Description("查询时段,值可以是[白天,夜晚]")] string DayPart){return new { CityName, DayPart, CurrentCondition = "多云", LaterCondition = "阴", MinTemperature = 19, MaxTemperature = 23 };}
}

在 Semantic Kernel 中,[KernelFunction] 特性用于标记类中的方法,表明这些方法应当被包含为 Microsoft.SemanticKernel.KernelFunction 实例,并作为技能操作添加到通过Semantic Kernel生成的 Microsoft.SemanticKernel.KernelPlugin 中。 [Description]特性用于为类、方法、属性等添加描述信息。

在kernel中加入这个插件:

public async void Initialize_OpenAI(){var builder = Kernel.CreateBuilder();#pragma warning disable SKEXP0010builder.AddOpenAIChatCompletion(modelId: "Qwen/Qwen2.5-32B-Instruct", endpoint: new Uri("https://api.siliconflow.cn/v1"), apiKey: "");#pragma warning restore SKEXP0010//这里我们需要插入之前定义的插件builder.Plugins.AddFromType<FunctionTest>();Kernel kernel = builder.Build();//创建系统提示词var prompt = "如果使用函数调用,请确保输出是JSON格式。返回的JSON包含function字段和arguments字段,前者的内容是需要使用的函数的名称,后者的内容是函数所需参数的名称。样例:{\"function\":\"funcName\",\"arguments\":{\"propName\":\"propValue\"}};否则,输出应该是文本格式。";//定义一个对话历史ChatHistory history = new ChatHistory();//添加系统提示词history.AddSystemMessage(prompt);//创建一个对话服务实例var chatService = kernel.GetRequiredService<IChatCompletionService>();while (true){Console.Write("User:");var input = Console.ReadLine();if (string.IsNullOrWhiteSpace(input)){break;}history.AddUserMessage(input);//打开提示执行设置OpenAIPromptExecutionSettings executionSettings = new OpenAIPromptExecutionSettings(){Temperature = 0.6,ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions  };var chatmessage = await chatService.GetChatMessageContentAsync(history, executionSettings: executionSettings, kernel: kernel);var contents = chatmessage.ToString() ?? "";Console.WriteLine($"AssistantM: {contents}");history.AddMessage(chatmessage.Role, contents); }}

在C#中使用Semantic Kernel时,如果遇到大模型不支持直接调用函数的情况,可以通过手动调用自定义插件的方式来绕过这个限制。这种方式不仅增强了模型的灵活性,还允许开发者根据需要定制化服务。

硅基流动统一登录获取免费Tokens,注册完成新建自己的API秘钥,在apiKey填入秘钥既可以调用大模型了


http://www.ppmy.cn/devtools/163584.html

相关文章

算法之数据结构

目录 数据结构 数据结构与算法面试题 数据结构 《倚天村 • 图解数据结构》 | 小傅哥 bugstack 虫洞栈 ♥数据结构基础知识体系详解♥ | Java 全栈知识体系 线性数据结构 | JavaGuide 数据结构与算法面试题 数据结构与算法面试题 | 小林coding

Go语言学习笔记(四)

文章目录 十六、并发概念GoroutineGMPruntime包Channelselect并发安全和锁互斥锁读写互斥锁 原子操作(atomic包)GMP 原理与调度Golang “调度器” 的由来Go 语言的协程 goroutineGoroutine 调度器的 GMP 模型的设计思想 十七、网络编程网络协议Socketsockettcpudp httphttp协议…

Nginx 报错:413 Request Entity Too Large

做web开发时&#xff0c;对于上传附件的功能&#xff0c;如果nginx没有调整配置&#xff0c;上传大一点的文件就会发生下面这种错误&#xff1a; 要解决上面的问题&#xff0c;只需要调整Nginx配置文件中的 client_max_body_size 参数即可&#xff0c;这个配置参数一般在http配…

Chromium项目相关

Chromium项目相关 Chromium 是一个开源浏览器项目&#xff0c;旨在为所有用户构建一种更安全、更快速、更稳定的方式来体验 Web。 自 Google 在 2008 年宣布 Chromium 项目以来&#xff0c;他们一直很高兴能够在开源 Web 浏览器的良好基础上进行构建&#xff0c;并为富 Web 平…

游戏引擎学习第126天

仓库:https://gitee.com/mrxiao_com/2d_game_3 单生产者/多消费者问题 在今天的讨论中&#xff0c;主要与多线程编程有关。问题出现在多线程环境中&#xff0c;当多个线程同时访问共享资源时&#xff0c;代码没有正确处理竞争条件&#xff0c;导致了错误的行为。 具体问题发…

P8623 [蓝桥杯 2015 省 B] 移动距离

P8623 [蓝桥杯 2015 省 B] 移动距离 题目 解析代码 题目 解析 完了完了T.T&#xff0c;这个题我做了20分钟 解题思路就是分组&#xff0c;但是编写的时候最好把边界值过一遍【题目提供的测试数据肯定是最好通过的数据&#xff0c;需要你自己过一遍特殊数据&#xff0c;然后再…

论文阅读之基于Syn2Real域的侧扫声纳类水雷目标探测

摘要 由于现实世界数据的稀缺性&#xff0c;基于深度学习的水下水雷探测受到了限制。这种稀缺性导致过拟合&#xff0c;即模型在训练数据上表现良好&#xff0c;但在未见数据上表现不佳。本文提出了一种使用扩散模型的Syn2Real &#xff08;Synthetic to Real&#xff09;域泛…

【PyCharm安装】【Python安装】【PyCharm使用】全流程

2025 - 02 - 28 - 第 64 篇 Author: 郑龙浩 / 仟濹 【PyCharm安装】【Python安装】【PyCharm使用】 文章目录 Python安装PyCharm安装及使用一 Python安装1 **Python 安装包里都包括什么呢&#xff1f;&#xff1f;&#xff1f;**2 安装时的一些选项勾选有何作用&#xff1f;(1…