在 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