Roo Code 调用本地模型,最让人崩溃的从来不是模型笨,而是卡顿。我最初在 VS Code 里接上 Ollama,点一下执行,界面先卡三秒,接着小菊花转十秒,好不容易出字了还一顿一顿,离“原生速度”差了十万八千里。折腾了整整两个晚上,终于把这套链路从“卡到没法用”调到了“和终端直跑 Ollama 几乎一样的原生速度”。这篇文章就是我的踩坑实战记录,把卡顿的原因、调整过的参数、验证过的方案完整拆开讲清楚,给同样被 Roo Code + 本地模型折磨的朋友一条直路。适合已经在用或正准备用 Roo Code 配合 Ollama / LM Studio 跑本地模型的开发者,不管你是 12G 显存还是 8G 显存,思路都通用。
1. 先搞清楚:Roo Code 调用本地模型为什么会卡?
1.1 三种典型卡顿症状,先对号入座
Roo Code 的卡顿其实分好几种,表现完全不一样,对应的处理方向也完全不同。我个人把它们分成三类,排查时先别急着改参数,先看自己属于哪一类。
第一类,UI 卡顿。在 Roo Code 的对话框里打字都掉帧,滚动历史记录、切换标签页时界面明显迟滞。这种卡顿和模型推理关系不大,多半是前端渲染压力大,以及一些附加功能在悄悄吃 CPU,比如嵌入模型、大文件实时追踪。第二类,首 token 等待过长。点击执行之后,小图标转圈十几秒甚至更久,才迟迟蹦出第一个字。这是最典型的本地模型卡顿,核心原因是“读题”太久——模型要处理整个上下文之后才能开始输出,上下文越长越慢。第三类,生成过程一顿一顿。第一个字出来了,但后续输出速度慢,UI 的刷新跟不上,滚动和点击都受影响。这种是“做题”太慢,解码速度不够,或者多个请求在抢同一个 GPU。
| 症状类型 | 具体表现 | 优先排查方向 |
|---|---|---|
| UI 卡顿 | 打字掉帧、界面迟滞 | 嵌入模型、前端渲染、CPU 占用 |
| 首 token 慢 | 转圈很久才出第一个字 | 上下文长度、模型加载、连接配置 |
| 生成卡顿 | 出字慢、输出断续 | 解码速度、并发排队、GPU 占用 |
1.2 根因拆解:不是模型慢,是链路问题
我一开始总怀疑是模型不行,后来才发现真正的问题是请求链路。Roo Code 作为编码助手,每次调用模型时,并不会只发送你刚才说的那句话,而是会把系统提示、完整对话历史、当前打开的文件内容、相关文档统统打包进请求。打个比方,这就像你让助手先读一百页报告再回答一个问题,读报告的时间往往比回答问题的时间还长。
本地模型处理请求分两个阶段。第一阶段叫 prefill,也叫预填充,模型要把你发给它的所有 token 都“看”一遍,建立上下文表示;第二阶段叫 decode,也就是逐字生成回答。prefill 的时间和输入 token 数量基本成正比。Roo Code 这种工具恰恰会发送大量输入 token,所以 prefill 就成了最大的瓶颈。而商业云端模型之所以感觉快,是因为后端有大量并行算力和缓存机制,同一段代码可能早就被其他用户的计算节点处理过。本地模型只有你这一块显卡,所有上下文都得现算,自然一卡一个准。
再加上 Ollama 的并发策略默认偏向保守,Roo Code 偶尔会同时发出几个小请求,例如读取文件诊断、生成标题、处理补全,这些请求如果被排到同一个模型实例后面,就会进一步拖慢响应。所以优化思路很清晰:让模型少读一点、尽量常驻显存、减少无意义的额外请求。后面几章就是围绕这三个方向展开的。
2. 模型与推理引擎侧的优化(先把后端调顺)
2.1 量化等级和上下文长度选择
量化就是压缩模型权重来减小体积、降低显存占用,换取更快的加载和推理。常见几种量化等级,我对 7B 模型实测的占用大致如下:
| 量化等级 | 7B 模型大致显存占用 | 效果 | 适用场景 |
|---|---|---|---|
| Q4_K_M | 约 4.7GB | 质量损失小 | 编码主力推荐 |
| Q5_K_M | 约 5.2GB | 质量稍好 | 显存宽裕时可选 |
| Q8_0 | 约 7.5GB | 接近原版 | 不推荐,收益低 |
| FP16 | 约 14GB | 原版精度 | 仅大显存玩家 |
从实测看,写代码、写脚本这类任务,Q4_K_M 和 Q8_0 的输出质量差距非常有限,但显存占用和速度差距却很明显。没必要为了那一点精度把速度拖垮。如果你用 N 卡,优先检查自己的显存容量,再选模型大小。12GB 显存跑 7B Q4 非常轻松,跑 14B Q4 也勉强够;8GB 显存就老老实实待在小模型区间。
上下文长度同样要克制。长上下文不是免费的,KV Cache 会随上下文增长线性吃显存,prefill 时间也会随 token 数线性增长。我在 7B 模型上把上下文从 4096 拉到 32768,光空载的 KV Cache 就额外吃了几百 MB 显存,实际对话一长,prefill 直接飙到几十秒。Roo Code 这类工具很吃上下文不假,但你可以靠控制每次发送的文件数量和对话长度来省,而不是靠硬拉模型窗口。我的建议是先保持 8192,跑通了再根据实际需求微调。
为什么不推荐一上来就把上下文拉满?因为 Roo Code 默认还会在接近窗口上限时触发自动压缩,压缩动作本身又是一次重负载,后文会再展开。总之,从短期看,“模型小一点、上下文短一点”带来的流畅体验,远大于参数溢出的收益。
2.2 Ollama 环境变量:并发、常驻、换模型策略
Ollama 有几个人尽皆知、但很少默认配置好的环境变量,对 Roo Code 这种频繁请求场景影响巨大。第一个是 OLLAMA_NUM_PARALLEL,控制 Ollama 允许同时处理几个请求。默认值在部分版本里偏保守,导致多个请求排队。Roo Code 偶尔会并发发出几个小请求,如果排队,体感就是卡顿。我建议先设为 2 或 4。
但注意,这个值不是越大越好。每一个并行请求都会保留自己的 KV Cache,你把并发拉到 8,多个请求会很快吃满显存,Ollama 可能被迫换出一部分数据到内存,反而更慢。2 到 4 是比较合理的区间。第二个是 OLLAMA_MAX_LOADED_MODELS,控制同时常驻显存的模型数量。如果你平时会在 Ollama 里反复切换不同模型,Ollama 会自动卸载旧模型来腾显存,这个换入换出的过程只要发生在 Roo Code 请求期间,就是一次灾难级的卡顿。设成 1 即可,专供 Roo Code 的机器就让它专心伺候一个模型。
第三个是 OLLAMA_KEEP_ALIVE,控制模型请求结束后的驻留时长。默认值是几秒到几分钟不等,一旦超时,模型会从显存卸载,下一次请求就要重新加载。Roo Code 两次操作的间隔往往超过这个窗口,于是模型频繁被加载,那真是每点一下都要等半天。设置为 -1,模型进显存后就不走了。具体设置方式:Linux 下如果你用 systemd 管理 Ollama,建议创建 override 配置文件:
sudo mkdir -p /etc/systemd/system/ollama.service.d sudo cat > /etc/systemd/system/ollama.service.d/override.conf << 'EOF' [Service] Environment="OLLAMA_NUM_PARALLEL=2" Environment="OLLAMA_MAX_LOADED_MODELS=1" Environment="OLLAMA_KEEP_ALIVE=-1" EOF sudo systemctl daemon-reload sudo systemctl restart ollamaWindows 用户在系统环境变量中新建以上三个变量,数值同上,注意设置完需要完全关闭并重启 Ollama 进程。macOS 用户则需要在 launchctl 环境变量里设置,或者借助 Homebrew services 启动时注入,网上教程很多,但核心思路一致。修改完可以用ollama ps验证。如果模型已经加载且显示处理器为 GPU,同时ollama ps刷新几次不回退到未加载状态,就说明常驻成功了。
2.3 换引擎:LM Studio 和 llama.cpp server 的取舍
Ollama 调完之后如果还不够满意,可以考虑换一个本地推理引擎。Roo Code 接入它们的方式都是 OpenAI 兼容接口,切换成本很低。LM Studio 是可视化客户端,它的本地服务端有“模型加载后常驻”的开关,可以在界面上直观看到每个模型加载的层数、显存使用量,还能逐层控制是否加载到显存。对于不习惯命令行的朋友,它比 Ollama 更好调整,而且它内置的并发和 KV Cache 量化策略也比较精细。
llama.cpp 自带的 server 程序则更轻量,跑在命令行里,可以用-np指定并行数、-c控制上下文长度,还支持--flash-attn加速注意力计算。如果你对性能压榨有执念,直接观察日志能看清每一步耗时。它们和 Ollama 的对比大致是这样:
| 引擎 | 上手难度 | 并发控制 | 长上下文处理 | 适合人群 |
|---|---|---|---|---|
| Ollama | 低 | 环境变量 | 一般 | 大多数用户,开箱即用 |
| LM Studio | 低 | 界面开关 | 较灵活 | 想可视化调参的人 |
| llama.cpp server | 中 | 启动参数 | 更自由 | 愿意折腾命令行的玩家 |
我自己的路线是先 Ollama 跑通,遇到瓶颈再切 LM Studio。两者最终效果差距没有想象中大,但把 OLLAMA_KEEP_ALIVE 设置好之后,Ollama 已经能满足我的日常开发场景。而且 Roo Code 官方对 Ollama 的适配比较直接,用 OpenAI 兼容接口切换也只是改一行 baseUrl 的事,不会把一个项目锁死在一个引擎上。如果你刚开始尝试,我建议别在引擎选择上花太多时间,先用最顺手的一步步来,性能不够再换,免得一开始就被配置劝退。
3. Roo Code 侧配置:把前端请求调到最优
3.1 Provider 配置里的关键参数
Roo Code 调用本地模型,本质就是把模型服务当成一个 OpenAI 兼容的 API 来用。在 Provider 配置界面,选择 OpenAI Compatible,然后填以下几个关键项:
{ "apiProvider": "openai", "apiModelId": "qwen2.5-coder:7b-instruct-q4_K_M", "apiBaseUrl": "http://127.0.0.1:11434/v1", "apiTemperature": 0.2, "apiMaxOutputTokens": 2048, "stream": true }有几点要单独说。apiBaseUrl 强烈建议写 127.0.0.1 而不是 localhost。localhost 在部分系统上会先解析到 IPv6 的 ::1,而 Ollama 可能只监听了 IPv4,导致 TCP 握手绕了一圈才建立,产生可感知的额外延迟。用 127.0.0.1 能避开这类玄学。temperature 是生成随机度,写代码这种事我建议 0.2 左右,越低越稳定,但要给它一点容错空间,0 可能会在部分模型上触发重复性比较高的问题。0.2 算是兼顾质量和流畅的选择。
apiMaxOutputTokens 也不要设太小。有些朋友为了省时间把输出上限压到 512,结果模型每次只能回一小段,反而需要来回多次调用,整体体验更差。2048 到 4096 比较合适,让它一口气把代码写完。stream 保持开启,流式输出可以让 UI 边生成边显示,虽然本地模型整体生成时间没变,但体感上“第一个字能快速出现”,焦虑感降低一大截。
顺带说明一下,Roo Code 新版里有可能直接内置了 Ollama 这个 Provider 选项,不过我还是推荐手动配置 OpenAI Compatible。原因是内置选项有时候会隐藏一些底层字段,比如超时时间、流式开关、缓存行为,你没法精确控制;而 OpenAI Compatible 配置可以让你把每个关键参数都写出来,出故障时也方便一条条排查。等到你完全摸清自己的模型和服务配置后,再考虑是不是切回内置选项。
3.2 管理 Auto Compaction 和嵌入模型
Roo Code 的上下文自动压缩(Auto Compaction)功能是个好东西,但也是卡顿大户。它会在对话历史接近模型窗口上限时,调用模型把历史压缩成摘要。出发点是防止上下文溢出,但本地模型做一次摘要,相当于把完整历史重新读一遍再写一段总结,这期间界面基本是假死状态,几十秒没响应很正常。我的建议是,先把 Auto Compaction 关掉,在设置里找到那个开关,然后自己在心里留根弦:对话长了、任务复杂了,就手动开一个新会话。Roo Code 本身支持把关键信息带过去,不一定非要无限塞在同一个会话里。
再说嵌入模型。Roo Code 的记忆功能如果要启用,会在本地做文本向量化,需要一个嵌入模型参与。本地跑嵌入模型不仅占用显存和内存,还会在每次对话时多一次向量化计算,对编码主流程几乎没有贡献。在设置里把它关闭,UI 响应速度会有很直观的提升。如果你确实需要记忆和检索能力,可以只开云端的嵌入接口,或者干脆只在必要的时候用。优先保证主流程流畅,这是我排优先级的原则。
3.3 对话习惯与 .rooignore
Roo Code 在项目里工作时,会把哪些文件放进上下文?它会参考一个类似 .gitignore 的规则文件,也就是 .rooignore。如果你从来没建过这个文件,Roo Code 会把目录下扫描到的各种文件都当作可阅读对象,尤其 node_modules、dist、build 这类体积大的目录,一旦被读进去,上下文 token 数立刻膨胀,prefill 时间跟着上升。我建议在每个 Roo Code 工作的项目根目录加一个 .rooignore:
node_modules dist build coverage .vscode .git *.lock这样既能减少无意义 token,也能让模型更聚焦到真实代码上。实测效果很明显,同样的任务,加了 .rooignore 之后首 token 时间几乎减半。对话习惯上还有一个小要点:不要让 Roo Code 一个会话里做太多事。它的对话历史和文件状态会持续累积,越到后面请求包越大、响应越慢。如果你有多个不相关的任务,拆成两个新会话分别处理,比从头问到底流畅得多。
4. 完整优化实战:一步步从卡顿到原生速度
4.1 我的基准环境
在给具体步骤之前,先交代我的参考环境,大家可以根据自己的硬件做平移。我用的是一张 RTX 3060 12G 显卡,CPU 是 R7 5700X,内存 32GB,系统盘是 NVMe SSD。软件方面,VS Code 用较新的稳定版,Roo Code 保持最新版本,Ollama 也是较新版本,模型用 qwen2.5-coder:7b-instruct-q4_K_M。
这套组合的特点是:12GB 显存属于入门级 AI 开发档位,跑 7B 量化模型很宽松,但也没到随便折腾的程度,具有很强的代表性。如果你的显存更大,后面的参数可以直接往上提;如果显存更小,把量化等级或模型尺寸往下降一档即可。优化前的状态,我记忆很深:打开 Roo Code 之后,点一次执行平均要 10 到 15 秒才开始出字,整个界面经常无响应,严重的时候一个简单“给函数加注释”的任务都要等一分钟。这显然不是模型能力问题,就是链路没调好。
4.2 六步操作流程
按下面的顺序操作,每一步都是我自己验证过的。第一步,设置 Ollama 环境变量。按照 2.2 节的方法,把 OLLAMA_NUM_PARALLEL 设为 2,OLLAMA_MAX_LOADED_MODELS 设为 1,OLLAMA_KEEP_ALIVE 设为 -1。然后重启 Ollama。注意重启后先跑一次ollama ps确认服务已恢复。第二步,在终端里手动加载一次模型,让模型进入常驻状态。可以执行:
ollama run qwen2.5-coder:7b-instruct-q4_K_M输入一条简单消息后退出。这一步的意义是让模型先加载到显存,因为第一次加载需要时间,提前加载好,后面 Roo Code 调用时就不用现场等加载了。第三步,在 Roo Code 的 Provider 设置里按 3.1 节的 JSON 建一个 OpenAI Compatible 配置,特别注意 apiBaseUrl 使用 127.0.0.1,stream 开启,temperature 调到 0.2。第四步,关闭 Roo Code 的嵌入模型功能,关闭 Auto Compaction,或把压缩阈值调到较大值。
第五步,在项目根目录创建 .rooignore,把无用大目录排除掉。宁可先加得保守一点,也不要忘了这个文件。第六步,执行一个简单任务做实测,比如“把这个函数补上注释”。记录从点击执行到输出第一个字符的时间。优化后应该能在 1 到 3 秒内出字,并且生成过程连续。每一步背后都有逻辑:前三步解决的是“模型加载太慢、请求排队、链路连接有额外延迟”的问题,后三步解决的是“上下文过重、无关计算过多”的问题。六步做完,整条链路就基本清爽了。
4.3 优化前后数据对比
我记录了一组比较有代表性的数据,给大家一个直观感受:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 首 token 延迟 | 10-15 秒 | 1-2 秒 |
| 生成速度 | 22 tok/s 左右 | 33-35 tok/s |
| UI 输入卡顿 | 经常出现 | 基本消失 |
| 上下文过大触发压缩 | 频繁 | 很少触发 |
这里要解释一下“原生速度”是什么概念。我把优化后的 Roo Code 响应速度,和直接在终端里用ollama run对话做对比:终端直跑的首 token 大约 0.8 秒,Roo Code 大概是 1.2 秒左右。多出来的零点几秒主要是 Roo Code 自身构建请求、渲染界面的开销,这个损耗很正常,体感上已经接近“原生速度”。为什么生成速度也会提升?因为 OLLAMA_KEEP_ALIVE 常驻之后,模型不再被反复加载,内存和显存状态更干净;同时把无意义上下文和嵌入模型关掉后,GPU 的算力也可以更集中在真正的生成任务上。不是 GPU 变强了,而是它终于只做该做的事了。
5. 我踩过的三个坑与问题排查实录
5.1 坑一:爆显存后 Ollama 静默切 CPU
有一次我为了测试效果,直接把模型换成 Qwen2.5 14B 的 Q8 量化,心想 3060 12G 应该能扛。结果加载进去了,但生成速度直接从每秒 30 个 token 掉到每秒 3 个 token,界面卡到没法看。我去ollama ps一看,原来模型已经被放到了 CPU 上跑,显存根本不够。原因很简单:超过显存容量的模型,Ollama 会自动把部分层放到内存里,用 CPU 计算,速度自然是断崖式下跌。
解决办法也很直接:把量化等级降下来,或者换成 7B/8B 这种尺寸。如果非要跑 14B,可以用 Q4_K_M,显存占用大约 9GB 左右,勉强能留在 GPU 上。这个坑提醒我,每次换模型后都要看一眼ollama ps,看 processor 列是不是 GPU,别想当然。
5.2 坑二:localhost 被网络转发工具拦截
有一次 Roo Code 的请求总是时快时慢,偶尔直接超时,但我在终端里用 curl 请求同一个地址,速度却很快。当时百思不得其解,后来才发现是系统里常驻的网络转发工具在作怪,它连 localhost 的流量也要过一遍过滤规则,遇到某些规则就延迟处理。解决起来也不复杂,把 127.0.0.1 和 localhost 加入该工具的直连列表,绕过转发逻辑即可。这也是我建议 apiBaseUrl 直接写 127.0.0.1 的原因,少一个可能被拦截的域名,就少一个卡顿嫌疑点。
进一步排查时,你还可以先用另一个终端或另一台设备连接同一个 API 服务,如果只有 Roo Code 卡而 curl 不卡,基本就能确认问题出在请求路径上的某个中间环节,而不是模型本身。顺便说一句,如果浏览器或工具类软件有类似“自动检测局域网”“流量过滤”之类的设置,尽量在本地开发环节关掉,宁可让流量直连,也不要在本地绕一圈。
5.3 坑三:Auto Compaction 触发时 UI 假死
前文提到 Auto Compaction 很坑,这个坑我是真实踩过的。有一次我让 Roo Code 分析一个比较大的项目,对话到十几轮后,点击执行突然整个界面卡死,等了几十秒才恢复,然后弹出一个“上下文已压缩”的提示。那几十秒就是模型在做历史摘要,太重了。解决思路:干脆关掉自动压缩,改用“开新会话 + 手动总结 > 继续任务”的工作方式。
如果确实需要长上下文,可以换支持更大上下文的模型,同时通过 .rooignore 控制输入量,让模型窗口不被无意义内容填满。这里还要提醒一句,关掉自动压缩之后,如果对话真的接近上下文上限,Roo Code 会直接截断历史而不是压缩,这可能导致模型丢掉前面的关键信息。所以更严谨的做法是,在感觉对话已经很长的时候,主动开新会话,并在新会话里用一小段话把任务背景和当前进度交代清楚,这比让工具自己硬撑要可靠得多。
5.4 快速排查命令速查表
整理一个排查速查表,出现卡顿先按这个顺序查:
| 症状 | 排查命令 | 判断方法 |
|---|---|---|
| 界面输入卡 | 任务管理器或 htop 看进程 | Roo Code 或嵌入模型进程是否占满 CPU |
| 首 token 慢 | ollama ps | 模型是否已加载、是否在 GPU 上 |
| 显存爆了 | nvidia-smi | 显存是否接近 100%、温度是否过高 |
| 引擎本身慢 | 用 curl 直接测 API | 看原生接口耗时,区分问题在引擎还是 Roo Code |
| 加载反复 | ollama ps刷新两次 | 模型是否被反复卸载 |
curl 测试命令可以这样写:
time curl http://127.0.0.1:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5-coder:7b-instruct-q4_K_M", "messages": [{"role": "user", "content": "ping"}], "stream": false }'如果这里返回只要 0.5 秒到 1 秒,说明引擎和模型没问题,卡顿根源在 Roo Code 的配置或上下文管理上。反之如果这里就很慢,那先去调引擎侧。
6. 进阶提速思路
6.1 换更专业的推理引擎
基础的 Ollama 优化不足以满足需求时,可以考虑更高级的推理引擎。比如 vLLM,它对高并发和大上下文做了很多优化,适合显存富余、希望同时跑多个任务的人,但配置复杂度也更高。又比如 llama.cpp server,轻量且可控,启动参数直接决定行为:
llama-server -m ./model-q4_K_M.gguf -c 8192 -np 2 --flash-attn-c指定上下文长度,-np指定并行数,--flash-attn开启 Flash Attention,减少显存占用和注意力计算时间。切换到 llama.cpp server 之后,Roo Code 同样通过 OpenAI 兼容地址接入,只需要把 apiBaseUrl 改成 llama.cpp server 暴露的端口即可。我在这里不详细展开 vLLM 和 llama.cpp 的安装步骤,因为它们的配置文档都已经很成熟;我更想强调的是,无论换哪个引擎,前面做的环境变量和模型常驻逻辑依然有效,只是从 Ollama 的默认策略变成了你自己手写的参数。
6.2 硬件与系统层面的建议
如果你在优化后还是觉得速度不够,那瓶颈可能真的在硬件上。我的体会是,跑本地编码模型,显存容量比算力更重要。显存决定了你能跑多大模型、能开多长上下文,而生成速度虽然受算力影响,但在 7B 这个级别,3060 和 4090 的差距远没有到“一个能用一个不能用”的程度。另外,系统内存别太小,即使模型主要跑在 GPU 上,加载过程和中间缓存也会占用一部分内存,内存一旦不够触发磁盘交换,速度会断崖式下跌。
SSD 也不能是“老掉牙”的机械盘,模型加载和 mmap 读取都需要磁盘吞吐,能用 NVMe 就用 NVMe。我见过有人把模型放在移动硬盘上跑,每轮请求光加载就要多花好几秒,这种硬件层的坑不是软件参数能救回来的。笔记本用户还要注意散热,连续高强度对话时,显卡降频会导致生成速度越来越慢,垫高机身、降低环境温度都能缓解。
6.3 让 Roo Code 更顺手的额外习惯
最后加几条工作习惯层面的建议。第一,把大仓库里的无关目录及时写进 .rooignore,别让 Roo Code 把整个项目塞进上下文。第二,复杂任务先用规划模式理清步骤,再切换到执行模式让模型逐步完成,避免它一次性输出超长内容导致 UI 卡死。第三,会话生命周期管理很重要,任务做完就开新会话,不要同一个会话从早上挂到晚上。这些习惯不直接改变推理速度,但能让 Roo Code 的请求包始终维持在一个很轻的状态,间接极大改善卡顿体验。
我在实际使用中最满意的一套组合就是:Roo Code + Qwen2.5 Coder 7B Q4_K_M + Ollama 常驻显存,加上关闭嵌入模型和自动压缩。日常写函数、改 bug、补测试,首 token 基本秒出,生成速度 30 多 tok/s,和终端里直接跑 Ollama 已经没有明显体感差异。如果你照着前面的步骤调完还是卡,多半是某个量化等级、并发参数或上下文设置和你显卡不匹配,用 5.4 节的命令速查表快速定位一下,基本都能找到问题。最后再分享一个小技巧:在 Ollama 里把 OLLAMA_KEEP_ALIVE 设为 -1 后,平时习惯性地在终端先ollama run一次把模型拉起来,后续整个工作过程都会顺畅很多。