Semantic Kernel 框架中的 Kernel 对象

Kernel介绍

Kernel是Semantic Kernel整个框架的核心组件,简单来说,Kernel是一个依赖注入DI容器,它负责管理运行 AI 应用所需的所有服务和插件。只要你将所有的服务和插件提供给Kernel,AI 就能在需要时无缝使用它们。,由于 Kernel 拥有运行本地代码和AI服务所需的所有服务和插件,因此它几乎被SK SDK 中的所有组件使用,以支持你的AI-Agents。这意味着,无论你在SK中运行提示-prompt还是code,Kernel 都会始终可用,并自动检索和调用所需的服务和插件。

这非常强大,因为作为开发者,你可以在一个地方完成 AI 代理的配置和监控。

举个例子,当你在 Kernel 里调用一个 Prompt 时,内核会自动执行以下步骤:

第一步:选择AI服务

图示:在Kernel里,AI服务的选择发生在 "Select AI Service"这一阶段。
描述:Semantic Kernel先决定使用哪一个AI模型,如OpenAI或Azure AI。
特性:支持 "Model Selection",确保调用最合适的AI。

第二步:渲染Prompt

图示:Render Prompt阶段是 Prompt 模板化(Templatization)。
描述:Semantic Kernel负责基于预定义的Prompt模板,动态填充变量,使Prompt适配当前任务。
特性:在这个阶段支持Prompt参数化(Parameterization),便于在不同场景中复用和自定义Prompt。

第三步:调用AI服务

图示:Invoke AI Service直接调用 OpenAI、Azure AI 等服务,并处理其响应。
描述:当Prompt准备就绪,Semantic Kernel将其发送到AI模型进行推理。
特性:在这个阶段提供可靠性保障(Reliability),以确保调用稳定。

第四步:解析LLM响应

图示:Parse LLM Response负责将AI生成的原始数据解析成人类可读格式。
描述:Semantic Kernel负责解析AI生成的结果,并准备返回到应用程序。
特性:这个阶段支持遥测和监控(Telemetry and Monitoring),方便开发者跟踪AI响应。

第五步:创建函数结果

图示:Create Function Result代表最终返回的结果,供应用程序使用。
描述:Semantic Kernel将解析后的数据整理成合适的格式并返回给你的应用。
特性:在这里,开发者可以加入Responsible AI机制,比如过滤不合适的内容,确保AI负责任地运行。

在整个过程中,你可以创建事件(events)和中间件(middleware),它们会在每个步骤被触发。这意味着你可以执行诸如日志记(logging)向用户提供状态更新,以及最重要的——确保负责任的AI(Responsible AI)等操作,而且所有这些都可以在一个统一的地方完成。

创建Kernel

组件描述
服务(Services)

包括 AI 服务(如聊天补全)和 其他必要服务(如日志记录、HTTP 客户端),用于运行应用程序。它遵循 .NET 的 Service Provider 模式,以支持跨语言的 依赖注入(Dependency Injection)

插件(Plugins)

这些是 AI 服务和提示模板 用于执行任务的组件。例如,AI 服务可以使用插件从数据库检索数据或调用外部 API 以执行操作。

在你的项目中导入如下包并创建Kernel:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Plugins.Core;

接下来,你可以添加 服务(Services) 和 插件(Plugins)。下面是一个示例,展示如何添加 Azure OpenAI 聊天补全(chat completion)、日志记录(logger) 和 时间插件(time plugin)

// 创建一个kernel使用logger和Azure OpenAI聊天服务
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();

依赖注入

在 C# 中,你可以使用依赖注入(DI)来创建Semantic Kernel。其核心步骤是 创建 ServiceCollection,然后向其中添加所需的服务和插件。

建议:官方建议将 Kernel 作为 瞬态(Transient)服务 创建,使其在每次使用后自动释放,因为 插件集合(Plugin Collection)是可变的。Kernel 本身非常轻量(本质上只是一个 服务和插件的容器),因此 每次使用时创建一个新的 Kernel 并不会对性能造成影响。

using Microsoft.SemanticKernel;

var builder = Host.CreateApplicationBuilder(args);

// 添加 OpenAI chat completion service 作为单例模式
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
);

// 针对插件创建单例模式
builder.Services.AddSingleton(() => new LightsPlugin());
builder.Services.AddSingleton(() => new SpeakerPlugin());

/*
serviceProvider.GetRequiredService<LightsPlugin>() 从DI容器中获取已经创建的LightsPlugin实例。
KernelPluginFactory.CreateFromObject(...)将插件转换成KernelPlugin,使其能在 KernelPluginCollection 中使用。
KernelPluginCollection 只是在管理 DI 容器中已经存在的插件,而没有创建新的插件对象
*/
builder.Services.AddSingleton<KernelPluginCollection>((serviceProvider) => 
    [
        KernelPluginFactory.CreateFromObject(serviceProvider.GetRequiredService<LightsPlugin>()),
        KernelPluginFactory.CreateFromObject(serviceProvider.GetRequiredService<SpeakerPlugin>())
    ]
);

// 最后,创建一个Kernel服务使用ServiceProvider和插件集合

builder.Services.AddTransient((serviceProvider)=> {
    KernelPluginCollection pluginCollection = serviceProvider.GetRequiredService<KernelPluginCollection>();

    returnnew Kernel(serviceProvider, pluginCollection);
});

总结

Kernel是Semantic Kernel框架的核心组件,作为依赖注入容器,管理AI应用所需的所有服务和插件。它支持AI服务选择、Prompt渲染、调用AI服务、解析响应和创建结果。通过依赖注入,可以轻松添加服务和插件,确保AI应用的高效运行和管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值