本地 Ollama 本来是自己机器上的模型,按理说该比走云端快,结果接进 OpenClaw 之后等半天才吐字,甚至卡住不动。这篇不讲协议怎么配、客户端怎么填,只讲怎么把「慢」拆开量出来:是首字慢、还是整体慢,是模型没进显存、还是超时太短被反复重试。照着排查顺序走一遍,大多能定位到具体一环。
本地 Ollama 跑在自己机器上,按说比走云端该快一点,结果接进 OpenClaw 之后等半天才吐字,有时干脆卡着不动。这种「慢」很少是单一原因,多数是好几个环节叠在一起,你凭感觉说不清是哪一段。
这篇不讲协议怎么配、客户端怎么填,只讲怎么把慢拆开量出来:是首字慢还是整体慢,是模型没进显存,还是超时太短被反复重试。照着下面的顺序走一遍,大多能定位到具体一环。
先量出「慢」到底慢在哪一段
没量之前别急着改参数,同一句慢可能来自排队、加载或逐字生成三种完全不同的原因,改错地方只会白折腾。
- 拆三段计时把一次请求拆成连接与建连、首字返回、整段生成三段分别记时间,先确定瓶颈是排队、加载还是逐字生成。
- 两边各打一遍用同一句提示词直接打 Ollama 原生接口,再走 OpenClaw 打一遍,两边耗时差多少就是客户端这一层的开销。
- 留一条基线到 /tools/speed-test 量一条你本机的延迟基线,后面所有对比都拿这条线做参照,别凭感觉说变慢了。
模型是不是真的常驻在显存里
本地模型第一次调用要先加载权重,这段时间长但不是故障。判断标准很简单:连续调用第二次还慢,才说明模型没常驻,得往下查。
- 看显卡占用和进程内存,模型被换出到内存甚至磁盘,说明显存不够,参数规模或上下文长度得往下调
- 同时开着别的吃显存程序会让模型反复换入换出,排查时先把无关程序关掉
- 观察连续几次调用的耗时曲线,第一次特别长、后面平稳,属于正常加载,不用当成问题
- 如果每次间隔久一点再调又变慢,说明空闲时模型被释放了,这是配置行为不是故障
判断标准记一条:模型常驻时,多次调用的耗时应该稳定;耗时忽长忽短、和调用间隔相关,才是显存或释放策略的问题。
上下文和提示词是不是一次喂太多
长对话历史每轮都重发,生成的 token 数不变,但预填充变长,体感就是越来越慢。这种慢往往不是一开始就有的,而是聊得越久越明显。
| 现象 | 先查什么 | 临时动作 |
|---|---|---|
| 第一轮就慢 | 系统提示和工具描述体积 | 临时关掉工具再试一次 |
| 越聊越慢 | 历史消息是否全量重发 | 裁掉早期无关轮次 |
| 带检索时慢 | 注入的检索内容长度 | 先关检索对比耗时 |
| 提示词一长就卡 | 单次输入是否超过承受范围 | 缩短输入或分段处理 |
上下文压缩与裁剪的具体做法,可以对照 /ai-dict/category/tips 里的术语,先分清哪些是可丢的、哪些是必须留的,别一刀切把关键信息也删了。
超时和重试在偷偷放大等待
客户端超时设得比模型实际生成时间短,请求会失败再重发,用户看到的等待是成倍叠加的,表现出来像模型慢,其实是重试在拖。
- 排查时先临时把超时放宽、把重试次数关掉,确认是不是假慢,再回头调一个合理的值
- 重试打开时,日志里会出现同一请求的多次记录,看有没有重复的请求 ID
- 日志至少记下请求开始、首字返回、结束三个时间点和模型名,慢的时候能直接看出耗在哪一步
- 分开记「客户端等待」和「服务端生成」,两者差距大说明中间环节在耗费时间
# 粗略观察单次调用的耗时分布
curl -w "connect:%{time_connect} first:%{time_starttransfer} total:%{time_total}\n" -o /dev/null -s http://127.0.0.1:11434/api/generate -d '{"model":"你的模型名","prompt":"你好"}'什么情况下慢不是 Ollama 的锅
有些慢压根不在模型这一层。机器本身在跑别的重活、磁盘在做大量读写,或者本地服务被防火墙绕了一圈,都会让响应变慢。判断方法是看系统整体负载,而不是只盯着模型进程。
- 如果你其实是通过中转或代理转发到 Ollama,慢可能出在链路的中间那一跳,得分段对比
- 磁盘或网络在做大量读写时,模型加载会被拖慢,先确认有没有别的任务在抢 IO
- 模型规模明显超出这台机器的能力,再怎么调参数也只能缓解,这种情况换更小的模型或换硬件才治本
- 判断标准:关掉 OpenClaw 直接打原生接口也慢,说明慢在 Ollama 或系统,不在客户端
如果排查下来是链路或跳数的问题,可以到 /sites 看看不同接入方式的差异,再到 /rankings 对照可信度与稳定性表现,具体数字以页面当时显示的为准。
下一步把你测出的三段耗时和基线记下来,再回到配置里逐项对照;哪一段最突出就先动哪一段,比一次改一堆参数更容易看出效果。→常见问题
第一次调用特别慢,之后就正常了,算故障吗?
一般不算。本地模型首次调用要把权重加载进显存,这一段本来就要花时间。判断标准是第二次、第三次是否恢复正常。如果每次都一样慢,那才是真的有问题,重点往显存不够或模型被反复换出上查。
把超时时间调长就能解决变慢吗?
只能解决「看起来慢」。超时太短会让请求中途断开再重发,等待被叠加;调长只是让它别断。真正要改的是生成速度本身,比如缩小模型、截短上下文、确认模型已经常驻显存,调超时只是排除干扰项的一步。
同样的模型,走 OpenClaw 比直接调 Ollama 慢,正常吗?
有额外一层封装,多一点点开销是正常的,但差距不该大到体感明显。差很多的时候,通常是 OpenClaw 这侧塞了很长的系统提示或历史上下文,也可能是它的超时和重试策略在放大等待,两边各测一次就能区分。