Semantic Kernel 框架中的 Kernel 对象

360影视 国产动漫 2025-05-13 19:23 2

摘要:Kernel是Semantic Kernel整个框架的核心组件,简单来说,Kernel是一个依赖注入DI容器,它负责管理运行 AI 应用所需的所有服务和插件。只要你将所有的服务和插件提供给Kernel,AI 就能在需要时无缝使用它们。,由于 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)等操作,而且所有这些都可以在一个统一的地方完成。

服务(Services)

包括 AI 服务(如聊天补全)和其他必要服务

(如日志记录、HTTP 客户端),用于运行应用程序。它遵循 .NET 的

Service Provider 模式,以支持跨语言的依赖注入(Dependency Injection)

插件(Plugins)

这些是 AI 服务和提示模板

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

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

usingMicrosoft.Extensions.DependencyInjection;
usingMicrosoft.Extensions.Logging;
usingMicrosoft.SemanticKernel;
usingMicrosoft.SemanticKernel.Plugins.Core;

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

// 创建一个kernel使用logger和Azure OpenAI聊天服务
varbuilder = Kernel.CreateBuilder;
builder.AddAzureOpenAIChatCompletion(modelId, endpoint, apiKey);
builder.Services.AddLogging(c => c.AddDebug.SetMinimumLevel(LogLevel.Trace));
builder.Plugins.AddFromType;
Kernel kernel = builder.Build;

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

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


usingMicrosoft.SemanticKernel;

varbuilder = 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( =>newLightsPlugin);
newSpeakerPlugin);

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

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

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

returnnewKernel(serviceProvider, pluginCollection);
});

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

来源:opendotnet

相关推荐