探索Native Plugins:开启大模型的技能之门
前言
上一章节我们了解了一下Semantic Kernnel中Plugins插件的概念以及学习了的 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 中定义函数插件,需要用到两个特性KernelFunction和Description
KernelFunction特性把函数标记为一个SK的Native function;Description给函数和参数以及返回值加描述,方便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基本上都是利用KernelFunctionFactory的function工厂创建的,其实插件的创建也是一样通过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常用的方法,还有一些用法,比如
ImportPluginFromApiManifestAsyncOpenAPI 功能相关
ImportPluginFromOpenAIAsync通过 OpenAI 的 ChatGPT 格式为 OpenAI 插件创建一个插件CreatePluginFromOpenApiAsync从 OpenAPI v3 端点创建插件ImportPluginFromGrpcFile从 gRPC 文档导入- 其他
最后
本章我们学习了在 Semantic Kernel 中使用 Native Plugins 原生函数插件的方法,包括通过函数定义插件和根据对象创建插件的步骤。我们探讨了不同的创建插件的方式,以及如何注册插件并进行调用。通过这些方法,我们可以扩展 Semantic Kernel 的功能,增强模型的能力。
参考文献
示例代码
探索Native Plugins:开启大模型的技能之门的更多相关文章
- ILLA Cloud: 调用 Hugging Face Inference Endpoints,开启大模型世界之门
一个月前,我们 宣布了与 ILLA Cloud 与达成的合作,ILLA Cloud 正式支持集成 Hugging Face Hub 上的 AI 模型库和其他相关功能. 今天,我们为大家带来 ILLA ...
- Picasso:开启大前端的未来
“道生一,一生二,二生三,三生万物.” —— <道德经> Picasso是大众点评移动研发团队自研的高性能跨平台动态化框架,经过两年多的孕育和发展,目前在美团多个事业群已经实现了大规模的应 ...
- 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅
摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...
- DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍
DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...
- 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00
武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...
- 跟上节奏 大数据时代十大必备IT技能
跟上节奏 大数据时代十大必备IT技能 新的想法诞生新的技术,从而造出许多新词,云计算.大数据.BYOD.社交媒体……在互联网时代,各种新词层出不穷,让人应接不暇.这些新的技术,这些新兴应用和对应的IT ...
- PowerDesigner 学习:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
- PowerDesigner 15学习笔记:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
- 5、手把手教React Native实战之盒子模型BoxApp
用HTML5和React Native分别实现盒子模型显示 写法不一样: 1.样式 放在Web服务器下就,这种叫静态资源托管,成本是比较 ...
- Pandas+ SLS SQL:融合灵活性和高性能的数据透视
简介: Pandas是一个十分强大的python数据分析工具,也是各种数据建模的标准工具.Pandas擅长处理数字型数据和时间序列数据.Pandas的第一大优势在于,封装了一些复杂的代码实现过程,只需 ...
- CNCF 沙箱项目 OCM Placement 多集群调度指南
简介:在这篇文章中,将介绍 Placement 如何选择到所需的集群,Placement 可以提供的调度功能,以及一些场景下的最佳实践,使用者可以参考示例来编写符合自己要求的 Placement.其 ...
- 360 政企安全集团基于 Flink 的 PB 级数据即席查询实践
简介: Threat Hunting 平台的架构与设计,及以降低 IO 为目标的优化与探索.为什么以及如何使用块索引. 本文整理自 360 政企安全集团的大数据工程师苏军以及刘佳在 Flink For ...
- IIncrementalGenerator 增量 Source Generator 生成代码入门 从语法到语义 获取类型完全限定名
本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何从语法分析过程,将获取的语法 Token 转换到语义分析上,比如获取类 ...
- 关于多个 Cookie 的分隔符这件事
对于 Cookie 的处理上,我最近遇到一个问题,那就是如何分割 Cookie 的内容.有人说是使用逗号分割,有人说是使用分号分割,究竟用哪个才是对的?其实这个答案是需要分为两个过程,分别是请求和响应 ...
- dotnet 在 UOS 国产系统上使用 MonoDevelop 创建 GTK 全平台带界面应用
本文告诉大家如何在 UOS 国产系统上开始使用 MonoDevelop 开发,通过创建 GTK# 应用,进入界面开发的第一步 在开始之前需要小伙伴先安装好 MonoDevelop 工具 安装完成之后, ...
- 2019-10-14-云之幻-UWP-视频教程
title author date CreateTime categories 云之幻 UWP 视频教程 lindexi 2019-10-14 21:8:26 +0800 2019-10-14 21: ...
- python01-03作业
# 小球落地,一共运动了多少米 hight = 100 # 原始高度 distance = 0 # 和 for i in range(10): # 将 下落 高度加入到 和 中 distance += ...
- NetCore开发第一步 Log4Net日志引入
1.新建一个带mvc模板的项目: 2.引入Microsoft.Extensions.Logging.Log4Net.AspNetCore包,不要引入错了. 引入后后包的结果如下: 3.Startup类 ...