大多数.NET开发人员都面临同样的AI集成难题:如何构建生产就绪的AI功能,同时避免供应商锁定或重复编排模式?两项微软技术可以优雅地解决这个问题。
Semantic Kernel 解决编排问题——它是一个开源SDK,可帮助您在.NET(以及Python/Java)中构建提示词、调用函数/插件并采用智能体模式。它被设计为协调AI步骤与您的应用程序逻辑的"粘合剂"。
Microsoft.Extensions.AI 涵盖提供程序抽象——它为.NET提供了统一的接口(IChatClient),用于聊天/多模态交互、流式传输和嵌入,所有这些都基于熟悉的 Microsoft.Extensions.* 依赖注入和日志记录模式。您的调用站点保持稳定,同时可以切换提供程序,如Azure OpenAI、OpenAI或本地模型。
心智模型:SK = 编排(提示词、插件、规划/智能体);Microsoft.Extensions.AI = 传输/原语(聊天、嵌入、选项、遥测)。
快速决策指南
目录(已更新)
它是什么。 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");
(代表了学习概述中展示的"连接"模式。)
核心构建块(一览)。
它是什么。 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、缓存、速率限制)。
各层职责。
IChatClient),以及用于流式传输、工具调用、缓存、遥测、DI等的管道。它标准化了"如何与模型对话"。为何 SK 能让基于 Ext.AI 的应用更出色
如果跳过 SK(仅使用 Ext.AI),会有什么变化? 您可以仅使用 Ext.AI 进行交付——但您最终很可能需要重建编排粘合层:
经验法则:
额外好处:结构化输出适用于两层 对于机器可读的结果(如代码文档JSON),您可以在客户端层(Ext.AI)请求 JSON / JSON-schema,然后让 SK 将结果作为另一步骤使用/路由。Azure 的 Structured outputs 解释了模式保证与旧版"JSON mode"的区别。
演示内容:此演示展示了一个实用的"代码转文档"工作流,它接受任何 C# 文件作为输入,并生成清晰、结构化的 Markdown 文档。它结合了 Semantic Kernel 的编排能力和 Extensions.AI 的与提供程序无关的聊天接口,创建了一个自动记录类、方法、参数和返回类型的工具。
工作流程:
架构亮点:
CodeParserPlugin 暴露了一个内核可以调用的 GetSymbols 函数示例输入 (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 的价值:
CodeParserPlugin 可以在不同的文档工作流中重用企业现实 许多公司由于数据治理担忧以及敏感代码被发送到外部提供商的风险而阻止了AI的使用。虽然此演示为简单起见使用了 OpenAI API 密钥,但整个工作流可以使用 Ollama 和开源模型(如 Llama、CodeLlama 或 Mistral)完全离线运行。
完全数据控制 使用 Ollama,您的代码永远不会离开您的环境——您在保持对数据的完全控制的同时,仍然可以获得AI辅助文档生成的生产力优势。Extensions.AI 抽象使这种提供程序交换变得微不足道:只需更改客户端配置,您的编排逻辑保持不变。
企业效益
常见陷阱
{{$variable}} 而不是 {{variable}}List<ChatMessage> 而不是原始字符串[KernelFunction] 属性准备好亲自尝试了吗? 准备好亲自尝试了吗?完整的工作示例可在 GitHub 上找到:charp-summarizer。只需克隆仓库,插入任何 .cs 文件,即可获得即时的方法和类摘要,这使新开发人员入职变得容易得多。无论您使用 OpenAI 进行快速实验还是使用 Ollama 满足生产环境隐私要求,选择权在您手中。
Semantic Kernel + Extensions.AI 为 .NET 开发人员提供了一条生产就绪的 AI 集成路径,无需担心供应商锁定或架构复杂性。SK 处理编排和工作流模式,而 Extensions.AI 提供清晰的提供程序抽象和企业级中间件。
对于构建超越简单聊天场景的任何团队而言,这种组合提供了在企业应用中扩展 AI 功能所需的结构化、可维护的基础——并完全控制您的数据去向。