Semantic Kernel(简称SK)是微软推出并开源的AI编排框架,最初为C#设计,后来补齐了Python SDK。它的定位是连接大语言模型与传统业务代码之间的桥梁:开发者可以用熟悉的编程语言定义插件,让模型按需调用这些插件,从而实现规划、记忆、任务编排等能力。相比直接裸调OpenAI或Azure OpenAI的HTTP接口,SK把模型调用、函数注册、上下文管理这些琐碎工作抽象成了统一抽象层,代码结构清晰很多,也更容易在团队中维护。这篇文章将从核心概念讲起,再用C#和Python分别给出可运行的实践示例,最后聊聊企业落地时的设计要点。

一、Semantic Kernel的核心架构与关键概念
理解SK的关键在于搞清楚几个核心对象之间的关系。最顶层的是Kernel,它是整个框架的中枢,负责管理AI服务连接、插件集合和依赖注入容器。你可以把Kernel想象成一个"管家",所有能力都挂载在它身上,需要什么就取什么。
第二个重要概念是插件(Plugin)。插件由函数组成,分两类:一类叫原生函数,就是普通的C#方法或Python函数,通过特性标注暴露给框架,执行速度和普通代码一样;另一类叫语义函数,本质是一段自然语言提示词模板,运行时交给模型解释执行,输入变量通过{{$variable}}占位符注入。这两种函数在框架里地位完全平等,可以互相调用、互相组合,这是SK设计上很优雅的一点。
第三个概念是自动函数调用(Automatic Function Calling)。当你在调用模型时开启这个选项,模型返回的函数调用请求会被框架自动拦截并执行,执行结果再回传给模型继续推理,整个过程对开发者透明。这个机制取代了早期版本中独立的Planner组件,现在的做法更简洁,也更不容易出现规划失控的问题。
二、C#环境下的快速上手
在.NET项目中使用SK非常直接。先通过NuGet安装基础包和OpenAI连接器:
// 使用dotnet CLI安装
// dotnet add package Microsoft.SemanticKernel
// dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: "gpt-4o",
apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")!);
var kernel = builder.Build();
var result = await kernel.InvokePromptAsync("用一句话解释什么是AI编排框架");
Console.WriteLine(result);
上面的代码完成了最小可运行示例:创建内核、注册模型、调用提示词。接下来看插件的定义方式。假设我们有一个灯光控制插件,用KernelFunction特性标注方法即可:
public class LightPlugin
{
private readonly Dictionary<string, bool> _lights = new();
[KernelFunction("turn_on")]
[Description("打开指定房间的灯")]
public bool TurnOn([Description("房间名称")] string room)
{
_lights[room] = true;
return true;
}
[KernelFunction("get_status")]
[Description("查询指定房间灯的开关状态")]
public bool GetStatus([Description("房间名称")] string room)
{
return _lights.TryGetValue(room, out var on) && on;
}
}
// 注册插件并开启自动函数调用
kernel.Plugins.AddFromType<LightPlugin>("lights");
var settings = new OpenAIPromptExecutionSettings
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
var reply = await kernel.InvokePromptAsync(
"帮我打开客厅的灯,然后告诉我它的状态",
new(settings));
Console.WriteLine(reply);
这里有两个细节值得注意。一是Description特性非常重要,模型完全靠这些描述来判断何时调用、如何传参,描述写得含糊,调用就会出错。二是开启AutoInvokeKernelFunctions后,模型会自动选择并串联多个函数,代码里没有任何手动路由逻辑,这就是编排框架的价值所在。在企业项目中,Kernel通常通过IServiceCollection的扩展方法AddKernel()注册到依赖注入容器,配合ASP.NET Core使用时生命周期管理会很省心。
三、Python SDK的对应实践
Python版本的API风格与C#高度一致,习惯Python的开发者迁移成本很低。安装方式:
pip install semantic-kernel
下面用Python实现同样的灯光插件场景:
import asyncio
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.connectors.ai.function_call_behavior import FunctionCallBehavior
from semantic_kernel.functions import kernel_function
class LightPlugin:
def __init__(self):
self._lights = {}
@kernel_function(name="turn_on", description="打开指定房间的灯")
def turn_on(self, room: str) -> bool:
self._lights[room] = True
return True
@kernel_function(name="get_status", description="查询灯的状态")
def get_status(self, room: str) -> bool:
return self._lights.get(room, False)
async def main():
kernel = Kernel()
kernel.add_service(OpenAIChatCompletion(service_id="openai"))
kernel.add_plugin(LightPlugin(), plugin_name="lights")
settings = kernel.get_prompt_execution_settings_from_service_id("openai")
settings.function_call_behavior = FunctionCallBehavior.AutoInvokeKernelFunctions()
result = await kernel.invoke_prompt(
"帮我打开卧室的灯,然后告诉我它的状态",
settings=settings,
)
print(result)
asyncio.run(main())
可以看到,Python用装饰器kernel_function代替了C#的特性,用add_plugin实例方法代替了集合操作,其余流程几乎一一对应。两种SDK的差异主要体现在生态集成上:C#版本与Azure身份认证、Visual Studio工具链、Microsoft.Extensions.AI新抽象层结合更紧密;Python版本则更容易和FastAPI、Jupyter、数据处理库组合。如果你的团队既有.NET后端又有数据科学小组,SK的双语言支持正好可以让两边共享同一套插件设计规范。
四、企业落地时的设计建议
把SK引入生产系统,插件设计是第一道关卡。经验上有几条原则:每个函数保持单一职责,参数描述尽量精确到取值范围;对会修改数据的函数(下单、发消息、写库)要加确认环节,可以在函数内部先返回"待确认"结果由上层拦截;敏感操作不要直接暴露给模型,而是包一层带权限校验的中间函数。
第二是流式输出。聊天类应用如果一次性等完整回复,用户体验会明显割裂。SK对C#和Python都提供了IAsyncEnumerable风格的流式接口:
var chat = kernel.GetRequiredService<IChatCompletionService>();
var history = new ChatHistory();
history.AddUserMessage("给我写一段产品介绍文案");
await foreach (var chunk in chat.GetStreamingChatMessageContentsAsync(history))
{
Console.Write(chunk.Content);
}
第三是可观测性。模型调用链路上任何一环出错都可能导致回答质量下降却难以定位,建议开启SK自带的日志记录器,把每次函数调用、参数和token消耗写入结构化日志,方便后续做成本核算和问题回溯。此外,提示词模板建议放进独立目录按版本管理,而不是硬编码在代码里,这样运营人员调整话术时不需要重新发版。
最后提一句选型建议:如果你的系统以.NET为主,SK几乎是首选,微软官方维护力度大,与Azure OpenAI的集成开箱即用;如果团队是Python技术栈,SK与LangChain相比更轻量、侵入性更小,适合希望保持代码结构干净、逐步引入AI能力的项目。无论选择哪条路线,先把核心概念吃透,再动手搭插件体系,才能让AI编排真正为企业业务服务。
Semantic KernelAI编排框架C#与Python修改时间:2026-09-05 07:42:34