C#+本地大模型实战:Ollama+Semantic Kernel,离线也能跑AI
目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文
文章目录
目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。
开篇:为什么本地AI突然成了香饽饽?
前阵子我在咖啡厅写代码,隔壁桌俩程序员聊得火热。一个说:"我们公司刚接了个活儿,客户要求所有数据处理必须在本地完成,不上云。"另一个问:"那AI咋搞?调用OpenAI API不就违规了吗?"第一个人神秘一笑:“上Ollama啊,笔记本都能跑。”
这段对话挺有意思。过去咱们玩AI,第一反应是找API Key,现在风向变了——数据不出域、模型本地跑成了刚需。不管是金融行业的合规要求,还是个人隐私的考量,亦或是单纯的"我就不想联网",本地部署大模型已经从极客玩具变成了生产工具。
但问题来了:网上一搜本地部署,满屏的Python脚本、Conda环境、CUDA版本地狱,看得.NET开发者直摇头。咱就想用熟悉的C#写个控制台程序,调个模型聊聊天,咋就这么难?
今天这篇就教你一套纯C#方案:Ollama负责本地跑模型,Semantic Kernel当"交通指挥员",全程无需Python环境,Windows、macOS、Linux通吃。
第一部分:先搞懂这俩"神器"是干嘛的
1.1 Ollama:你的本地模型"应用商店"
想象一下,如果Docker是专门用来装各种模型的,那就是Ollama。它是个开源工具(MIT许可证),干的事儿很简单:把大模型打包成标准化容器,一键下载,一键运行。
你不需要懂什么GGUF格式、量化位数、CUDA配置,就一条命令:
ollama run llama3.2
啪,一个3B参数的小模型就在你电脑上跑起来了,默认开在localhost:11434端口。
2026年主流可选的模型有哪些?(都是Ollama官方库真实存在的):
- Llama 3.2(1B/3B):Meta出品,手机都能跑,适合快速原型
- Llama 3.3(70B):性能对标405B大模型,但需要好显卡
- Qwen3(0.6B到235B):阿里最新一代,中文理解能力强
- Phi-4(14B):微软的小钢炮,代码能力惊艳
- DeepSeek-R1(1.5B到671B):推理能力接近o1的开源模型
- Gemma 3(2B/4B/12B/27B):Google出品,单GPU友好
1.2 Semantic Kernel:微软出的"AI胶水"
如果说Ollama是发动机,Semantic Kernel(简称SK)就是变速箱。这是微软开源的SDK,专门解决一个问题:怎么让AI模型和你的C#代码无缝协作。
它提供了一套统一的API,不管你后面接的是OpenAI、Azure OpenAI,还是本地的Ollama,前面的代码几乎不用改。就像ADO.NET对不同数据库的统一访问一样,SK就是AI界的"数据库抽象层"。
最新版本是1.54.0,已经内置了Ollama的官方连接器(虽然还在alpha阶段,但功能完整)。
第二部分:环境准备,别急着写代码
2.1 安装Ollama(这一步必须做)
去官网下载对应系统的安装包,Windows用户直接双击.exe,macOS用Homebrew:
brew install ollama
装完后,在命令行拉一个轻量级模型试试水。我推荐Qwen3的1.7B版本,中文支持好,4GB内存就能跑:
ollama pull qwen3:1.7b
下载完成后,启动服务:
ollama serve
看到Listening on 127.0.0.1:11434就说明成功了。这时候你可以另开个终端测试:
ollama run qwen3:1.7b
如果能聊天,说明地基打好了。
2.2 硬件配置参考(真实的,不吹牛)
别听网上那些"消费级显卡跑70B模型"的鬼话,我列个实际能跑的配置表:
| 模型规模 | 推荐模型 | 内存需求 | 显存需求 | 适用场景 |
|---|---|---|---|---|
| 轻量级 | Qwen3:1.7b Llama 3.2:3b |
8GB | 无(CPU跑) 4GB(GPU加速) |
文本生成、简单问答 适合笔记本开发 |
| 进阶级 | Phi-4:14b Qwen3:14b |
16GB | 8GB+ | 代码生成、复杂推理 需要GTX 1070以上 |
| 旗舰级 | Llama 3.3:70b DeepSeek-R1:32b |
64GB | 24GB+ | 企业级应用 需RTX 3090/4090 |
重要提示:如果是Windows用户且没有NVIDIA显卡,Ollama会自动调用CPU运行,速度慢点但能用。苹果M系列芯片原生支持Metal加速,速度反而比同配置Intel快。
第三部分:写代码!三种集成方式任你选
3.1 方式一:纯Semantic Kernel原生(推荐)
这是微软官方支持的路子,NuGet包已经准备好:
dotnet new console -n LocalAI_Demo
cd LocalAI_Demo
dotnet add package Microsoft.SemanticKernel --version 1.54.0
dotnet add package Microsoft.SemanticKernel.Connectors.Ollama --version 1.54.0-alpha
Program.cs(完整可运行):
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.Ollama;
// 创建Kernel并配置Ollama
var builder = Kernel.CreateBuilder();
builder.AddOllamaChatCompletion(
modelId: "qwen3:1.7b", // 你下载的模型名
endpoint: new Uri("http://localhost:11434")
);
var kernel = builder.Build();
// 获取聊天服务
var chatService = kernel.GetRequiredService<IChatCompletionService>();
// 维护对话历史(这个对象会自动管理上下文)
var history = new ChatHistory();
history.AddSystemMessage("你是一个专业的.NET技术顾问,回答简洁且幽默。");
Console.WriteLine("本地AI已就绪,开始聊天(输入exit退出):\n");
while (true)
{
Console.Write("你:");
var input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input) || input.ToLower() == "exit")
break;
history.AddUserMessage(input);
// 流式输出,打字机效果
Console.Write("AI:");
var response = "";
await foreach (var chunk in chatService.GetStreamingChatMessageContentsAsync(history))
{
Console.Write(chunk.Content);
response += chunk.Content;
}
history.AddAssistantMessage(response);
Console.WriteLine("\n");
}
代码关键点解释:
AddOllamaChatCompletion是SK 1.54版本新增的扩展方法,专门对接Ollama原生APIChatHistory对象会自动维护多轮对话的上下文,不用你自己拼字符串GetStreamingChatMessageContentsAsync实现流式输出,大段文字不会卡顿
3.2 方式二:OpenAI兼容模式(灵活度高)
Ollama有个隐藏技能:它同时提供了OpenAI格式的API端点(/v1/chat/completions)。这意味着你可以用SK的OpenAI连接器来访问本地模型:
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI --version 1.54.0
代码差异点:
// 注意端点后面要加/v1
builder.AddOpenAIChatCompletion(
modelId: "llama3.2",
apiKey: "ollama", // 本地运行随便填,但不能为空
endpoint: new Uri("http://localhost:11434/v1")
);
这种方式的好处是:如果你的项目之前对接过OpenAI,改个URL就能切到本地模型,零成本迁移。
3.3 方式三:原生OllamaSharp(控制力最强)
如果你想用Ollama的一些高级功能(比如查看本地已下载的模型列表、拉取新模型、查看模型详情),可以用社区维护的OllamaSharp库,这是Ollama官方推荐的.NET SDK。
dotnet add package OllamaSharp --version 5.0.0
列出本地模型示例:
using OllamaSharp;
var client = new OllamaApiClient("http://localhost:11434");
// 获取本地已下载的模型
var models = await client.ListLocalModelsAsync();
Console.WriteLine("你电脑里住着这些模型:");
foreach (var model in models)
{
Console.WriteLine($"- {model.Name} ({model.Size / 1024 / 1024}MB)");
}
// 实时拉取新模型(带进度条)
await foreach (var status in client.PullModelAsync("phi4:latest"))
{
Console.Write($"\r下载进度:{status.Percent}%");
}
第四部分:进阶玩法,让本地AI更"聪明"
4.1 加上"外挂":文本嵌入与RAG
本地模型不仅能聊天,还能做检索增强生成(RAG)。比如你有一堆技术文档,想让AI基于这些文档回答问题,而不是瞎编。
第一步:下载嵌入模型
ollama pull nomic-embed-text
这是专门把文字变成向量的模型,占用很小(几百MB)。
第二步:C#代码实现简易RAG
using Microsoft.SemanticKernel.Embeddings;
using Microsoft.SemanticKernel.Connectors.Ollama;
// 配置嵌入服务
builder.AddOllamaTextEmbeddingGeneration(
modelId: "nomic-embed-text",
endpoint: new Uri("http://localhost:11434")
);
var kernel = builder.Build();
var embeddingService = kernel.GetRequiredService<ITextEmbeddingGenerationService>();
// 假设这是你的技术文档片段
var documents = new[]
{
"Semantic Kernel支持函数调用,可以让AI执行C#方法",
"Ollama的Windows版本支持GPU加速,需要CUDA 11.8+",
"Qwen3模型支持128K上下文长度,适合长文档分析"
};
// 把文档转成向量(这一步本地完成,数据不出电脑)
var embeddings = await embeddingService.GenerateEmbeddingsAsync(documents);
Console.WriteLine($"已生成{embeddings.Count}个文档向量,每个维度{embeddings[0].Length}");
// 输出:已生成3个文档向量,每个维度768
有了向量,你就可以做相似度搜索,把最相关的文档片段塞给大模型作为上下文,实现"基于私有数据的问答"。
4.2 函数调用:让AI能操作你的代码
Semantic Kernel最酷的功能是Function Calling——AI可以决定调用你写的C#方法。比如让AI查天气,实际上触发的是你本地写的API。
定义一个可被AI调用的函数:
using System.ComponentModel;
using Microsoft.SemanticKernel;
public class WeatherPlugin
{
[KernelFunction("get_weather")]
[Description("获取指定城市的当前天气")]
public string GetWeather([Description("城市名称,如北京、上海")] string city)
{
// 这里可以接真实天气API,示例返回模拟数据
return $"{city}当前天气:晴天,25℃";
}
}
注册插件并调用:
// 注册插件
builder.Plugins.AddFromType<WeatherPlugin>();
var kernel = builder.Build();
// 开启自动函数调用
var settings = new OllamaPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
var result = await chatService.GetChatMessageContentAsync(
"今天北京天气怎么样?",
settings,
kernel
);
Console.WriteLine(result.Content); // 会显示插件返回的天气信息
注意:不是所有本地模型都支持函数调用。目前实测Qwen3、Llama 3.2/3.3、Phi-4支持得比较好,小模型可能会胡言乱语。
第五部分:踩坑实录与性能调优
5.1 模型下载慢?换镜像源
Ollama默认从官网下载模型,国内速度感人。可以在系统环境变量里设置镜像:
Windows PowerShell
$env:OLLAMA_HOST="0.0.0.0"
$env:OLLAMA_MODELS="D:\OllamaModels" # 模型存D盘,省C盘空间
或者使用社区维护的国内镜像(具体地址请自行搜索可靠的社区镜像站)。
5.2 显存爆了?上量化版
如果你跑14B模型时爆显存,Ollama其实会自动帮你把部分权重放到内存(CPU offload),但速度会变慢。更好的方案是下载量化版:
4bit量化版,体积减半,速度更快
ollama pull qwen3:14b-q4_K_M
Ollama的模型标签(Tags)里通常包含量化信息,如q4_0(4位量化)、q8_0(8位量化),在官网模型页面能看到详细说明。
5.3 并发性能差?这是正常的
本地模型不像云API那样有集群支持。Ollama默认是单线程处理请求,如果有并发需求,需要:
- 启动多个Ollama实例(改端口)
- 或者使用vLLM(更适合高并发,但配置复杂)
对于个人开发或者企业内部工具,单线程通常够用。
结尾:本地AI的未来已来
写完这篇,我特意看了一眼Task Manager——我的笔记本上,Ollama进程正安安静静占用着6GB内存,跑着Qwen3 14B模型。不需要VPN,没有API调用限制,也不需要担心数据泄露。
对于.NET开发者来说,这套技术栈的意义在于:我们终于可以把AI能力真正集成到自己的桌面应用、Windows服务或者ASP.NET Core后端里,而不是永远依赖外部API。
微软的Semantic Kernel团队还在快速迭代,据说下一个稳定版会进一步优化本地模型的Agent能力。而Ollama社区更是热闹,连OpenAI开源的GPT-OSS(20B和120B版本)都已经支持一键下载。
技术的门槛在降低,创意的门槛在升高。现在,打开你的Visual Studio,试试在本地跑起第一个AI应用吧。毕竟,能在断网情况下还稳定运行的AI,才是真正意义上的"个人智能助手"。
目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)