导读:本期聚焦于猫儿创作的《微软Semantic Kernel怎么用?企业级AI编排框架的C#与Python实战教程》,敬请观看详情。Semantic Kernel是微软开源的AI编排框架,它能让开发者在C#和Python项目中便捷地接入大语言模型,并把插件、记忆、规划器等能力组合成完整的企业级应用。本文将系统讲解Semantic Kernel的核心概念,包括Kernel对象、插件机制、函数调用链和插件市场生态,并通过可运行的代码示例演示如何在.NET与Python环境中初始化内核、注册原生函数与语义函数、实现多步任务编排。文章还会对比C#与Python两种SDK的使用差异,分析插件设计原则、依赖注入集成方式以及异步流式调用的最佳实践,帮助你在真实业务系统中落地可维护的AI能力编排方案。

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

微软Semantic Kernel怎么用?企业级AI编排框架的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

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260905/50766.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。