.NET AI集成新范式:Semantic Kernel与Extensions.AI如何强强联合

作者:微信公众号:【架构师老卢】
9-23 14:12
170

大多数.NET开发人员都面临同样的AI集成难题:如何构建生产就绪的AI功能,同时避免供应商锁定或重复编排模式?两项微软技术可以优雅地解决这个问题。

Semantic Kernel 解决编排问题——它是一个开源SDK,可帮助您在.NET(以及Python/Java)中构建提示词、调用函数/插件并采用智能体模式。它被设计为协调AI步骤与您的应用程序逻辑的"粘合剂"。

Microsoft.Extensions.AI 涵盖提供程序抽象——它为.NET提供了统一的接口(IChatClient),用于聊天/多模态交互、流式传输和嵌入,所有这些都基于熟悉的 Microsoft.Extensions.* 依赖注入和日志记录模式。您的调用站点保持稳定,同时可以切换提供程序,如Azure OpenAI、OpenAI或本地模型。

心智模型:SK = 编排(提示词、插件、规划/智能体);Microsoft.Extensions.AI = 传输/原语(聊天、嵌入、选项、遥测)。

快速决策指南

  • 仅使用 Extensions.AI:简单的聊天/嵌入场景,单步AI调用
  • SK + Extensions.AI:多步骤工作流、函数调用、智能体模式、企业级编排
  • SK 搭配本地模型:同上,但具有完全的数据控制权(Ollama/本地托管)

目录(已更新)

  1. Microsoft Semantic Kernel (SK) — .NET 概述
  2. Microsoft.Extensions.AI — 概述和包
  3. SK + Microsoft.Extensions.AI 如何协同工作(为何SK重要)
  4. 代码演示:自动化 C# 文档生成器
  5. 企业部署与数据治理

1) Microsoft Semantic Kernel (SK) — .NET 概述

它是什么。 Semantic Kernel 是微软的开源SDK,用于将AI与您的常规.NET代码进行编排。它帮助您连接提示词、函数("插件")、到模型提供程序(OpenAI、Azure OpenAI等)的连接,以及可选的规划/内存功能——因此您的应用可以可预测地协调AI步骤。

为何有益。 SK 简化了集成,降低了不同AI服务间的复杂性,并通过结构化提示词和步骤的运行方式使行为更可控——从课堂演示到企业应用都很有用。

安装(CLI)。

# .NET 8/9
dotnet add package Microsoft.SemanticKernel

兼容性:SK 1.0+ 适用于 .NET 6/8/9。Extensions.AI 需要 .NET 8+。

创建内核

using Microsoft.SemanticKernel;

var builder = Kernel.CreateBuilder();
// 在此处添加服务/插件/连接
var kernel = builder.Build();

ASP.NET Core 注册

var builder = WebApplication.CreateBuilder();
builder.Services.AddKernel(); // 注册 SK Kernel

// 在此处添加服务/插件/连接

var app = builder.Build();

这些遵循官方概述:Kernel 是DI容器,持有SK为您编排的服务和插件。

连接到模型(示例:Azure OpenAI 聊天)。

builder.Services.AddAzureOpenAIChatCompletion(
    "your-resource-name",
    "your-endpoint",
    "your-resource-key",
    "deployment-model");

(代表了学习概述中展示的"连接"模式。)

核心构建块(一览)。

  • => Connections — 连接到AI服务和数据的适配器。
  • => Plugins — 模型可以调用的函数(语义提示词或原生C#)。
  • => Planner — 构建/执行计划(可选)。
  • => Memory — 用于检索的嵌入/向量存储抽象。

2) Microsoft.Extensions.AI — 统一的 .NET AI 抽象

它是什么。 Microsoft.Extensions.AI 为.NET提供了一种与提供程序无关的方式来与AI服务通信,使用了熟悉的 Microsoft.Extensions.* 模式(DI、中间件)。它围绕两个关键抽象展开:IChatClient(聊天/多模态)和 IEmbeddingGenerator(嵌入)。此外,它还提供了用于工具调用、缓存、遥测等的现成中间件。

包(引用哪个)。

  • => Microsoft.Extensions.AI.Abstractions — 核心类型/接口(例如,IChatClient)。
  • => Microsoft.Extensions.AI — 添加更高级的助手和管道/中间件。

大多数应用会引用 Microsoft.Extensions.AI 加上一个提供程序库(OpenAI、Azure、Ollama等)。

线程安全。 API 文档指出所有 IChatClient 成员都是线程安全的,适用于并发使用——非常适合Web应用和后台服务。

典型用法(单次和流式)。

