前言

上一章节我们了解了一下Semantic KernnelPlugins插件的概念以及学习了的 Semantic Kernel 模板插件的创建,本章节我们来学习 Native Plugins 原生函数插件使用。

通过函数定义插件

在之前的章节中我们介绍过在在 Semantic Kernel 中应用 Function Calling,在文中讲解了Functioncalling的概念,以及在SK中的应用。

Semantic Kernel中定义Native Plugins 函数插件,和 gpt-3.5-turbo 在 6 月 13 日 发布的 Function Calling特别的像,这是通过增加外部函数,通过调用来增强 OpenAI 模型的能力。

在 Semantic Kernel 中定义函数插件

Semantic Kernerl 中提供了很多定义Native Plugins的扩展方法来创建插件下面介绍最常用的几种:

根据类型创建插件

  • SK源码
    public static KernelPlugin ImportPluginFromType<T>(this Kernel kernel, string? pluginName = null)
{
KernelPlugin plugin = CreatePluginFromType<T>(kernel, pluginName);
kernel.Plugins.Add(plugin);
return plugin;
}
  • 定义Native Plugins

Semantic Kernel 中定义函数插件,需要用到两个特性KernelFunctionDescription

KernelFunction特性把函数标记为一个SKNative functionDescription给函数和参数以及返回值加描述,方便LLMs能够更好的理解。

具体使用如下

public class WeatherPlugin
{
public static string GetWeather => "WeatherSearch"; [KernelFunction, Description("根据城市查询天气")]
public string WeatherSearch([Description("城市名")] string city)
{
return $"{city}, 25℃,天气晴朗。";
}
}
  • Kernel添加插件
kernel.ImportPluginFromType<WeatherPlugin>();

这就是刚才说的根据类型来创建SK插件

  • 调用
var getWeatherFunc = kernel.Plugins.GetFunction(nameof(WeatherPlugin), WeatherPlugin.GetWeather);
var weatherContent = await getWeatherFunc.InvokeAsync(kernel, new() { ["city"] = "北京" });
Console.WriteLine(weatherContent.ToString());
  • 输出
北京, 25℃,天气晴朗。

这是手动调用的方式当然也可以IChatCompletionService会话模式自动调用。

根据对象创建

主要用到了ImportPluginFromObject这个扩展方法

    public static KernelPlugin ImportPluginFromObject(this Kernel kernel, object target, string? pluginName = null)
{
KernelPlugin plugin = CreatePluginFromObject(kernel, target, pluginName);
kernel.Plugins.Add(plugin);
return plugin;
}
  • 定义根据城市名获取美食的插件
public class FinefoodPlugin
{
[KernelFunction, Description("根据城市获取美食推荐")]
public string GetFinefoodList([Description("城市名")] string city)
{
return "烤鸭,卤煮,老北京炸酱面,炒肝等";
}
}

和上一个使用 Type 注册插件是一样的操作

  • 注册并调用
    FinefoodPlugin finefoodPlugin = new();
kernel.ImportPluginFromObject(finefoodPlugin);
var getWeatherFunc = kernel.Plugins.GetFunction(nameof(FinefoodPlugin), "GetFinefoodList");
var weatherContent = await getWeatherFunc.InvokeAsync(kernel, new() { ["city"] = "北京" });
Console.WriteLine(weatherContent.ToString());
  • 输出:
烤鸭,卤煮,老北京炸酱面,炒肝等
  • 扩展

    既然 Kernel 对象提供了根据对象实例创建插件的方案,那么就可以我们最喜欢的依赖注入获取的服务做插件的实例,这一点非常的重要,在以后项目实战中很实用。

依赖注入举例

    IServiceCollection services = new ServiceCollection();
services.AddSingleton<FinefoodPlugin>();
var rootProvider = services.BuildServiceProvider();
FinefoodPlugin finefoodPlugin = rootProvider.GetRequiredService<FinefoodPlugin>();
kernel.ImportPluginFromObject(finefoodPlugin);

