dotnet SemanticKernel 入门 自定义变量和技能
本文将告诉大家如何在 SemanticKernel 框架内定义自定义的变量和如何开发自定义的技能
本文属于 SemanticKernel 入门系列博客,更多博客内容请参阅我的 博客导航
自定义变量是一个非常有用的技能,自定义变量可以让炼丹师和程序员进行并行工作。由炼丹师对 AI 模型进行训练,从而找到对某项问题比较好的解决方案,炼丹师此时不需要关注具体所解决的问题,可以大量使用占位符代替用户的实际输入。而程序员则可以用到炼丹师的成果进而替换占位符为具体的用户输入,从而实现功能。下面举一个具体的例子
比如说对 GPT 进行 prompt 炼丹,最后炼出一个分类器,这个分类器可以根据用户的输入内容进行分类。但是在炼丹的过程炼丹师是不会也不可能拿到所有用户可能的输入的,用户可能的输入是在炼丹师完成炼丹工作之后,程序员开发人机交互应用最后才能拿到用户的实际输入内容。这个时候自定义变量的功能相信大家就能知道了,通过自定义变量的功能,让炼丹师可以方便插入占位符,从而程序员进行对接
更进一步,自定义变量还可以更加方便技能的导入,由于许多技能都可以输入不止一个的输入内容,在有自定义变量的辅助之下,即可完成更加复杂的管道逻辑。比如说在经过某个技能之后,可以进行多变量输入和多变量输出,于是就可以传递更多丰富的信息给到后续的步骤。比如说 GPT 的分类功能,可以在分类之后对不同类别输出不同的输入要求,从而满足对接后续的技能。举一个具体的例子
比如说训练 GPT 可以输出用户的输入内容,将用户的输入类型分类为 1. 总结文本内容 2. 根据文字生成图片 等,通过对接自定义变量功能时。可以让炼丹师不需要关注特定的输入,而是统一采用 input 变量当成用户的输入,然后在完成之后,注入用户输入类型作为 type 变量。如果用户是总结文本内容的需求,则再添加 text 变量。如果是根据文字生成图片,则注入 request 变量和 size 尺寸变量。于是程序员可以编程开发,给 SemanticKernel 框架先设置 input 变量,这个 input 变量就是用户输入的文本内容。接着执行 GPT 的智能逻辑,再读取自定义变量 type 拿到用户期望执行的类型,分别调用不同的技能函数。比如说总结文本技能就需要用到 text 变量作为输入,而根据文字生成图片则需要 request 变量和 size 尺寸变量,这些都可以在一个顺序之中完成
看到这里,大家是不是想要试试看 SemanticKernel 框架赋予 AI 的强大能力了?放心,本文现在还不涉及到任何 AI 相关的逻辑,依然还在探索 SemanticKernel 框架的过程
先和大家介绍一下如何在 SemanticKernel 框架里面注入自定义变量。在 SemanticKernel 框架里面默认将所有的输入当成了 input 变量,也就是后续介绍到的 SemanticKernel 的 SK 函数里面,如果只有一个默认参数,那么这个参数将会被同时赋给 input 变量
在 SemanticKernel 注入自定义变量的方法可以是先新建 ContextVariables 对象,通过变量上下文对象进行类似字典的方式赋值。默认给到 ContextVariables 构造函数的就是后续会被当成 input 的变量,如以下代码。下面代码将演示在没有任何 AI 参与的情况下,输出今天的日期
var variables = new ContextVariables("今天是: ");
variables.Set("day", DateTime.Now.ToString(CultureInfo.CurrentCulture));
如以上的代码就定义了 input 是 "今天是: " 而 day 变量就是通过 Set 方法设置为 DateTime.Now.ToString(CultureInfo.CurrentCulture) 的返回值
也就是说如果有逻辑能够将 input 和 day 拼接在一起,就能够完成一句话。当然,更多的时候变量是用来提供给到 AI 使用的。现在咱还不想使用魔法,先看看如果是纯写传统代码的情况下,如何完成这个功能
在聊到自定义变量的时候,就肯定会聊到自定义技能功能了。在之前的博客里面,大家也看到了调用框架自带的技能的方法,接下来我将和大家介绍如何自定义技能
自定义技能是 SemanticKernel 框架所强大的地方,通过自定义技能即可将 AI 和传统编程联系在一起,下面让咱编写一个技能,这个技能的用途是将日期追加到输入字符串里面
自定义技能的做法是创建一个方法且标记 SKFunction 特性,可选的加上描述信息。这个描述信息现在也只是给程序员看的,据说后面微软将准备出一个 GUI 设计器,这时候对技能的描述就可以更加方便给非编程的工程师进行开发 AI 功能
class StaticTextSkill
{
[SKFunction, Description("追加 day 变量到字符串")]
public static string AppendDay
(
[Description("准备被追加的文本")] string input,
[Description("追加到文本后面的字符串")]
string day
)
=> input + day;
}
以上的 AppendDay 方法里面的参数将会被 SemanticKernel 框架使用反射的方式进行注入,注入的就是参数名对应的变量。简单来说就是从 ContextVariables 里面尝试通过参数名获取到参数。如果没能从 ContextVariables 里读取到和参数名对应的变量,则会记录一个错误信息,例如当技能函数里面丢失了一个名为 xx 的变量时的输出如下
Missing value for parameter 'xx'
在一个类型里面可以定义许多个技能函数,此时就可以通过导出技能类然后使用技能类里面的多个技能方法,如下面代码定义一个非静态的技能方法在 StaticTextSkill 类型里面
class StaticTextSkill
{
[SKFunction, Description("将所有的文本字符串修改为大写")]
public string Uppercase([Description("准备修改为大写的文本")] string input) =>
input.ToUpperInvariant();
[SKFunction, Description("追加 day 变量到字符串")]
public static string AppendDay
(
[Description("准备被追加的文本")] string input,
[Description("追加到文本后面的字符串")]
string day
)
=> input + day;
}
接下来需要做的就是将 ContextVariables 放入到 SemanticKernel 框架,通过管道方式调用 StaticTextSkill 技能,如以下代码
IKernel kernel = new KernelBuilder().Build();
var text = kernel.ImportSkill(new StaticTextSkill(), "text");
var variables = new ContextVariables("今天是: ");
variables.Set("day", DateTime.Now.ToString(CultureInfo.CurrentCulture));
SKContext result = await kernel.RunAsync(variables,
text["AppendDay"],
text["Uppercase"]);
Console.WriteLine(result);
执行以上代码,即可看到输出了今天的时间
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 84c1e073be77bee177607596b5e03cabb0c0a719
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 84c1e073be77bee177607596b5e03cabb0c0a719
获取代码之后,进入 SemanticKernelSamples\Example03_Variables 文件夹
dotnet SemanticKernel 入门 自定义变量和技能的更多相关文章
- (大数据工程师学习路径)第一步 Linux 基础入门----环境变量与文件查找
环境变量与文件查找 本节介绍环境变量的作用与用法,及几种搜索文件的方法.学会这些技巧高效地使用 Linux. 一.环境变量 1.变量 要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变 ...
- dotnet 从入门到放弃的 500 篇文章合集
本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...
- 【持续集成】[Jenkins]Job中如何传递自定义变量
[Jenkins]Job中如何传递自定义变量 来自dweiwei 2015-06-27 18:37:19| 分类: 自动化测试 |举报 |字号大中小 订阅 用微信 “扫一扫” 将文章分享到朋友 ...
- 【freemaker】之自定义变量,特殊变量 globals ,循环对象取值
entity public class Employee { private Integer id; private String name; private Integer age; private ...
- Shell变量之自定义变量、环境变量
1:环境变量 环境变量可以帮我们达到很多功能-包括家目录的变换啊.提示字符的显示啊.运行文件搜寻的路径啊等等的那么,既然环境变量有那么多的功能,问一下,目前我的 shell 环境中, 有 ...
- v9站点自定义变量
打开 \phpcms\modules\admin\templates\site_edit.tpl.php 文件,找到最后一个 </fieldset> ,在他后面添加一下代码:<!-- ...
- Mysql自定义变量的使用
用户自定义变量是一个容易被遗忘的MySQL特性,但是如果能用的好,发挥其潜力,在某些场景可以写出非常高效的查询语句.在查询中混合使用过程化和关系化逻辑的时候,自定义变量可能会非常有用.单纯的关系查询将 ...
- Linux基础入门-环境变量与文件查找
一.环境变量: Shell中的变量也有不同的数据类型,不用专门指定类型名,可以参与运算,有作用域限制. declare tmp 创建一个变量 可以不用专门声明,可以即用即创建 tmp=shiyanlo ...
- Linux常用基本命令:三剑客命令之-awk内置变量与自定义变量
AWK中,变量分为两种:内置变量与自定义变量. 常见的内置变量有: FS:输入字段分隔符, 默认为空白字符 OFS:输出字段分隔符, 默认为空白字符 RS:输入记录分隔符(输入换行符), 指定输入时的 ...
随机推荐
- 最小编译器和 UI 框架「GitHub 热点速览」
如果有一个关键词来概述本周的 GitHub 热门项目的话,大概就是 van 和 sectorc 都用到的 smallest.只不过一个是前端的响应式框架,一个是搞编译的 C 编译器.它们除了轻量化这个 ...
- ARC143
ARC143 考试情况:一眼订正,鉴定为做出前三题. A - Three Integers 以前做过 \(n\) 个数的版本,当时还被某人嘲讽说"堆,贪心,这都做不出来?". \( ...
- shell学习总结
shell教程 第一个shell脚本 打开文本编辑器(可以使用 vi/vim 命令来创建文件), 新建一个文件 test.sh,扩展名为 sh(sh代表shell) #!/bin/bash echo ...
- Mybatis-plus自定义Sql注入器
最近在学习mybatis-plus,知道了在mp中通过AbstractSqlInjector将BaseMapper中的方法注入到了Mybatis容器,这样这些方法才可以正常执行. 下面是一个关系图 那 ...
- Vue-CoreVideoPlayer 视频播放器组件
安装 cnpm install -S vue-core-video-player 快速使用 # 在main.js中 import VueCoreVideoPlayer from 'vue-core-v ...
- C#.NET Framework 使用BC库(BouncyCastle) RSA 公钥加密 私钥解密 ver:20230706
C#.NET Framework 使用BC库(BouncyCastle) RSA 公钥加密 私钥解密 ver:20230706 环境说明: .NET Framework 4.6 的控制台程序 . 20 ...
- Vue 先初始化子组件再初始化父组件的方法(自定义父子组件mounted执行顺序)
写在前面: 本篇内容内容主要讲述了,在使用 Konva 进行开发过程中遇到的一些问题.(既然是组件加载顺序,主要牵扯到的就是,父子组件的关系,父子组件的生命周期) 众所周知,Vue中父子组件生命周期的 ...
- Unity iOS Guideline 1.3 - Safety - Kids Category 被拒
解决办法: 不使用unity 的分析SDK //关闭unity信息收集服务 UnityEngine.Analytics.Analytics.enabled = false; UnityEngine.A ...
- 个人博客迁移到托管平台Netlify
Netlify是一家国外的静态网站的托管平台,提供免费的https,自动化部署和升级,可以监控GitHub.GitLab或者Bitbucket做到自动更新发布. 个人体会访问速度不是很理想,不如部署在 ...
- 巧用 bc 命令测试 Linux 主机的 CPU 性能
今天向公司申请了一台 Linux 主机,作为平时的开发环境.由于自己并不依赖远程开发(大多数情况下项目都可以本地开发.调试),于是只申请了 4C/8G 的低配机器. 突然好奇的是,这台机器的性能怎么样 ...