了解内核
内核是语义内核的核心组件。 最简单的情况是,内核是一个依赖项注入容器,用于管理运行 AI 应用程序所需的所有服务和插件。 如果将所有服务和插件提供给内核,AI 会根据需要无缝使用它们。
内核位于中心
由于内核具有运行本机代码和 AI 服务所需的所有服务和插件,因此语义内核 SDK 中的几乎每个组件都使用它为代理提供支持。 这意味着,如果在语义内核中运行任何提示或代码,内核将始终可用于检索必要的服务和插件。
这非常强大,因为它意味着你作为开发人员有一个可以配置和最重要的是监视 AI 代理的位置。 例如,从内核调用提示时。 执行此操作时,内核将...
- 选择最佳 AI 服务以运行提示。
- 使用提供的提示模板生成提示。
- 将提示发送到 AI 服务。
- 接收和分析响应。
- 最后,将 LLM 的响应返回到应用程序。
在整个过程中,可以创建在每个步骤中触发的事件和中间件。 这意味着你可以执行日志记录、向用户提供状态更新以及最重要的负责任的 AI 等操作。 全部从一个地方。
使用服务和插件生成内核
在生成内核之前,应首先了解存在的两种类型的组件:
组件 | 说明 | |
---|---|---|
1 | 服务 | 其中包括运行应用程序所需的 AI 服务(例如聊天完成)和其他服务(例如日志记录和 HTTP 客户端)。 这是在 .NET 中的服务提供程序模式之后建模的,因此我们可以支持跨所有语言的依赖项引入。 |
2 | 插件 | 这些组件由 AI 服务和提示模板用来执行工作。 例如,AI 服务可以使用插件从数据库检索数据或调用外部 API 来执行操作。 |
若要开始创建内核,请在文件顶部导入所需的包:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Plugins.Core;
接下来,可以添加服务和插件。 下面是如何添加 Azure OpenAI 聊天完成、记录器和时间插件的示例。
// Create a kernel with a logger and Azure OpenAI chat completion service
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(modelId, endpoint, apiKey);
builder.Services.AddLogging(c => c.AddDebug().SetMinimumLevel(LogLevel.Trace));
builder.Plugins.AddFromType<TimePlugin>();
Kernel kernel = builder.Build();
导入必要的包:
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.core_plugins.time_plugin import TimePlugin
接下来,可以创建内核。
# Initialize the kernel
kernel = Kernel()
最后,可以添加必要的服务和插件。 下面是如何添加 Azure OpenAI 聊天完成、记录器和时间插件的示例。
# Add the Azure OpenAI chat completion service
kernel.add_service(AzureChatCompletion(model_id, endpoint, api_key))
# Add a plugin
kernel.add_plugin(
TimePlugin(),
plugin_name="TimePlugin",
)
生成内核
内核可以使用 Kernel.builder()
.. 为此,可以添加所需的 AI 服务和插件。
Kernel kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletionService)
.withPlugin(lightPlugin)
.build();
使用依赖关系注入
在 C# 中,可以使用依赖关系注入来创建内核。 为此,需要创建 ServiceCollection
服务和插件并将其添加到其中。 下面是如何使用依赖关系注入创建内核的示例。
提示
建议将内核创建为暂时性服务,以便在每次使用后将其释放,因为插件集合是可变的。 内核非常轻量(因为它只是服务和插件的容器),因此,为每个使用创建新内核并不是性能问题。
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
// Add the OpenAI chat completion service as a singleton
builder.Services.AddOpenAIChatCompletion(
modelId: "gpt-4",
apiKey: "YOUR_API_KEY",
orgId: "YOUR_ORG_ID", // Optional; for OpenAI deployment
serviceId: "YOUR_SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
// Create singletons of your plugins
builder.Services.AddSingleton(() => new LightsPlugin());
builder.Services.AddSingleton(() => new SpeakerPlugin());
// Create the plugin collection (using the KernelPluginFactory to create plugins from objects)
builder.Services.AddSingleton<KernelPluginCollection>((serviceProvider) =>
[
KernelPluginFactory.CreateFromObject(serviceProvider.GetRequiredService<LightsPlugin>()),
KernelPluginFactory.CreateFromObject(serviceProvider.GetRequiredService<SpeakerPlugin>())
]
);
// Finally, create the Kernel service with the service provider and plugin collection
builder.Services.AddTransient((serviceProvider)=> {
KernelPluginCollection pluginCollection = serviceProvider.GetRequiredService<KernelPluginCollection>();
return new Kernel(serviceProvider, pluginCollection);
});
提示
有关如何在 C# 中使用依赖项注入的更多示例,请参阅 概念示例。
后续步骤
了解内核后,可以了解可向其添加的所有不同 AI 服务。