我们提供安全,免费的手游软件下载!
上一章节我们了解了一下
Semantic Kernnel
中
Plugins
插件的概念以及学习了的 S
emantic Kernel
模板插件的创建,本章节我们来学习
Native Plugins
原生函数插件使用。
在之前的章节中我们介绍过在在 Semantic Kernel 中应用 Function Calling,在文中讲解了
Functioncalling
的概念,以及在
SK
中的应用。在
Semantic Kernel
中定义
Native Plugins
函数插件,和
gpt-3.5-turbo
在 6 月 13 日 发布的
Function Calling
特别的像,这是通过增加外部函数,通过调用来增强 OpenAI 模型的能力。
在
Semantic Kernerl
中提供了很多定义
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.ImportPluginFromType
这就是刚才说的根据类型来创建
SK
插件
var getWeatherFunc = kernel.Plugins.GetFunction(nameof(WeatherPlugin), WeatherPlugin.GetWeather);
var weatherContent = await getWeatherFunc.InvokeAsync(kernel, new() { ["city"] = "北京" });
Console.WriteLine(weatherContent.ToString());
这是手动调用的方式当然也可以
IChatCompletionService
会话模式自动调用。
主要用到了
ImportPluginFromObject
这个扩展方法
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
var rootProvider = services.BuildServiceProvider();
FinefoodPlugin finefoodPlugin = rootProvider.GetRequiredService
kernel.ImportPluginFromObject(finefoodPlugin);
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
KernelReturnParameterMetadata? returnParameter = null)
{
Verify.NotNull(kernel);
Verify.NotNull(method);
return KernelFunctionFactory.CreateFromMethod(method.Method, method.Target, functionName, description, parameters, returnParameter, kernel.LoggerFactory);
}
创建一个根据城市名获取游玩地点的插件
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
的功能,增强模型的能力。
参考文献
开启大模型的技能之门 - Plugins
示例代码
本文源代码
热门资讯