根据 Kernelfunction 创建对象的实例

SK 提供了几个根据 Kernelfunction 来创建Plugins的方案,这就用到Kernel对象创建 kernel functions的扩展方法。

关于Kernel Function的创建有两种常用的形式第一种是根据Prompts来创建Semantic function也可以叫Prompts function,第二种是根据 C#的Delegate来创建Kernel Function

第一种方案之前的文章中有讲过,有兴趣可以浏览一下深入学习 Semantic Kernel:创建和配置 prompts functions,这里不过多介绍。

第二种在这里我们重点讲一下,根据委托来创建Kernel Function

  • 源码一览
    public static KernelFunction CreateFunctionFromMethod(
this Kernel kernel,
Delegate method,
string? functionName = null,
string? description = null,
IEnumerable<KernelParameterMetadata>? parameters = null,
KernelReturnParameterMetadata? returnParameter = null)
{
Verify.NotNull(kernel);
Verify.NotNull(method); return KernelFunctionFactory.CreateFromMethod(method.Method, method.Target, functionName, description, parameters, returnParameter, kernel.LoggerFactory);
}

在之前的文章介绍过,所有创建Kernelfunction基本上都是利用KernelFunctionFactoryfunction工厂创建的,其实插件的创建也是一样通过KernelPluginFactory插件plugin工厂创建的。

创建一个根据城市名获取游玩地点的插件

  • 创建 Kernel Function
    var kernelfunction = kernel.CreateFunctionFromMethod((string city) => { return $"{city} 好玩的地方有八达岭长城,故宫,恭王府等"; },
functionName: "GetTourismClassic", description: "获取城市的经典",
[
new KernelParameterMetadata(name:"city") {
Description="城市名"
}]);
  • 注册插件并调用
    kernel.ImportPluginFromFunctions("TourismClassicPlugin", [kernelfunction]);
var getTourismClassic = kernel.Plugins.GetFunction("TourismClassicPlugin", "GetTourismClassic");
var weatherContent = await getTourismClassic.InvokeAsync(kernel, new() { ["city"] = "北京" });
Console.WriteLine(weatherContent.ToString());
  • 输出
北京 好玩的地方有八达岭长城,故宫,恭王府等

扩展

上面介绍的都是在Sk中创建Native Plugins常用的方法,还有一些用法,比如

  • ImportPluginFromApiManifestAsync OpenAPI 功能相关
  • ImportPluginFromOpenAIAsync 通过 OpenAI 的 ChatGPT 格式为 OpenAI 插件创建一个插件
  • CreatePluginFromOpenApiAsync 从 OpenAPI v3 端点创建插件
  • ImportPluginFromGrpcFile 从 gRPC 文档导入
  • 其他

最后

本章我们学习了在 Semantic Kernel 中使用 Native Plugins 原生函数插件的方法,包括通过函数定义插件和根据对象创建插件的步骤。我们探讨了不同的创建插件的方式,以及如何注册插件并进行调用。通过这些方法,我们可以扩展 Semantic Kernel 的功能,增强模型的能力。

参考文献

示例代码

本文源代码

