Ollama服务真正就绪需满足三条件:ollama serve持续运行、11434端口可访问、curl http://localhost:11434/api/tags返回JSON模型列表,缺一则C#调用必败。

确认Ollama服务是否真正就绪
很多C#调用失败,根本不是代码问题,而是ollama serve没在后台持续运行,或端口被占用。Windows上双击安装后默认不自启服务,必须手动执行命令启动。
- 打开终端(非PowerShell ISE,推荐CMD或Windows Terminal),运行
ollama serve—— 你会看到日志持续输出,说明服务已活;关闭窗口即终止服务 - 验证端口连通性:在另一终端执行
curl http://localhost:11434/api/tags,返回JSON列表才表示API可访问;若报错Connection refused,说明服务未运行或OLLAMA_HOST被误改 - 检查环境变量:
echo %OLLAMA_HOST%(CMD)或$env:OLLAMA_HOST(PowerShell),确保值为http://localhost:11434,否则C#客户端初始化时会连错地址
OllamaApiClient初始化与模型探测
OllamaApiClient本身不带重试和超时控制,直接new容易因网络抖动或模型加载慢而抛出HttpRequestException。初始化阶段必须包裹明确的超时和错误分类处理。
将小说章节转换为电影分镜剧本。用户上传txt/md/docx文本,AI分析场景、角色、情绪、镜头语言,输出专业分镜脚本。适用于用户提及“分镜”“storyboard”“小说转分镜”“影视改编”“镜头脚本”或需要将小说改编为分镜的场景。
- 构造时传入带超时的
HttpClient实例,例如new HttpClient { Timeout = TimeSpan.FromSeconds(10) },避免卡死在ListLocalModelsAsync() -
ListLocalModelsAsync()返回空集合≠无模型,可能是模型刚下载完但未注册进Ollama索引——此时应提示用户执行ollama list手动确认,并强调ollama pull llama3.2:3b需完整拉取(约2.5GB),中途断网会导致models为空且无报错 - 不要硬编码模型名,从
models.First().Name取值;Ollama对模型别名敏感,qwen2:7b和qwen2:7b-instruct是两个不同模型,后者更适合对话场景
ChatAsync流式调用中防止UI线程阻塞与响应抖动
WinForms里直接await _ollama.ChatAsync(...)看似简洁,但实际会因流式chunk到达节奏不均,导致RichTextBox频繁重绘、输入框冻结,甚至触发InvalidOperationException: Cross-thread operation not valid。
- 必须用
await foreach (var chunk in _ollama.ChatAsync(...))配合Invoke更新UI,不能在foreach内部直接操作控件 - 关键稳定性参数必须显式设置:
Temperature = 0.0f(禁用随机性)、Seed = 42(固定生成路径),否则同一输入可能每次回复不同,调试时极难复现问题 - 务必启用
Stream = true,否则ChatAsync会等待整段响应完成才返回,失去“边打字边显示”的体验,且大模型响应延迟常超30秒,UI假死明显
模型本地路径与资源限制的实际影响
Ollama默认把模型存在%USERPROFILE%\.ollama\models,C盘空间不足时首次pull会静默失败——命令行只显示“importing...”然后退出,ollama list仍为空,但磁盘无报错。
- 提前设置
OLLAMA_MODELS环境变量指向大容量盘符,如D:\ollama-models,并在系统级生效(重启终端),否则C#里查不到模型 - CPU推理时注意内存:7B模型常驻内存约4–6GB,若程序启动后立即调用
ChatAsync,而Ollama尚未完成模型mmap加载,会触发OOM Killer或Windows内存不足弹窗 - 小模型(如
phi3:3.8b)比大模型更适合作为开发验证起点,响应快、容错高;llama3.2:3b在无GPU的i5-1135G7上也能跑通,但qwen2:7b在同配置下易出现token生成中断或回复截断
ollama serve必须长期存活,且curl http://localhost:11434/api/tags能返回才算真正打通。后续所有C#逻辑都建立在这个HTTP可达性之上。

