using Microsoft.Extensions.AI;

// 单次请求
ChatResponse r = await chatClient.GetResponseAsync("What is AI?");
Console.WriteLine(r.Text);

// 流式传输
await foreach (var u in chatClient.GetStreamingResponseAsync("Stream a haiku."))
    Console.Write(u);

这些模式——请求/流式传输,加上工具调用、缓存、遥测、DI管道——在学习文章中都有完整示例说明。

为何它与SK搭配。 将编排(提示词/插件/流程)保留在SK中,并将模型I/O放在 IChatClient 后面。这种清晰的边界让您可以交换提供程序而无需重构应用逻辑,并在单一位置分层处理横切关注点(日志记录/OpenTelemetry、缓存、速率限制)。


3) SK 和 Microsoft.Extensions.AI 如何相互助力(以及为何 SK 重要)

各层职责。

  • => Microsoft.Extensions.AI 为您提供一个统一的、与提供程序无关的客户端(IChatClient),以及用于流式传输、工具调用、缓存、遥测、DI等的管道。它标准化了"如何与模型对话"。
  • => Semantic Kernel (SK) 为您提供编排:一个Kernel(DI容器)、插件(您的应用暴露给模型的函数)、可选的内存和规划指导——即,"AI步骤如何围绕您的.NET代码组合在一起"。

为何 SK 能让基于 Ext.AI 的应用更出色

  • 有组织的函数暴露 与其手动编写JSON工具规范或分散辅助方法,SK允许您注册模型可以调用的插件(原生C#或导入的)。您获得了一种一致的方式来暴露功能、重用它们并保持其可发现性。
  • 真正的编排中心 Ext.AI 标准化了调用;SK 标准化了流程。SK的Kernel托管您的服务和插件,因此多步骤交互(提示词 → 工具 → 提示词)位于一个地方,而不是临时代码路径中。
  • 现代'规划',无需旧版规划器 当前的指导方针是倾向于使用函数调用(由SK驱动循环)而不是旧版规划器;微软记录了从 Stepwise Planner 到 Auto Function Calling 的迁移,因为它更可靠且令牌效率更高。SK内置了这种编排模式,因此您无需重新实现它。
  • 扩展时的内存和检索 当您的提示词超出单个文件时,SK的内存抽象让您可以插入向量存储(Azure AI Search、Redis等),而无需将应用硬连接到某一种后端方法。
  • 与 Ext.AI 的管道协同工作 保留 Ext.AI 的优势——流式传输、遥测(OpenTelemetry)、缓存和中间件——用于传输层,而SK专注于编排和插件生命周期。两者结合,您将获得清晰的关注点分离和可观测性。

如果跳过 SK(仅使用 Ext.AI),会有什么变化? 您可以仅使用 Ext.AI 进行交付——但您最终很可能需要重建编排粘合层:

  • 临时工具表面:您需要自己描述和管理可调用函数(命名、参数、版本控制),并手动连接调用/返回循环。
  • 分散的提示词/流程逻辑:多步骤链(提示词 → 工具 → 后续操作)位于控制器/服务中,没有通用的编排模型。
  • 更难扩展:添加检索("内存")、导入外部工具(OpenAPI/MCP)或发展为多步骤类智能体行为将成为定制工作。
  • 规划迁移由您负责:您需要自己模拟较新的自动函数调用方法及其重试/保护机制。

经验法则:

  • 如果您的应用是单步骤的(提问 → 回答)并带有一些中间件,仅使用 Ext.AI 即可。
  • 如果您需要可重复的多步骤流程、标准化的插件、可选的内存或通往智能体模式的路径,请添加 SK 作为编排层。

额外好处:结构化输出适用于两层 对于机器可读的结果(如代码文档JSON),您可以在客户端层(Ext.AI)请求 JSON / JSON-schema,然后让 SK 将结果作为另一步骤使用/路由。Azure 的 Structured outputs 解释了模式保证与旧版"JSON mode"的区别。


4) 代码演示:使用 SK + Extensions.AI 实现自动化 C# 文档生成

演示内容:此演示展示了一个实用的"代码转文档"工作流,它接受任何 C# 文件作为输入,并生成清晰、结构化的 Markdown 文档。它结合了 Semantic Kernel 的编排能力和 Extensions.AI 的与提供程序无关的聊天接口,创建了一个自动记录类、方法、参数和返回类型的工具。

