当前位置: 首页 > news >正文

使用Semantic Kernel:对DeepSeek添加自定义插件

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 SKEXP0010
            builder.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.dtcms.com/a/43882.html

相关文章:

  • 哈工大《计算机组成原理》第一章笔记
  • 网络参考模型(全)、ARP协议
  • 【Java面试】创建线程有哪几种方式
  • An Efficient Anti-Interference Imaging Technology for Marine Radar 论文阅读
  • 第6篇:面向对象编程重构系统
  • 常见的消息中间件以及应用场景
  • 【微知】git 如何修改某个tag名字?如何根据某个commit创建一个tag?
  • SQL 中UPDATE 和 DELETE 语句的深入理解与应用
  • 常见深度学习算法图解笔记
  • 【MySQL】窗口函数详解(概念+练习+实战)
  • 避免 Git 文件名大小写出错
  • 哈工大 计算机组成原理 第三章计算机总线 笔记
  • 磁盘阵列新秀GSx并行文件存储是HPC高性能计算/AI 大模型-1替3好省预算
  • next.js-学习5
  • JSON(JavaScript Object Notation)
  • 图形学曲线c++简单实现
  • Vllm进行Qwen2-vl部署(包含单卡多卡部署及爬虫请求)
  • mysqldump 参数详解
  • Linux | 程序 / 进程调用库依赖关系查看
  • 上位机知识篇---HTTPHTTPS等各种通信协议
  • 网络空间安全(4)web应用程序安全要点
  • STL 算法库中的 min_element 和 max_element
  • 什么是HTTP协议
  • multer 依赖详解
  • USBCANFD接口卡介绍
  • MATLAB应用介绍
  • 前后端分离项目部署到云服务器、宝塔(前端vue、后端springboot)详细教程
  • 深入理解分布式系统中的关键概念:三阶段提交、补偿事务、消息队列与Saga事务模型及分布式ID生成方案
  • C#通过接口 继承接口的类 实现约束 对List内数据类型的值进行排序,可直接复制使用
  • 我通过AI编程完成了第一个实用程序