探究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
常用的办法,还有一些用法,比方
ImportPluginFromApiManifestAsync
OpenAPI 功用相关
ImportPluginFromOpenAIAsync
经过 OpenAI 的 ChatGPT 格局为 OpenAI 插件创立一个插件CreatePluginFromOpenApiAsync
从 OpenAPI v3 端点创立插件ImportPluginFromGrpcFile
从 gRPC 文档导入- 其他
最终
本章咱们学习了在 Semantic Kernel
中运用 Native Plugins
原生函数插件的办法,包含经过函数界说插件和依据目标创立插件的过程。咱们探讨了不同的创立插件的办法,以及怎么注册插件并进行调用。经过这些办法,咱们能够扩展 Semantic Kernel
的功用,增强模型的才能。
参考文献
- 敞开大模型的技术之门 - Plugins
示例代码
本文源代码