在 Semantic Kernel 中 IKernelBuilder.Plugins
有个方法 AddFromPromptDirectory
,Kernel
有个扩展方法 ImportPluginFromPromptDirectory
,请问它们的区别是什么?
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion("gpt-3.5-turbo", apiKey);
builder.Plugins.AddFromPromptDirectory("Plugins/DevOps");
var kernel = builder.Build();
kernel.ImportPluginFromPromptDirectory("Plugins/DevOps");
通过 Semantic Kernel 的源码找到了答案,这两个方法最终都调用了 CreatePluginFromPromptDirectory
AddFromPromptDirectory
将通过 CreatePluginFromPromptDirectory
创建的 KernelPlugin
注册到了依赖注入容器:
public static IKernelBuilderPlugins AddFromPromptDirectory(
this IKernelBuilderPlugins plugins,
string pluginDirectory,
string? pluginName = null,
IPromptTemplateFactory? promptTemplateFactory = null)
{
Verify.NotNull(plugins);
plugins.Services.AddSingleton<KernelPlugin>(services =>
CreatePluginFromPromptDirectory(pluginDirectory, pluginName, promptTemplateFactory, services));
return plugins;
}
ImportPluginFromPromptDirectory
将通过 CreatePluginFromPromptDirectory
创建的 KernelPlugin
添加到了当前 Kernel
实例的 KernelPluginCollection
中:
public static KernelPlugin ImportPluginFromPromptDirectory(
this Kernel kernel,
string pluginDirectory,
string? pluginName = null,
IPromptTemplateFactory? promptTemplateFactory = null)
{
KernelPlugin plugin = CreatePluginFromPromptDirectory(kernel, pluginDirectory, pluginName, promptTemplateFactory);
kernel.Plugins.Add(plugin);
return plugin;
}
所以它们的区别是:
AddFromPromptDirectory
将 plugin 实例注册到 KernelBuilder
,之后这个 KernelBuilder
创建的所有 Kernel
实例都会包含这个 plugin 实例ImportPluginFromPromptDirectory
只是在当前 Kernel
实例中添加 plugin