本文将告诉大家如何在 SemanticKernel 里面调用原生本机技能,所谓原生本机技能就是使用 C# 代码编写的原生本地逻辑技能,这里的技能可讲的可不是游戏角色里面的技能哈,指的是实现某个功能的技能,这是构成 AI 强大能力的基础

本文属于 SemanticKernel 入门系列博客,更多博客内容请参阅我的 博客导航

众所周知 GPT 是一个大语言模型,能够参与的输入和输出是文本内容。而想要让 GPT 完成各项功能,则需要对接现有的编程世界。为了能够更好的复用这几十年的编程世界积累的知识和搭建的基础设施,微软推出 SemanticKernel 框架,通过 SemanticKernel 框架可以让传统的编程语言和 GPT 等 AI 更好的协作,赋予 AI 强大的能力

举个例子来说,当你和 GPT 说,请关灯的时候。此时你期望的也许不是 GPT 长篇大论的帮你关灯,而是更多的期望是 GPT 真的识别到你的意图,通过和你沟通的上下文,帮你将灯给关掉。然而只靠 GPT 本身,则是力不从心的,因为 GPT 本身没有关灯的能力。有关灯能力的是传统 IOT 能力。而通过 SemanticKernel 框架,则可以非常方便在打通 GPT 和关灯 IOT 编程之间的连接。只需要在 SemanticKernel 框架里面加入一个关灯技能,然后告诉 AI 有这个技能,这样 AI 就可以使用这个技能实现关灯的能力

在 SemanticKernel 框架里面定义的技能,都是一个基础的 C# 实现逻辑,比如说本文的例子就是 TextSkill 技能,这个 TextSkill 包含了基础的文本字符串处理功能,比如大小写转换,裁剪文本前后空白,获取字符串长度等等

熟悉 GPT 功能的伙伴大概也不陌生,对于 GPT 来说,所有的输出都是凭 "感觉" 的。而 Skill 技能则可以很好补足这个缺点,让一些确定性的基础逻辑交给传统编程语言编写,如此即可利用传统编程的输入输出稳定性保证输出的可靠性

本文将尝试创建一个项目,在这个项目里面使用 TextSkill 技能作为例子,只使用技能类而还不需要接触 SemanticKernel 框架

先新建一个 dotnet 7 的控制台项目,接着编辑 csproj 项目文件,修改为如下代码用来快速安装 Microsoft.SemanticKernel 库

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup> <ItemGroup>
<PackageReference Include="Microsoft.SemanticKernel" Version="0.20.230821.4-preview" />
</ItemGroup> </Project>

也可以通过右击项目,点击管理 NuGet 程序包,搜 Microsoft.SemanticKernel 然后进行安装

值得一提的是,当前的 Microsoft.SemanticKernel 还是一个预览版本,有可能在正式发布的时候变更了 API 导致本文的代码在正式版本跑不起来

先按照传统的 C# 编程方法,创建出 TextSkill 对象,如下面代码

using Microsoft.SemanticKernel.Skills.Core;

// 创建技能
var text = new TextSkill();

接着即可和之前的 C# 代码调用一样,调用 TextSkill 里面提供的方法,比如修改字符串大小写

// 直接调用技能里的方法
var result = text.Uppercase("ciao");

试试输出结果,自然是很符合预期的所有字符都大写

Console.WriteLine(result);

所有的代码如下

using Microsoft.SemanticKernel.Skills.Core;

// 创建技能
var text = new TextSkill(); // 直接调用技能里的方法
var result = text.Uppercase("ciao"); Console.WriteLine(result);

可以看到在没有使用到 SemanticKernel 框架的前提下,这是丝毫没有魔法的。这样的设计可以让咱非常方便进行技能的调试,因为这时候的技能类型就和其他的类型没有什么不相同的。在 下一篇 将告诉大家如何将技能导入框架

本文的代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin eef729b3a5ff8017161fdae58a786812ad2a7df0

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin eef729b3a5ff8017161fdae58a786812ad2a7df0

获取代码之后,进入 SemanticKernelSamples\Example01_NativeFunctions 文件夹

