Semantic Kernel(SK)是微软开源的企业级 LLM 应用与 Agent 编排框架,定位是把 AI 能力嵌入现有软件系统。它解决的核心问题是:直接用模型 SDK 开发 Agent 时,代码没有统一抽象,模型服务、工具调用、流程编排、安全审计都散落在各处,项目越大越难维护。SK 以 Kernel(内核,即服务与插件容器)为中心,把大模型、原生代码函数、提示词模板统一为可组合的「插件」,并提供 Agent 编排、进程框架、过滤器、遥测等生产级组件,让团队在一个明确的工程结构里构建企业级 AI 应用。 SK 有 .NET、Python、Java 三套官方 SDK,与微软生态(Azure OpenAI、Azure AI Foundry、Copilot 相关服务)深度集成;1.x 版本后 API 趋于稳定,是微软技术栈团队构建 Agent 的首选框架之一。本文按「速览 → 安装 → 上手 → 能力 → 部署 → 选型 → 场景 → 避坑」的顺序,带你从零跑通并进入生产。
掌握 Semantic Kernel,意味着你能在 .NET/Java/Python 企业技术栈中直接落地 Agent 编排、流程自动化与多模型接入,是微软生态 AI 工程岗位的核心技能之一。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 Semantic Kernel:直连模型 SDK 的后期成本太高
传统 LLM 应用开发往往从直接调用 OpenAI/Azure OpenAI SDK 开始:写一个 prompt、接一次工具调用、调一次接口。这种方式的痛点在项目扩展时集中爆发——第一,模型服务被硬编码在业务代码里,换模型或接入多模型要改多处;第二,工具调用逻辑散落各处,没有统一的「能力注册表」,Agent 不知道该调用哪些函数;第三,日志、审计、敏感信息过滤完全没有抓手;第四,多步骤业务流程(如审批流、订单处理)缺少可编排、可恢复的状态机,只能靠手写胶水代码。
Semantic Kernel 的解法是把「模型服务」和「业务能力」都收编进 Kernel:所有 AI 服务作为 Service 注册,所有可被调用的能力作为 Plugin(插件)注册,提示词模板与非本机函数统一抽象为 KernelFunction。这样 Agent 只需要面对 Kernel 一个入口,函数的调用由模型根据描述自动选择;同时 Filters(过滤器)能在函数调用前后拦截流量,Process(进程框架)能把业务定义成可视化、可持久化的流程图,Telemetry 让遥测直接对接应用偏好系统(Application Insights / OpenTelemetry)。
与 LangChain 等框架相比,SK 的气质更「企业工程化」:强类型、强调依赖注入、三语言官方支持齐头并进,对存量 .NET/Java 系统的接入路径最短。它不追求编排花样最多,而是追求「在现有企业软件里可靠地跑起来」。
安装与环境配置:3 步就绪
第一步·安装 SDK。 按技术栈选择,Python 环境需 3.9+,.NET 需 6.0+。
第二步·配置模型凭据。 SK 不绑定密钥存储,推荐通过环境变量或 .env 文件注入。以 OpenAI 为例:
第三步·验证安装。 能导入并打印版本号即成功:
# Pythonpip install semantic-kernel # .NETdotnet add package Microsoft.SemanticKernel # Java(Maven 坐标)# com.microsoft.semantic-kernel:semantic-kernel-core
# .envOPENAI_API_KEY=sk-xxxx# 若走 Azure OpenAI,则配置# AZURE_OPENAI_API_KEY=azure-xxxx# AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
python -c "import semantic_kernel; print(semantic_kernel.__version__)"快速上手:5 分钟跑通第一个 Skill
最小可用流程的核心思路是三步——「建 Kernel、注册模型、调函数」。在代码里依次完成:
1. 创建 Kernel 实例(统一的依赖入口);
2. 通过 Kernel.add_service 注册一个聊天补全服务(OpenAI 或 Azure OpenAI 连接器);
3. 用 Kernel.add_function 定义一个提示函数(prompt template,模板支持 {{$input}} 参数),并用 await kernel.invoke 调用。
运行后输出一句对 Semantic Kernel 的解释,说明管道跑通了。进阶技巧:将 OpenAIChatCompletion 换成 AzureChatCompletion(需填 endpoint、api_key、deployment_name),即可无缝迁移到 Azure OpenAI;后续给 Kernel 注册自定义的 @kernel_function 原生函数,即拥有工具调用能力。
import asyncioimport osfrom semantic_kernel import Kernelfrom semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion async def main(): kernel = Kernel() # 1. 注册模型服务 kernel.add_service( OpenAIChatCompletion( service_id="chat", ai_model_id="gpt-4o-mini", api_key=os.getenv("OPENAI_API_KEY"), ) ) # 2. 定义提示函数 func = kernel.add_function( plugin_name="demo_plugin", function_name="ask", prompt="请用一句话解释:{{$input}}", ) # 3. 调用 result = await kernel.invoke(func, input="什么是 Semantic Kernel?") print(result) if __name__ == "__main__": asyncio.run(main())
核心能力详解:5 大支柱
支柱一·Kernel 与依赖注入。 Kernel 是所有服务的注册中心,承载 AI 服务(ChatCompletionService)、插件集合、过滤器与日志。在 .NET 中,SK 原生对接 IServiceCollection,可把 Kernel 注册为单例或作用域服务;Python/Java 亦有对应的内核构建器。合理设计 Kernel 生命周期,是生产应用稳定性的基础。
支柱二·插件系统(Plugins)。 插件是一组相关函数的集合。函数分两类:原生函数(Native Function)由代码实现,标注 @kernel_function 装饰器后自动暴露给模型;提示函数(Prompt Function)由提示词模板 + 参数化输入定义。二者的命名规范是 PluginName_FunctionName,模型通过函数名和描述决定是否调用,因此「给函数写清楚描述」直接影响 Agent 的调用准确率。
支柱三·Agent 编排(Agent Framework)。 1.x 提供 ChatCompletionAgent(单 Agent 助手)、AgentGroupChat(多 Agent 群聊协作)以及 OpenAI Assistant 集成。多个 Agent 可以在一个会话里协同:一个负责检索、一个负责总结、一个负责审核,托管与路由由 SK 处理。该模块部分 API 处于实验性阶段,引入前需评估稳定性。
支柱四·Process 进程框架。 面向确定性业务流的编排层:用 ProcessBuilder 把流程定义为「步骤 + 事件」图,每一步可持久化状态,支持暂停、恢复与分布式执行。适合订单审批、工单流转、数据处理管线等既要 AI 决策又必须可审计、可回溯的场景。
支柱五·Filters 与遥测。 Filters 是 1.x 的生产级关键组件:可在函数调用前/后、提示词渲染后等时机注入钩子,做鉴权、敏感信息脱敏、调用日志、限流与降级。遥测层内置 ActivitySource,通过 OpenTelemetry 或 Application Insights 直接采集 token 消耗与调用延迟,无需埋点改造。
生产部署与监控:从上线到运维
部署方式一·容器化 + DI 生命周期管理。 SK 应用通常打包为 Docker 镜像部署到 AKS / Azure Container Apps / 自建 K8s。.NET 团队应把 Kernel 注册为作用域服务(Scoped),避免单例 Kernel 长时间持有模型连接导致的内存问题;若用 Python,则需关注 asyncio 事件循环与 Kernel 实例的绑定关系,避免多线程共享同一实例。
部署方式二·模型服务路由与成本控制。 生产环境一般同时接入多个模型(便宜的快模型做分类、强模型做复杂推理)。在 Kernel 中注册多个 ChatCompletionService 时,必须为每个服务设置唯一的 service_id,调用时显式指定,否则框架会按顺序随机路由。成本侧可通过 Filters 记录每次调用的 token 数,结合用量阈值触发告警或降级。
可观测性。 将 SK 的遥测导出到 Application Insights 或 Prometheus + Grafana:关注三个指标——调用成功率、P95 延迟、每次 Agent 任务的 token 消耗。Filters 中统一打印 Prompt 摘要与函数调用链,能在出问题时快速复现 Agent 的决策路径。
<p class="para-label">避坑清单:</p>
<ul class="dash-list"><li>坑1:实验性 API 直接上生产——1.x 中 Agent 与 Process 部分 API 标注 experimental,上线前必须锁定版本并核对 API 稳定性说明,否则升级会破坏行为。</li><li>坑2:API Key 硬编码——SK 默认不校验密钥来源,建议统一从环境变量/托管身份(Azure Managed Identity)读取,并在 Filter 中拦截含密钥的日志输出。</li><li>坑3:多服务未指定 service_id——注册多个 AI 服务但不写明 service_id 时,调用可能路由到错误模型,导致格式或成本失控。</li><li>坑4:函数名与描述随意——插件函数命名冲突会覆盖注册;函数描述太模糊会让模型选择错误工具,必须遵循 PluginName_FunctionName 规则并写好描述。</li><li>坑5:忽略 Kernel 生命周期——将 Kernel 注册为单例却持有短作用域的 HttpClient 或数据库上下文,会造成连接池耗尽,需按 DI 规范选择作用域。</li></ul>
| 维度 | Semantic Kernel | LangChain | AutoGen | LlamaIndex |
|---|---|---|---|---|
| 定位 | 企业级 Agent 编排框架 | LLM 应用开发框架 | 多 Agent 对话协作框架 | 数据连接与 RAG 框架 |
| 编排范式 | Kernel 中心化 + 插件 + Process 流程 | 链式/图式(LangGraph) | 多 Agent 对话式编排 | 查询管道(Query Pipeline) |
| 类型约束 | 强类型,三语言齐头并进 | 动态类型为主,重点支持 Python | 类型宽松,实验性 API 多 | 类型宽松,数据对象为核心 |
| 学习曲线 | 中等,.NET 工程师上手快 | 低到中等,社区资料丰富 | 中等偏高,需理解多 Agent 模式 | 较低,聚焦数据与索引 |
| 生态集成 | 微软体系(Azure/Office/Dynamics) | 第三方集成极多、泛生态 | 微软与开源社区双轨 | 数据源与向量库覆盖广 |
| 生产部署 | Filters/遥测/DI 完备,企业级 | 社区模板多,生产级需自行组装 | 多数能力处于研究到生产过渡 | RAG 检索性能强,编排较弱 |
| License | MIT | MIT | MIT + 部分附加条款 | MIT |
| 适合谁 | 微软技术栈企业、强工程约束团队 | Python 快速原型、生态丰富度优先 | 多 Agent 研究、复杂对话协作 | RAG 场景、数据密集型应用 |
选型建议:若团队以 .NET/Java 为主或重合规审计,首选 Semantic Kernel;若纯 Python 生态且追求第三方集成广度,LangChain 更灵活;若核心诉求是把知识库做深做透,LlamaIndex 的检索链路更成熟;若方向是开放性的多 Agent 探索实验,AutoGen 值得关注。
版本迭代
Semantic Kernel 从 2023 年初的公开预览走到 1.x,主线是「概念收敛」与「生产化」——先是把 Skills/Planner 重构为 Kernel/Plugins/Functions,随后从流程编排延伸到 Agent 与 Process 框架,最后补齐 Filters 与遥测。整体演进方向是从「能跑」到「能上生产」。(截至训练数据,可能已有更新版本)
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| v0.x 预览系列 | 2023-03 | 公开预览 | 引入 Kernel、Skills(早期插件概念)与 Planner |
| v1.0 | 2023-12 | 首个正式版(GA) | 统一 Kernel/Plugins/Functions 命名体系;.NET、Python、Java 三语言 API 基线稳定 |
| v1.5 | 2024-06 | 模板与连接器升级 | 新增 Handlebars 提示词模板支持;扩展 OpenAI、Hugging Face、Ollama 等连接器 |
| v1.10 | 2024-10 | Agent 编排能力增强 | ChatCompletionAgent、AgentGroupChat 等实验性组件逐步成熟 |
| v1.16 | 2025-02 | 生产特性完善 | Filters 机制完善、遥测与 DI 生命周期优化、多模型路由能力提升 |
| 基准 | v1.0 | v1.10 | v1.16 | |
|---|---|---|---|---|
| API 兼容性(回退测试) | — | — | 保持 1.x 兼容 | SK 官方承诺 1.x 范围内保持 API 向后兼容 |
| 模型能力评测(MMLU 等) | — | — | — | 框架而非模型,官方不发布此类评测数据 |
作为开发框架,SK 不以模型智商作为评测指标,版本差异体现在工程能力——v1.0 打稳基础,v1.5 丰富模板与连接器,v1.10 补齐 Agent 编排,v1.16 完善生产要素。选型时建议锁定 1.x 最新稳定版,优先使用非 experimental 的 API;需要多 Agent 群聊等新能力时,再单独评估实验性 API 的承接方案。
AI 应用场景
企业业务流程自动化:工单智能处理管线
阶段:Agent 编排与确定性流程编排
解决的问题:传统工单系统靠人工分类、转发、回复,跨部门流转慢且标准不一。基于 SK 的 Process 框架,将「工单分类 → 知识检索 → 拟稿 → 人工审核」定义为持久化流程,AI 负责前三步,人只做最终确认。
具体案例:某 IT 服务台用 SK + Azure OpenAI 构建工单助手,接入企业知识库插件:模型自动分类工单并生成回复草稿,处理时长从分钟级降至秒级,人工只需审核少量复杂工单,审核工作量的下降直接转化为人力释放。
企业知识问答助手:多 Agent 协作的 RAG 应用
阶段:RAG 管道与多 Agent 协作
解决的问题:大型企业内部文档分散、检索不精准,单一模型无法同时处理「查资料 + 做总结 + 核对出处」。SK 中多个 Agent 分工协作:检索 Agent 负责查向量库,总结 Agent 负责组织答案,审核 Agent 负责比对引用来源。
具体案例:在合规性要求高的场景(如法律、医疗),通过 AgentGroupChat 让审核 Agent 在回复前强制校验引用来源,未通过则打回重写,显著降低大模型幻觉带来的风险,团队将误引用率控制在可接受范围。
Copilot 式应用内助手:把 AI 嵌入存量业务系统
阶段:AI 应用集成与工具调用
解决的问题:业务系统(如 CRM、ERP)需要内嵌 AI 助手,但历史代码改造风险大。SK 原生支持在现有 .NET/Java 服务中嵌入 Kernel,将内部业务 API 包装为插件函数,AI 助手通过函数调用完成查询与操作,不需要重写系统。
具体案例:在销售管理系统中注册「查客户」「查订单」「查库存」三个原生插件,Copilot 助手即可用自然语言完成数据查询与简单分析,页面/接口零改动,接入成本以周为单位。
常见误区
误区Semantic Kernel 是微软出品的,所以只能用 C#/.NET,我们用 Python 或用 Java 就没法用。
正解SK 从 1.0 起就官方提供三套并行 SDK:.NET、Python、Java,都走同一套 Kernel/Plugins/Functions 抽象,API 风格与概念保持一致。微软官方文档与示例库对三语言均有覆盖。Python 团队完全可以正规使用 SK,Java 团队也可用它接入现有微服务。
为何常见:因为 SK 常与 Azure/.NET 生态捆绑宣传,且早期预览版以 C# 为主,导致「仅限 C#」的印象先入为主。
误区LangChain 和 Semantic Kernel 都是 LLM 编排框架,谁火用谁,结果一样。
正解两者抽象与生态差异明显。SK 围绕 Kernel 做统一依赖管理,强类型、强 DI、三语言同步,与微软企业栈整合最深;LangChain 以 Python 社区为中心,第三方集成数量和社区内容量更大,但「框架厚度」不深。SK 的价值在工程秩序与生产能力(Filters、遥测、Process),LangChain 的优势在生态广度与原型速度。
为何常见:二者主页示例都展示「调模型、调工具」,表层相似;只有真正做生产部署才会体会到抽象层的差异。
误区Kernel 就是把 OpenAI SDK 包了一层,方便切换模型而已,没什么技术含量。
正解Kernel 远不止封装调用:它是整个 SK 应用的依赖容器,管理 AI 服务注册、插件发现、函数调用路由、过滤器管线、日志与遥测。所有工具调用、函数执行、流程状态都经 Kernel 中转,因此才有横切能力(安全审计、限流、监控)的落点。
为何常见:最小示例里 Kernel 只做「加服务 + 调用」,看起来确实像网关;但 Filter/Plugin 的组合能力只有在复杂场景才体现。
误区SK 有 Planner,给它一个目标,它自己就能拆解步骤、调用函数、搞定所有事。
正解Planner(或函数调用机制)依赖两个前提:一是工具函数的描述足够清晰,二是模型能正确理解目标。任务越复杂,自动拆解的错误率越高。对强确定性流程,SK 官方更推荐 Process 框架显式定义步骤图;Planner 适合开放探索但必须兜底校验与人工确认。
为何常见:框架演示时常展示「一句目标自动多步执行」的效果,让人误以为这是可靠的生产行为,忽略了成功概率与兜底设计。
误区SK 是微软的,只能接 OpenAI 或 Azure OpenAI,用开源模型/国内模型不行。
正解SK 的模型接入通过连接器(Connector)抽象,官方已提供 OpenAI、Azure OpenAI、Hugging Face、Ollama、Google Gemini、Mistral 等十余种连接器,社区也在补充更多模型接入。只要实现对应的 ChatCompletion 接口,任何模型都能注册进 Kernel。
为何常见:官方示例几乎全用 OpenAI/Azure OpenAI,给人「官方绑定」的错觉;实际连接器是开放的插件式设计。
面试题
Q1. Semantic Kernel 官方支持的主要开发语言是?
- A.C#、Python、Java← 正确答案
- B.C#、PHP、Swift
- C.Python、Go、Rust
- D.Java、JavaScript、Ruby
答案:A。SK 自 1.0 起官方同步维护 .NET、Python、Java 三套 SDK,统一 Kernel/Plugins/Functions 概念。B、C、D 中出现的 PHP、Go、Rust、JavaScript、Ruby 均非 SK 官方主要支持语言。
Q2. 在 Semantic Kernel 中,Kernel 对象可以注册哪些内容?
- A.AI 服务(ChatCompletionService)← 正确答案
- B.插件集合(Plugins)← 正确答案
- C.操作系统内核参数
- D.过滤器(Filters)← 正确答案
答案:ABD。Kernel 是 SK 的依赖容器,承载 AI 服务、插件与过滤器,用于统一管理模型调用和工具函数。操作系统内核参数与 SK 的 Kernel 无关,属于干扰项。
Q3. 在 Python 中安装 Semantic Kernel 的标准命令是?
- A.pip install semantic-kernel← 正确答案
- B.pip install sk
- C.pip install ms-semantic
- D.pip install kernel-ai
答案:A。PyPI 官方包名为 semantic-kernel,pip install semantic-kernel 是标准安装命令。sk、ms-semantic、kernel-ai 均非 SK 官方包名,安装会得到无关或错误的包。
Q4. Semantic Kernel 的开源协议是?
- A.MIT← 正确答案
- B.Apache 2.0
- C.GPL 3.0
- D.MPL 2.0
答案:A。SK 采用 MIT 协议,允许商用、修改与再分发,限制极少。Apache 2.0、GPL 3.0、MPL 2.0 都是其他项目常见协议,不是 SK 的 License。
Q5. 在 .NET 项目中引入 Semantic Kernel 的正确命令是?
- A.dotnet add package Microsoft.SemanticKernel← 正确答案
- B.dotnet add package SemanticKernel.Core
- C.dotnet add package MS.SK.Runtime
- D.dotnet add package Azure.AI.Kernel
答案:A。NuGet 官方包名为 Microsoft.SemanticKernel,元包直接引入核心能力。SemanticKernel.Core、MS.SK.Runtime、Azure.AI.Kernel 都不是官方包名,无法正确安装。
Q6. 使用命令提示词 "请解释:{{$input}}" 注册的函数属于哪种类型?
- A.提示函数(Prompt Function)← 正确答案
- B.原生函数(Native Function)
- C.自动函数(Auto Function)
- D.外部回调函数(Callback Function)
答案:A。用提示词模板定义、通过模板语法接收输入的函数是提示函数。原生函数是用代码实现并用 @kernel_function 标注的函数;SK 中没有「自动函数」「外部回调函数」的官方类型。
Q7. 原生函数(Native Function)与提示函数(Prompt Function)的核心区别是?
- A.原生函数用代码实现并标注特性,提示函数用提示词模板定义,二者均注册为插件函数← 正确答案
- B.原生函数只能被 C# 调用,提示函数只能被 Python 调用
- C.原生函数不支持参数,提示函数支持参数
- D.提示函数不需要模型参与,原生函数需要模型参与
答案:A。两类函数都通过 Kernel 注册并由模型按描述选择调用。原生函数是代码逻辑(强类型、可复用),提示函数是模板文本(灵活、易调整)。B、C、D 对两者能力的描述均与官方定义不符。
Q8. 在 Kernel 中注册多个 AI 服务时,正确的做法包括?
- A.为每个服务设置唯一的 service_id← 正确答案
- B.调用时显式指定要使用的服务← 正确答案
- C.不设置 service_id,让框架随机路由
- D.只保留一个服务并删除其他注册
答案:AB。多服务注册时必须用唯一 service_id 区分,并在调用时显式指定,否则框架按默认顺序选择可能路由错误模型。随机路由(C)在多模型生产环境会造成不可控;删除其他服务(D)会失去多模型路由的能力。
Q9. 关于 Semantic Kernel 的 Process 框架,下列说法正确的是?
- A.用 ProcessBuilder 定义步骤与事件图,支持状态持久化与恢复← 正确答案
- B.只能用于单机内存中的简单流程
- C.是替代 LLM 的确定性规则引擎
- D.只能与 Azure Durable Functions 配合使用
答案:A。Process 框架以「步骤 + 事件」构建流程图,步骤状态可持久化,支持分布式执行与恢复,适合审批流转等确定性业务流程。它不替代 LLM,也不绑定 Durable Functions,本地及容器环境均可运行。
Q10. 下列哪些属于 SK 1.x 的生产级特性?
- A.Filters 在函数调用前后拦截流量以做审计与限流← 正确答案
- B.内置 ActivitySource 通过 OpenTelemetry 导出遥测← 正确答案
- C.自动将全部业务代码改写为异步流
- D.通过依赖注入管理 Kernel 与服务的生命周期← 正确答案
答案:ABD。Filters、遥测、DI 生命周期管理是 SK 面向生产环境提供的关键能力。C 是错误干扰项:SK 不自动改写业务代码,异步化是开发者通过 async/await 自己完成的。
参考来源
- webpageNuGet Microsoft.SemanticKernel.NET 包说明、版本与依赖信息