探索Native Plugins:开启大模型的技能之门的更多相关文章

  1. ILLA Cloud: 调用 Hugging Face Inference Endpoints,开启大模型世界之门

    一个月前,我们 宣布了与 ILLA Cloud 与达成的合作,ILLA Cloud 正式支持集成 Hugging Face Hub 上的 AI 模型库和其他相关功能. 今天,我们为大家带来 ILLA ...

  2. Picasso:开启大前端的未来

    “道生一,一生二,二生三,三生万物.” —— <道德经> Picasso是大众点评移动研发团队自研的高性能跨平台动态化框架,经过两年多的孕育和发展,目前在美团多个事业群已经实现了大规模的应 ...

  3. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  4. DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

    DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...

  5. 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00

    武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...

  6. 跟上节奏 大数据时代十大必备IT技能

    跟上节奏 大数据时代十大必备IT技能 新的想法诞生新的技术,从而造出许多新词,云计算.大数据.BYOD.社交媒体……在互联网时代,各种新词层出不穷,让人应接不暇.这些新的技术,这些新兴应用和对应的IT ...

  7. PowerDesigner 学习:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

  8. PowerDesigner 15学习笔记:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

  9. 5、手把手教React Native实战之盒子模型BoxApp

    用HTML5和React Native分别实现盒子模型显示 写法不一样: 1.样式 ![样式不同](http://image17-c.poco.cn/mypoco/myphoto/20160323/0 ...

  10. 文心大模型api使用

    文心大模型api使用 首先,我们要获取硅谷社区的连个key 复制两个api备用 获取Access Token 获取access_token示例代码 之后就会输出 作文创作 作文创作:作文创作接口基于文 ...

随机推荐

  1. kubernetes CNI(Container Network Inferface)

    为什么需要 CNI 在 kubernetes 中,pod 的网络是使用 network namespace 隔离的,但是我们有时又需要互相访问网络,这就需要一个网络插件来实现 pod 之间的网络通信. ...

  2. 使用Docker搭建MongoDB 5.0版本副本集集群

    1.mongodb集群 首先我们需要了解mongodb的集群模式,mongodb安装分为单机安装和集群安装.集群安装分为:主从复制(Master-Slaver)集群.副本集(Replica Set)集 ...

  3. Stable Diffusion中的常用术语解析

    Stable Diffusion中的常用术语解析 对于很多初学者来说,会对Stable Diffusion中的很多术语感到困惑,当然你不是唯一的那个. 在这篇文章中,我将会讲解几乎所有你在Stable ...

  4. 宏杉科技加入阿里云PolarDB开源数据库社区

    简介: 宏杉科技签署阿里巴巴开源CLA(Contribution License Agreement, 贡献许可协议), 正式与阿里云PolarDB 开源数据库社区牵手. 宏杉科技签署阿里巴巴开源CL ...

  5. 转载 | 基于阿里云Serverless函数计算开发的疫情数据统计推送机器人

    简介: 本文选自函数计算征集令优秀征文! 一.Serverless函数计算 什么是Serverless? 在<Serverless Architectures>中对 Serverless ...

  6. 优化搜索排序结果从而“ 提升CTR、CVR业务指标”

    简介: 搭建搜索功能不难,难的是如何提高搜索质量,帮助用户快速找到心中所想的内容或商品,那么搜索结果的相关性排序则是影响用户体验最关键的一环,本文通过阿里云开放搜索电商行业解决方案和大家聊一聊如何优化 ...

  7. hyengine - 面向移动端的高性能通用编译/解释引擎

    ​简介:手机淘宝客户端在历史上接过多种多样的脚本引擎,用于支持的语言包括:js/python/wasm/lua,其中js引擎接过的就有:javascriptcore/duktape/v8/quickj ...

  8. Flink+Hologres亿级用户实时UV精确去重最佳实践

    简介: Flink+Hologres亿级用户实时UV精确去重最佳实践 UV.PV计算,因为业务需求不同,通常会分为两种场景: 离线计算场景:以T+1为主,计算历史数据 实时计算场景:实时计算日常新增的 ...

  9. MaxCompute 挑战使用SQL进行序列数据处理

    简介: MaxCompute 挑战使用SQL进行序列数据处理 --而不是用MR和函数 日常编写数据加工任务,主要的方法就是使用SQL.第一是因为自己对SQL掌握的比较好(十多年数据开发经验,就这几个关 ...

  10. IDC报告:阿里云领跑中国数据库市场年度份额首超传统厂商

    ​ 简介: IDC报告显示,2020年中国关系型数据库软件市场规模达到121.8亿元,同比增长36.5%.其中,以公有云模式部署的关系型数据库市场占比达到51.5%,首次超过传统线下部署模式市场规模, ...