.NET面向AI编程——SK框架(SemanticKernel)的简易入门实践

news/2024/11/7 18:33:28/

前言:随着ChatGPT开始在各个领域遍地开花,有关的应用也开始层出不穷。随着微软开源SK框架,无疑是给.NET开发者带来面向AI应用的新机遇。以下内容,通过创建一个简单的prompt开始,开发一个使用SK框架进行开发的入门教程,供参考。

首先,创建一个webapi项目。当然,此处也可以创建其他任意类型的项目,只是个人喜欢用webapi来做实践,比较方便。

接着,通过nuget安装SK框架nuget包: Microsoft.SemanticKernel

由于截止到目前(2023年5月28日),该框架包还是预览版,所以需要勾选预览版选项,才能搜索的到。

再然后,创建连接远程机器人模型的配置文件,例如文件名称就叫 gpt.json。该配置文件可自定义,也可以写到默认的appsettings.json里面都可以。

在配置文件里面,需要配置自己的服务类型。例如走的是azure还是openai,以及模型类型,例如gpt-3.5-turbo模型,还有自己的key,和组织id等信息。

接着在主目录下,新建三级目录,包括Skills、二级目录自定义名称例如DM、以及三级目录名称例如Test。一级目录Skills是默认写法,当然也可以用其他命名,为了统一建议写成Skills。这里面要存放我们的prompt文件,用来给机器人做限定使用。

在最后一级目录下,新建一个config.json文件。该文件用来配置机器人的基础设置,这部分应该大家比较熟悉了,就不详细介绍了。默认情况下,可以使用默认空的配置即可,例如{} ;如果需要自定义配置,就可以使用以下配置项进行优化或调整。

在config同级别路径下,新增一个skprompt文本文件,内容是给机器人做个设定,也就是传说中的prompt(将来也许会有Prompt工程师也说不定)。例如我设定机器人叫叼毛,Wesky是他的主人等关键信息。

接着需要定制一个类,包括基本配置属性,以及配置加载方法等。

编写从文件里面加载配置文件内容验证的方法,如果文件不存在或者加载失败,就直接抛出异常。

新增一个拓展类,用来根据配置的服务,选择进入不同的服务商。也可以再根据配置的模型不同,进入不同的服务调用入口,此处为了简单,就先写死了,并提供了一个走azure openai的通道,供大家备用。

接下来是如何使用。此处我新建一个api控制器,用来做测试使用。然后新增一个初始化的webapi接口,用来配置加载配置文件和连接初始化等动作。

再新建一个webapi接口,提供可输入文本内容的参数,并获取远程模型返回的内容,用来测试。

最后,运行程序,默认打开swagger页面,先调用执行初始化接口(BuildChat)

初始化接口执行成功,再进行Test接口调用。例如询问机器人,你是哪个,机器人就可以根据prompt文件内容信息,进行自己设定身份,回复了他叫叼毛。

例如问,你的主人是谁?机器人也可以根据预设的prompt进行针对性回答。

最后,再来个常规的咨询,例如如何在.NET里面使用SK框架?机器人也可以正常回答出有关大概步骤。

以上就是该文章的全部内容。如需该文章配套源码,可在微公号【Dotnet Dancer】后台回复【SKSK】即可获取。


http://www.ppmy.cn/news/97920.html

相关文章

Typescript 5.0 发布:快速概览

探索最令人兴奋的功能和更新 作为一种不断发展的编程语言,TypeScript 带来了大量的改进和新功能。在本文中,我们将深入探讨 TypeScript 的最新版本 5.0,并探索其最值得关注的更新。 1. 装饰器 TypeScript 5.0 引入了一个重新设计的装饰器系…

MySQL-多表查询(下)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易&…

Unity的IPreprocessShaders:深入解析与实用案例

Unity IPreprocessShaders Unity IPreprocessShaders是Unity引擎中的一个非常有用的功能,它可以让开发者在编译Shader时自定义哪些操作需要被执行。这个可以帮助开发者更好地控制Shader的编译过程,确保在编译Shader时执行必要的操作。在本文中&#xff…

LAMP架构中的安装论坛

前言:本次操作依赖于LAMP的环境已经配置完全,网站也是依赖于开发人员现有的网站包框架,实施在LAMP已搭建好的环境进行安装部署 目录 一、对mysql进行操作 创建数据库,并进行授权 二、解压论坛压缩包 三、初步访问安装 解决…

Python系列模块之标准库shutil详解

感谢点赞和关注 ,每天进步一点点!加油! 目录 一、shutil介绍 二 、使用详解 2.1 复制函数 2.1.1 shutil.copy 2.1.2 shutil.copy2 2.1.3 shutil.copyfile 2.1.4 shutil.copytree 2.2 移动文件 2.2.1 shutil.move 2.3 删除文件 2.3…

Day3:Windows网络编程-UDP

对比TCP与UDP的通信区别 UDP Server没有listen()和accept() TCP Server #include <iostream> #include <WinSock2.h> // 包含网络库 #pragma comment(lib,"ws2_32.lib") using namespace std;int main() {// 1. 初始化套接字 初始化套接字库cout <&l…

Kubernetes 云原生 Gateway 网关

一、云原生定义 CNCF 对云原生的定义中提到了几个关键的点&#xff1a; 1、强调应用环境的动态性&#xff0c;像公有云、私有云、混合云等新型的动态环境已成为大多数应用的首选&#xff1b; 2、强调在跨多云部署应用时具备非云平台绑定的属性&#xff1b; 3、还强调了弹性扩展…

JavaSE_day39(接上File:获取,修改,数组形式获取,获取目录下的java文件,删除目录。回顾以及深入完整介绍IO,使用字符、字节复制文本文件)

1 A.java * 4 File获取功能 ①&#xff1a;获取绝对路径 File getAbsoluteFile() * String getAbsolutePath() * ②&#xff1a;获取父目录&#xff0c;文件名&#xff08;最后的一个的目录或者文件&#xff09; * String …