您现在的位置是:网站首页> .NET Core
.NET Core AI编程
- .NET Core
- 2026-11-02
- 22人已阅读
.NET Core AI编程

# .NET Core /.NET 5+ 主流 AI 框架(C#)
> 全部支持 .NET Core /.NET 6/7/8/9,分**传统机器学习**、**大模型 Agent 应用框架**、**本地推理运行时**三类
## 一、微软官方
### 1. [ML.NET](https://ML.NET)(传统机器学习首选)
✅ 定位:.NET 原生机器学习框架,做分类、回归、推荐、异常检测、时序预测,**训练 + 推理一体**,不需要 PythonMicrosoft ...
- NuGet:`Microsoft.ML`、`Microsoft.ML.AutoML`(自动调参)
- 配套:Model Builder VS 插件、CLI 工具
- 适合:结构化数据机器学习、离线训练、嵌入业务程序
- 短板:不适合大 LLM 训练,深度学习能力偏弱
### 2. Semantic Kernel(SK,最火 Agent/LLM 编排框架)
✅ 定位:LLM 应用编排、Agent、插件调用、RAG、多步骤任务流,微软主推.NET
- 对接:OpenAI、Azure、Ollama、本地 Phi、通义千问等
- 能力:Function Calling、记忆、规划、多 Agent、RAG 流水线
- 现在底层逐步迁移到 `Microsoft.Extensions.AI` 抽象层
### 3. Microsoft.Extensions.AI(MEAI,新一代统一抽象层)
✅ 定位:**统一抽象**(IChatClient、IEmbeddingGenerator),解耦业务代码和大模型厂商,SK、MAF 都基于它Microsoft ...
- 不是完整 Agent 框架,是底层标准接口,方便切换 Ollama/OpenAI/Azure/ 本地模型
- 配套:`Microsoft.Extensions.VectorData`(向量存储抽象,对接 Qdrant、Milvus、Azure 搜索)
### 4. Microsoft Agent Framework (MAF)
✅ 定位:新一代 Agent 框架,比 SK 更偏向复杂多 Agent 协作、任务路由、交接,适合复杂智能体系统Microsoft ...
### 5. ONNX Runtime(ONNX 模型推理)
✅ 定位:深度学习推理引擎,跑 ONNX 格式模型(LLaMA、Phi、CV 模型、Stable Diffusion)
- 包:`Microsoft.ML.OnnxRuntime`、`OnnxRuntimeGenAI`(专门跑 LLM)
- 支持 CPU/CUDA/DirectML/ROCm,跨平台,本地离线推理核心组件
## 二、第三方开源框架
### 1. LLamaSharp(非常常用,本地 GGUF LLM)
✅ .NET 封装 llama.cpp,直接跑 GGUF 模型(Llama3、Qwen、Phi、Mistral),**本地离线大模型首选**
- 支持 GPU 加速、流式输出、上下文、Function Call、RAG
- 生态成熟,国内.NET 本地 LLM 项目用得极多
### 2. DotLLM
轻量、开箱即用,内置 OpenAI 兼容服务,可以[ASP.NET](https://ASP.NET) Core 一键拉起 GGUF 模型服务,适合快速搭本地 API 网关NuGet Gall...
### 3. TorchSharp
.NET 绑定 PyTorch,**C# 写深度学习训练**,对标 PyTorch API;适合自己写 CNN、Transformer 训练,门槛偏高
### 4. [Accord.NET](https://Accord.NET)
老牌.NET 科学计算 + 机器学习,图像处理、SVM、随机森林、计算机视觉;偏传统 ML,更新节奏慢
## 三、SDK(厂商客户端,不算框架但高频搭配)
- OpenAI .NET SDK:对接 OpenAI 兼容接口(Ollama、DeepSeek、通义、千问都能用)
- Azure.AI.OpenAI
- OllamaSharp:专门封装 Ollama REST API,极简调用本地 Ollama
# 快速选型建议
1. 结构化数据、传统机器学习训练 → **[ML.NET](https://ML.NET)**
2. 做大模型 Agent、插件、RAG 业务系统 → **Semantic Kernel**
3. 本地跑 GGUF 大模型(llama.cpp) → **LLamaSharp**
4. 跑 ONNX 深度学习模型(CV/Phi 系列) → **ONNX Runtime + OnnxRuntimeGenAI**
5. 想要代码不绑定大模型厂商、统一接口 → **Microsoft.Extensions.AI**
6. C# 里像 PyTorch 一样训练深度学习网络 → **TorchSharp**
前置:.NET 8 SDK(新版 SK 最低要求),下面示例优先用 **Ollama**(本地模型,不用花钱,OpenAI 兼容),也可以换成 DeepSeek、通义千问、Azure OpenAI
## 一、核心概念(先看懂,不踩坑)
1. **Kernel**:内核,DI 容器,存放 AI 服务、插件、过滤器,所有调用入口
2. **Connector**:对接大模型的适配器(OpenAIConnector、Ollama、Onnx 等)
3. **Plugin(插件)**:SK 最核心,分两种
- **Native Function(原生函数)**:你写的 C# 方法,加`[KernelFunction]`,给模型调用(Function Calling)
- **Semantic Function(语义函数)**:一段 Prompt 模板,交给 LLM 执行
4. **ChatHistory**:对话上下文,保存多轮聊天记录
5. **Vector Store / Memory**:向量存储,用来做 RAG 知识库(MEAI 抽象层)
6. **Filter**:钩子,可拦截 Prompt 渲染、函数调用、LLM 返回,做日志、鉴权、限流
## 二、创建项目 + 安装 NuGet
```
# 创建控制台项目
dotnet new console -n SkDemo
cd SkDemo
# 核心包
dotnet add package Microsoft.SemanticKernel
# OpenAI兼容连接器(Ollama/DeepSeek都走这个)
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
# 日志(可选,调试看请求)
dotnet add package Microsoft.Extensions.Logging.Console
```
> 如果你要 RAG 向量检索:额外装 `Microsoft.SemanticKernel.Connectors.InMemory`(内存向量库,仅测试)、Qdrant/Milvus 对应 Connector
## 三、Demo1:最简单单轮对话(Ollama 本地模型)
先启动 Ollama,拉模型:`ollama pull qwen2:7b`,地址默认 `http://localhost:11434`
```
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
// 1. 构建Kernel
var kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
modelId: "qwen2:7b",
endpoint: new Uri("http://localhost:11434/v1"),
apiKey: "sk-xxx" // ollama随便填字符串即可
);
var kernel = kernelBuilder.Build();
// 2. 获取聊天服务
var chatService = kernel.GetRequiredService<IChatCompletionService>();
// 3. 直接提问
var result = await chatService.GetChatMessageContentAsync("解释什么是Semantic Kernel", kernel: kernel);
Console.WriteLine(result);
```
## 四、Demo2:多轮对话 ChatHistory
```
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("qwen2:7b", new Uri("http://localhost:11434/v1"), "any-key")
.Build();
var chatService = kernel.GetRequiredService<IChatCompletionService>();
var chatHistory = new ChatHistory();
chatHistory.AddSystemMessage("你是一名C#和Semantic Kernel讲师,回答简洁");
while (true)
{
Console.Write("User:");
var msg = Console.ReadLine();
if (msg == "exit") break;
chatHistory.AddUserMessage(msg);
// 流式输出(推荐,打字机效果)
Console.Write("AI:");
await foreach (var chunk in chatService.GetStreamingChatMessageContentsAsync(chatHistory, kernel: kernel))
{
Console.Write(chunk);
}
Console.WriteLine();
}
```
## 五、Demo3:Function Calling(Native Plugin,SK 最常用)
> 目标:模型自己判断什么时候调用你写的 C# 函数,比如查时间、查数据库、调用 API
```
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
// 【定义插件】
public class TimePlugin
{
[KernelFunction, Description("获取当前服务器时间")]
public string GetNowTime()
{
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
[KernelFunction, Description("两个数字做加法")]
public double Add([Description("第一个数字")]double a, [Description("第二个数字")]double b)
{
return a + b;
}
}
// 主程序
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("qwen2:7b", new Uri("http://localhost:11434/v1"), "any-key")
.Build();
// 把插件注册进Kernel
kernel.Plugins.AddFromType<TimePlugin>();
// 开启自动工具调用 Auto()
var settings = new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
// 提问:模型识别到需要调用函数,自动执行,再把结果发给LLM整理回答
var res = await kernel.InvokePromptAsync("现在几点了?5+8等于多少?", new(settings));
Console.WriteLine(res);
```
⚠️ 关键点:
- `[Description]` 非常重要!模型靠描述理解函数用途、参数含义
- `FunctionChoiceBehavior.Auto()` = 模型自主决定要不要调用工具;还有 Required/None 模式
## 六、Demo4:语义函数(Semantic Function,Prompt 模板)
适合固定任务:翻译、摘要、抽取结构化信息
```
var translateFunc = kernel.CreateFunctionFromPrompt(
promptTemplate: @"把下面文本翻译成英文:{{$input}}",
functionName: "Translate"
);
var result = await kernel.InvokeAsync(translateFunc, new KernelArguments{{"input", "你好,语义内核"}});
Console.WriteLine(result);
```
## 七、RAG 简要流程(SK 新版基于 MEAI+VectorData)
1. 文档加载 → 文本切片 Chunk
2. 调用 Embedding 模型生成向量
3. 存入 VectorStore(内存测试 / Qdrant/Milvus)
4. 用户提问 → 问题向量化 → 相似度检索拿到相关文档片段
5. 把检索片段塞进 Prompt,交给 LLM 回答
> 老版本 SK 有`Memory`,**新版已经迁移到 Microsoft.Extensions.VectorData**,官方主推这套,不再推荐旧 Memory 体系Microsoft ...
## 八、常见连接器选型
- Ollama:本地 GGUF 模型,开发首选,OpenAI 兼容
- AzureOpenAI:生产 Azure 云
- OpenAI:GPT 系列
- OnnxRuntimeGenAI:直接跑 ONNX 模型,不走 HTTP
- 国内大模型(通义千问、DeepSeek、Kimi):大部分支持 OpenAI 兼容接口,直接用`AddOpenAIChatCompletion`填对应 endpoint
## 九、SK 和 MAF(Microsoft Agent Framework)区别(你前面问过)
- **Semantic Kernel**:轻量编排,插件、FunctionCalling、RAG,适合 Copilot、单 Agent 业务,上手简单
- **MAF**:复杂多 Agent、Agent 路由、交接、状态机,更重,最低.NET8,适合多智能体协作系统
## 十、常见坑
1. .NET 版本:**1.8x + 新版 SK 只支持.NET8+**,netcore3.1 只能锁 1.40 之前旧 SK,插件大量不兼容
2. Ollama 地址:必须加 `/v1` 后缀,否则报 404
3. Function Calling 不生效:检查模型是否支持 tool call、Description 写清楚、settings 开启 Auto
4. 不要在插件函数里写耗时阻塞逻辑,建议异步 `async Task`
5. 流式接口 `GetStreamingChatMessageContentsAsync` 是生产环境首选,用户体验更好