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:输入记录分隔符(输入换行符), 指定输入时的 ...
随机推荐
- ICLR 2018-A Simple Neural Attentive Meta-Learner
Key 时序卷积+注意力机制(前者从过去的经验中收集信息,而后者则精确定位具体的信息.) 解决的主要问题 手工设计的限制:最近的许多元学习方法都是大量手工设计的,要么使用专门用于特定应用程序的架构,要 ...
- 【重学C++】01| C++ 如何进行内存资源管理?
文章首发 [重学C++]01| C++ 如何进行内存资源管理? 前言 大家好,我是只讲技术干货的会玩code,今天是[重学C++]的第一讲,我们来学习下C++的内存管理. 与java.golang等自 ...
- [SWPUCTF 2021 新生赛]PseudoProtocols
[SWPUCTF 2021 新生赛]PseudoProtocols 一.题目 二.WP 1.打开题目,发现提示我们是否能找到hint.php,并且发现URL有参数wllm.所以我们尝试利用PHP伪协议 ...
- Python潮流周刊#3:PyPI 的安全问题
你好,我是豌豆花下猫.这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 文章&教程 1.掌握Py ...
- [Kotlin Tutorials 21] 协程的取消
协程的取消 本文讨论协程的取消, 以及实现时可能会碰到的几个问题. 本文属于合辑: https://github.com/mengdd/KotlinTutorials 协程的取消 取消的意义: 避免资 ...
- WPF中有中心点的slider滑动条
想要实现的效果 原生滑动条 需要认识一下滑动条的组成 在原生控件中生成"资源字典"对应的样式 然后在track所在的列进行添砖加瓦 由于track在row="1" ...
- 大模型微调技术LoRA与QLoRA
LoRA: Low-Rank Adaptation of Large Language Models 动机 大模型的参数量都在100B级别,由于算力的吃紧,在这个基础上进行所有参数的微调变得不可能.L ...
- SpringBoot 多环境切换
日常开发中一般都会有三个不同的环境,分别是开发环境(dev),测试环境(test)和生产环境(prod),不同的环境各种配置都不相同,比如数据库配置,服务器端口等等. Spring Boot 多环境配 ...
- 现代C++(Modern C++)基本用法实践:N、其他零散的常用特性
概述 这一篇简单介绍一些其他的比较实用的特性,如果读者想了解现代C++的全部特性,参考:cpp reference 其他特性 预置和弃置函数default&delete 在 C++11 中引入 ...
- 简单了解下最近正火的SwissTable
去年看到字节跳动给golang提了issue建议把map的底层实现改成SwissTable的时候,我就有想写这篇博客了,不过因为种种原因一直拖着. 直到最近遇golang官方开始讨论为了是否要接受Sw ...