工作流程:

  1. 解析 C# 源代码 — 一个自定义的 SK 插件使用正则表达式模式从任何 .cs 文件中提取符号(命名空间、类、公共方法)
  2. 结构化为 JSON — 解析器将代码符号转换为结构化的 JSON 数据
  3. AI 分析 — SK 编排一个接收 JSON 并生成专业文档的提示词模板
  4. Markdown 输出 — 结果是清晰、一致的文档,可用于 Wiki、README 文件或入职材料

架构亮点:

  • SK 插件CodeParserPlugin 暴露了一个内核可以调用的 GetSymbols 函数
  • 提示词编排:SK 管理将原始代码符号转换为文档的模板
  • Extensions.AI:提供底层的聊天客户端抽象,保持代码与提供程序无关

示例输入 (RcaAgent.cs):

public sealed class RcaAgent
{
    public RcaResult AnalyzeIncident(IncidentData incident, IEnumerable<LogEntry> logs) { ... }
    public LogAnalysis AnalyzeLogs(IEnumerable<LogEntry> logs) { ... }
    // ... 更多方法
}

测试输出:

dotnet run -- "/path/to/RcaAgent.cs"

生成的输出:

# Summary for RcaAgent

## Classes
- **RcaAgent** — Root Cause Analysis Agent that analyzes logs and incidents to identify potential causes

## Methods

### AnalyzeIncident
`public RcaResult AnalyzeIncident(IncidentData incident, IEnumerable<LogEntry> logs)`
- Analyzes the provided incident together with a sequence of log entries and returns an RcaResult.
- Parameters:
  - incident (IncidentData) — the incident instance to be analyzed
  - logs (IEnumerable<LogEntry>) — the sequence of log entries to use in the analysis
- Returns: RcaResult — the result of the root-cause analysis

### AnalyzeLogs
`public LogAnalysis AnalyzeLogs(IEnumerable<LogEntry> logs)`
- Analyzes the provided sequence of log entries and returns a LogAnalysis.
- Parameters:
  - logs (IEnumerable<LogEntry>) — the sequence of log entries to analyze  
- Returns: LogAnalysis — the outcome of the log analysis

为何这展示了 SK + Extensions.AI 的价值:

  • 清晰分离:Extensions.AI 处理模型通信,SK 处理编排
  • 可重用插件CodeParserPlugin 可以在不同的文档工作流中重用
  • 提供程序灵活性:从 OpenAI 切换到 Azure OpenAI 再到本地模型,无需更改业务逻辑
  • 结构化提示词:SK 的模板引擎使文档格式保持一致且可维护
  • 实际影响:这种自动化文档生成可以显著改善开发人员入职、代码审查和知识共享——特别是对于手动文档落后于开发的大型代码库。

5) 企业部署与数据治理

企业现实 许多公司由于数据治理担忧以及敏感代码被发送到外部提供商的风险而阻止了AI的使用。虽然此演示为简单起见使用了 OpenAI API 密钥,但整个工作流可以使用 Ollama 和开源模型(如 Llama、CodeLlama 或 Mistral)完全离线运行。

完全数据控制 使用 Ollama,您的代码永远不会离开您的环境——您在保持对数据的完全控制的同时,仍然可以获得AI辅助文档生成的生产力优势。Extensions.AI 抽象使这种提供程序交换变得微不足道:只需更改客户端配置,您的编排逻辑保持不变。

企业效益

  • AI 集成代码减少 40–60%
  • 提供程序切换只需更改 <5 行代码
  • 内置遥测减少调试时间
  • 标准化模式提高团队效率
  • 针对敏感代码库的完全离线能力

常见陷阱

  • SK 提示词模板使用 {{$variable}} 而不是 {{variable}}
  • Extensions.AI 需要 List<ChatMessage> 而不是原始字符串
  • 插件方法需要 [KernelFunction] 属性

准备好亲自尝试了吗? 准备好亲自尝试了吗?完整的工作示例可在 GitHub 上找到:charp-summarizer。只需克隆仓库,插入任何 .cs 文件,即可获得即时的方法和类摘要,这使新开发人员入职变得容易得多。无论您使用 OpenAI 进行快速实验还是使用 Ollama 满足生产环境隐私要求,选择权在您手中。


Semantic Kernel + Extensions.AI 为 .NET 开发人员提供了一条生产就绪的 AI 集成路径,无需担心供应商锁定或架构复杂性。SK 处理编排和工作流模式,而 Extensions.AI 提供清晰的提供程序抽象和企业级中间件。

对于构建超越简单聊天场景的任何团队而言,这种组合提供了在企业应用中扩展 AI 功能所需的结构化、可维护的基础——并完全控制您的数据去向。

相关留言评论
昵称:
邮箱:
阅读排行