dotnet SemanticKernel 入门 调用原生本机技能的更多相关文章

  1. dotnet 从入门到放弃的 500 篇文章合集

    本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...

  2. dotnet core 入门

    之前一至用的dotnet 做开发,项目没有用过.netcore,现在看微软对dotnetcore的重视度越来越高,所以dotnetcore也是每一个.dotnet开发人员的一项必备技能.一个偶然的机会 ...

  3. phonegap+cordova+ionic调用原生API

    上一篇博客讲了phonegap+cordova+ionic的环境搭建,今天再来分享一篇cordova调用原生API的文章.从技术角度上来讲,这并不是很难,只是有些细节要是没有注意,或者某些步骤不知道的 ...

  4. iOS开发--JS调用原生OC篇

    JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...

  5. Dcloud HTML5 监听蓝牙设备 调用 原生安卓实现

    最近一直搞Dcloud ,这是HTML5版本的开发,打包时候,可以打包成 apk 和ipa 分别运行在安卓和ios 机器上面, 但是这里面的资料很少,遇到问题,之后只能自己钻研总结, 现在有这么一个需 ...

  6. ionic-native-transitions调用原生页面切换实现ionic路由切换

    废话不多说:ionic-native-transitions调用原生页面切换实现ionic路由切换,从而大大提升ionic应用的性能. ionic-native-transitions是一个ionic ...

  7. uni-app调用原生的文件系统管理器(可选取附件上传)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Xamarin.Form怎么调用原生方法

    ---恢复内容开始--- Xamarin.Form怎么调用原生包 今天我想和大家分享的是有关Xamarin如何调用安卓的原生代码,下面的例子以大家可能会经常用到的微信WX方法的调用. 首先我们新建一个 ...

  9. ReactNative-JS 调用原生方法实例代码(转载)

    第一步首先创建ReactNative 模块类继承ReactContextBaseJavaModule package com.mixture;   import android.content.Con ...

  10. 使用JNA,让java调用原生代码

    JNA定义: JNA:java Native Access,是SUN公司开发的基于JNI的框架.JNI使得Java可以调用原生的c或者c++代码. JNA与JNI(Java Native Interf ...

随机推荐

  1. Cesium之双屏联动实现

    1. 概述 双屏联动是常见的一种地图开发需求,主要用于同时查看两个地图,进行对比查看,还有一种类似的需求叫"卷帘门"(map split) 双屏联动效果如下: 卷帘门的效果如下: ...

  2. 你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.什么是SPA SPA(single-page application),翻译过来就是单页应用SPA是一种网络应用程序或网站的模型,它通 ...

  3. 替换Spring容器中已经存在的Bean

    一.背景 我们在开发的过程中,经常会引入别人写的jar包实现某些功能.而别人的jar包一般都自动注入Spring容器中,假设别人都是通过@Bean或@Component注入的,并且没有加入@Condi ...

  4. FtpClient一定要setSotimeOut、setDataTimeout

    SotimeOut,简单说就是读取数据时阻塞链路的超时时间. /** * Enable/disable {@link SocketOptions#SO_TIMEOUT SO_TIMEOUT} * wi ...

  5. KingbaseES V8R6 创建索引create index concurrently被阻塞

    前言 CREATE INDEX CONCURRENTLY(CIC)是DBA们最常用的语句之一,它的好处是不阻塞DML语句. 但在大事务.长事务较多的系统,它可能被阻塞得很久. 本篇就从这个阻塞的案例开 ...

  6. 2024-03-30:用go语言,集团里有 n 名员工,他们可以完成各种各样的工作创造利润, 第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与, 如果成员参与

    2024-03-30:用go语言,集团里有 n 名员工,他们可以完成各种各样的工作创造利润, 第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与, 如果成员参与 ...

  7. 配置腾讯云轻量级linux服务器用到的资源和步骤

    pasv_address=82.157.112.34 #请修改为您的 Linux 云服务器公网 IPsftp://82.157.112.34:21 ①下载系统可视化https://cloud.tenc ...

  8. 批量导出导入IIS下所有网站方法

    C:\Windows\System32\inetsrv\config\ applicationHost.config 存放的是网站列表配置信息,复制到目标服务器相同目录下(建议备份目标服务器原文件). ...

  9. Spring Bean 的一生

    Spring Bean 的一生包括其从创建到消亡的整个过程: 实例创建 => 填充 => 初始化 => 使用 => 销毁. 这里需要注意的是,从 bean 实例的创建到可以使用 ...

  10. #线性dp#洛谷 5999 [CEOI2016]kangaroo

    题目 问有多少个长度为 \(n\) 的排列满足首项为 \(st\),末项为 \(ed\), 并且 \(\forall i\in (1,n),\left[a_{i-1}<a_i \oplus a_ ...