您现在的位置是:网站首页> .NET Core

.NET Core AI编程

摘要

.NET Core AI编程


1.jpg



AI 开发框架.net core的有哪些

如何使用Semantic Kernel





AI 开发框架.net core的有哪些

# .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**



如何使用Semantic Kernel

前置:.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` 是生产环境首选,用户体验更好























Top