dotnet SemanticKernel 入门 自定义变量和技能

这篇具有很好参考价值的文章主要介绍了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);

执行以上代码,即可看到输出了今天的时间

本文的代码放在github 和 gitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 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 文件夹文章来源地址https://www.toymoban.com/news/detail-689502.html

到了这里,关于dotnet SemanticKernel 入门 自定义变量和技能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入浅出 C 语言:学变量、掌控流程、玩指针,全方位掌握 C 编程技能

    C 语言介绍 C 语言的特性 C 语言相对于其他语言的优势 C 程序的编译 C 中的 Hello World 程序 参考文章: C 语言入门:如何编写 Hello World C 语言函数:入门指南 C 中的变量和 C 语言中的作用域规则 C 中的数据类型 运算符及其类型 C 语言中的类型转换 参考文章: C 语言注释

    2024年02月02日
    浏览(45)
  • Maven 必备技能:MAC 系统下 JDK和Maven 安装及环境变量配置详细讲解

    开发中难免因系统问题或者版本变更反复折腾JDK和Maven环境变量,干脆写个笔记备忘个,也方便小伙伴们节省时间。 =================JDK安装与环境变量配置====== 1.官网下载jdk mac安装包: Java Downloads | Oracle \\\" https://www.oracle.com/java/technologies/downloads/#java8-mac \\\"【jdk8及以下版本需要o

    2024年02月04日
    浏览(47)
  • 玩以太坊链上项目的必备技能(Constant 和 Immutable 状态变量-Solidity之旅十六)

    constant(常量) 说到 常量 这一概念,拥有现代编程经历的您,对这一词再熟悉不过了。 常量 , 常量 ,顾名思义便是变量值始终不变,这在很多面向对象程序语言中都有。 相对 Solidity 来说,它也是支持 常量 的。 假若将 状态变量(State Vriable) 声明为 constant(常量) ,而

    2024年02月02日
    浏览(50)
  • 微信小程序自定义tabBar,前端开发技能

    首页 分类 留言 我的 /components/index-tabbar/index.js Component({ properties: { active: { type: String, value: ‘index’ }, }, methods: { onChange(event) { wx.redirectTo({ url: /pages/${event.detail}/index , }) } } }) 模拟的 tabbar 页面写法如下: /pages/home/index.json { “usingComponents”: { “index-tabbar”: “/components/index-ta

    2024年04月22日
    浏览(39)
  • 基于Microsoft SemanticKernel和GPT4实现一个智能翻译服务

    今年.NET Conf China 2023技术大会,我给大家分享了 .NET应用国际化-AIGC智能翻译+代码生成的议题 .NET Conf China 2023分享-.NET应用国际化-AIGC智能翻译+代码生成 今天将详细的代码实现和大家分享一下。 一、前提准备 1. 新建一个Console类的Project 2. 引用SK的Nuget包,SK的最新Nuget包 3. 在

    2024年02月19日
    浏览(38)
  • 工具系列(七) 本文(4万字) | Git入门教程 | 初始本地仓库-推送合并到远程仓库 | 解读VScode与PyCharm配置与使用git | CodeGeeX与Tabnine使用 |

    点击进入专栏: 《人工智能专栏》 Python与Python | 机器学习 | 深度学习 | 目标检测 | YOLOv5及其改进 | YOLOv8及其改进 | 关键知识点 | 各种工具教程

    2024年02月21日
    浏览(64)
  • 【HiveSQL】定义变量&使用变量

    HiveSQL中如何定义变量,并且在全局引用? 直接上代码。 结果:

    2024年02月16日
    浏览(37)
  • 大数据基础技能入门指南

    本文介绍了数据工作中数据基础和复杂数据查询两个基础技能。 背景 当下,不管是业务升级迭代项目,还是体验优化项目,对于数据的需求都越来越大。数据需求主要集中在以下几个方面: 项目数据看板搭建:特别是一些AB实验的看板,能直观呈现项目的核心数据变化 数据

    2024年02月05日
    浏览(50)
  • MySQL数据库——存储过程-变量(系统变量、用户定义变量、局部变量)

    目录 系统变量  1.查看系统变量  2.设置系统变量 演示示例 用户定义变量 1.赋值  2.使用 演示示例 局部变量 声明  赋值 演示示例 变量 在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。 系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全

    2024年02月05日
    浏览(53)
  • WFP必须掌握的技能之自定义控件——实战:自制上传文件显示进度按钮

    自定义控件在WPF开发中是很常见的,有时候某些控件需要契合业务或者美化统一样式,这时候就需要对控件做出一些改造。 目录 按钮设置圆角 按钮上传文件相关定义 测试代码 话不多说直接看效果 默认效果: 上传效果: 按钮设置圆角 因为按钮本身没有 CornerRadius 属性,所以只

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包