大语言模型(LLM)正在从“技术热点”走向“业务刚需”。但对大多数 .NET 团队来说,直接调用模型 API 往往会陷入各种工程细节:手动拼 Prompt、解析 JSON、处理流式输出、做限流和重试……一旦模型需要切换,比如从海外模型迁移到国产通义千问,往往就意味着要重写一整套集成逻辑。

Semantic Kernel 的出现,正是为了解决这种“集成复杂度”的问题。

它并不是一个模型,也不是一个平台,而是微软开源的一套轻量级 SDK,专为 .NET 开发者设计。它的核心理念很简单:把 AI 能力当作可编程的服务,而不是不可控的黑盒 API。通过插件化、声明式、可测试的抽象,让业务逻辑与模型能力解耦,从而真正做到低门槛、高可靠、易维护的 AI 集成。

核心设计:三层架构,各司其职

Semantic Kernel 的整体结构非常清晰,分为三个层级。

最上层是插件(Plugins)。插件本质上就是普通的 .NET 类,通过 [KernelFunction] 特性标记其中的方法为“可被 AI 调用的能力”。这些方法既可以是纯 C# 逻辑(例如查数据库、调设备接口),也可以是带自然语言提示的“语义函数”。Kernel 会自动发现这些方法,并在需要时将用户请求路由到对应的函数。

中间层是编排引擎(Orchestration Layer)。这是整个系统的“大脑”。当用户提出问题时,它会自动判断是否需要调用插件、调用哪个插件、参数如何提取、结果如何整合。整个过程对开发者透明,无需自己实现工具选择、函数调用和结果拼接。

最底层是连接器(Connectors),负责对接具体的大模型服务。官方原生支持 Azure OpenAI、Hugging Face,而通义千问由于提供了 OpenAI 兼容接口,也可以无缝接入。这意味着同一套业务插件,未来可以平滑迁移到不同模型,实现真正的“一次开发,多端适配”。

实战:在 .NET 8 中接入通义千问

整个接入过程非常简单,只需要三步。

创建项目并安装依赖

dotnet new console -n SkDemo
cd SkDemo

dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI

虽然目标模型是通义千问,但由于它提供了 OpenAI 兼容接口,因此可以直接复用官方的 OpenAI 连接器,稳定且无需额外维护。

配置 Kernel 使用 DashScope 兼容端点

var builder = Kernel.CreateBuilder();

builder.AddOpenAIChatCompletion(
    modelId: "qwen-max",     // 可选 qwen-turbo / qwen-plus
    apiKey: "sk-xxx",        // 替换为你的 DashScope API Key
    endpoint: new Uri("https://dashscope.aliyuncs.com/compatible-mode/v1")
);

var kernel = builder.Build();

需要注意几点: 端点必须使用 /compatible-mode/v1 路径,这是 DashScope 提供的 OpenAI 兼容入口; 模型 ID 直接写 qwen-max 即可; 常见的 max_tokenstemperaturetop_p 等参数也都可以正常使用。

发起调用

var result = await kernel.InvokePromptAsync("用一句话解释‘零拷贝序列化’");
Console.WriteLine(result);

输出示例:

 零拷贝序列化指在数据传输过程中避免内存复制,直接通过指针或视图共享原始缓冲区,从而提升性能、降低 GC 压力。

跟qwenchat还是有点区别

图片

整个过程无需你手动构造请求、解析 JSON 或处理流式输出,所有通信细节都由 Semantic Kernel 封装完成。

插件机制:让 AI 真正“会做事”

Semantic Kernel 的真正价值,在于插件系统。它让模型不仅能“回答问题”,还能“参与业务”。

例如,我们定义一个设备状态查询插件:

public sealed class EquipmentPlugin
{
    [KernelFunction]
    [Description("获取指定设备的运行状态,包括温度、转速、报警信息")]
    public string GetEquipmentStatus(
        [Description("设备编号,格式为 EQP-1001")] string equipmentId)
    {
        // 实际项目中可调用设备采集服务
        return "温度: 62.3°C | 转速: 1480 RPM | 状态: 正常";
    }
}

注册插件:

kernel.Plugins.AddFromType<EquipmentPlugin>();

然后配置自动调用行为:

var settings = new OpenAIPromptExecutionSettings
{
    ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};

var func = kernel.CreateFunctionFromPrompt("用户问题:{input}", settings);

var result = await kernel.InvokeAsync(
    func,
    new KernelArguments { ["input"] = "EQP-1001 现在状态如何?" }
);

Console.WriteLine(result);

输出示例:

 EQP-1001 当前状态:温度 62.3°C,转速 1480 RPM,运行正常。
 建议:持续监控温度趋势,防止过热。

整个过程中,开发者无需手动判断调用哪个函数,也无需拼接“模型输出 + 插件结果”,这些都由 Kernel 自动完成。

当前限制与应对

Semantic Kernel 也并非没有限制。插件需要在 Kernel 构建时静态注册,无法运行时动态扩展,可通过工厂模式按需构建不同 Kernel 实例来规避。 在通义千问的 Function Calling 支持方面,qwen-max 和 qwen-plus 表现最好,qwen-turbo 对复杂工具调用支持较弱,关键路径应优先选择能力更强的模型。 调试体验方面,可结合 ILogger 记录完整请求与响应,或使用 Semantic Kernel Studio 进行调试。

结语:AI 是工具,工程才是根本

Semantic Kernel 的价值,不在于让应用“看起来很智能”,而在于把 AI 能力沉淀为可复用、可测试、可维护的工程资产

在国产大模型能力日益成熟的今天,结合通义千问的中文优势与 Semantic Kernel 的工程化能力,.NET 团队完全可以在不颠覆原有技术栈的前提下,稳健、安全、高效地将 AI 融入核心业务。

重点始终只有一句话:

用工程思维驾驭 AI,而不是被 AI 牵着走。

注:代码仅供参考,更多内容请参阅官方仓库:github.com/microsoft/semantic-kernel

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