C# 接入本地大模型 Ollama:手把手实现流式对话、健康检查与结构化 Prompt(.NET 8 WinForms 实战)
本文用 C# + .NET 8 WinForms 封装本地 Ollama 接口,实现流式打字机效果、健康检查、取消、进度、耗时统计,并落地结构化 Prompt工程。全程不依赖云端 API,数据不出本地,附完整代码与踩坑记录。
一、前言
现在大模型很火,但直接调云端 API 有几个问题:要花钱、要联网、数据还得上传。而Ollama可以把开源大模型(如 Qwen、Llama)一键跑在本地,还提供了简单的 REST API。
本文就用 C# 做一个 WinForms 小工具,实现:
- 非流式对话(一次返回完整答案)
- 流式对话(模型一个字一个字往外蹦,打字机效果)
- 服务健康检查(在线状态、版本、延迟)
- 取消、进度提示、耗时统计
- 结构化 Prompt(角色 / 任务 / 格式约束)多场景对比
二、环境准备
- 安装Ollama:官网 https://ollama.com 下载安装。
- 拉取一个文本模型(命令行执行):
ollama pull qwen2.5:7b - 确认 Ollama 服务已启动(默认端口
11434),浏览器访问 http://localhost:11434 有响应即可。 - 新建一个WinForms(.NET 8)项目。
Ollama 常用接口:
| 接口 | 作用 |
|---|---|
GET /api/version | 获取版本(可用于健康检查)。 |
GET /api/tags | 获取已安装模型列表。 |
POST /api/chat | 对话(stream控制是否流式) |
三、项目结构
结构化Prompt设计与实践/ ├── Program.cs # 程序入口 ├── Form1.cs # 界面逻辑(按钮事件、线程调度) ├── Form1.Designer.cs # 界面控件 ├── OllamaClient.cs # 封装 Ollama 接口(核心) └── PromptWorkshop.cs # 结构化 Prompt 与存档界面很简单:上面一个大输出框,中间一个提问框,底部一排按钮(练习/健康检查/取消/模型选择/非流式/流式)。
四、核心代码:封装 OllamaClient
这是整个项目的核心,对上层屏蔽 HTTP 细节。
4.1 健康检查
调用/api/version,用Stopwatch测连接延迟,并用3 秒超时保证服务挂了也不会干等:
publicclassOllamaHealth{publicboolIsOnline{get;set;}publicstringVersion{get;set;}="";publiclongLatencyMs{get;set;}publicstringError{get;set;}="";}publicasyncTask<OllamaHealth>HealthCheckAsync(CancellationTokenct=default){// 3 秒超时usingvarlinked=CancellationTokenSource.CreateLinkedTokenSource(ct);linked.CancelAfter(TimeSpan.FromSeconds(3));varsw=Stopwatch.StartNew();try{varresp=await_http.GetAsync($"{_baseUrl}/api/version",linked.Token);resp.EnsureSuccessStatusCode();sw.Stop();vartext=awaitresp.Content.ReadAsStringAsync(linked.Token);usingvardoc=JsonDocument.Parse(text);varver=doc.RootElement.TryGetProperty("version",outvarv)?v.GetString():"";<