使用英语阅读

通过


了解内核

内核是语义内核的核心组件。 最简单的情况是,内核是一个依赖项注入容器,用于管理运行 AI 应用程序所需的所有服务和插件。 如果将所有服务和插件提供给内核,AI 会根据需要无缝使用它们。

内核位于中心

由于内核具有运行本机代码和 AI 服务所需的所有服务和插件,因此语义内核 SDK 中的几乎每个组件都使用它为代理提供支持。 这意味着,如果在语义内核中运行任何提示或代码,内核将始终可用于检索必要的服务和插件。

内核位于语义内核中所有内容的中心

这非常强大,因为它意味着你作为开发人员有一个可以配置和最重要的是监视 AI 代理的位置。 例如,从内核调用提示时。 执行此操作时,内核将...

  1. 选择最佳 AI 服务以运行提示。
  2. 使用提供的提示模板生成提示。
  3. 将提示发送到 AI 服务。
  4. 接收和分析响应。
  5. 最后,将 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 服务。