文章目录
摘要:很多人本机已经能对话了,却还是觉得本地大模型不好用:回答飘、长文本抓不住、多开几个窗口就卡死,或者更新一次后旧脚本全失效。本文承接 本地部署大模型的详细考虑 与 要不要加显卡,把跑通之后最常见的坑拆开:量化过猛、上下文不够、并发不稳、更新破坏环境,并给出可执行的排查命令。适合已经完成本地安装,但体验明显低于预期的开发者。具体参数随工具版本变化,以 Ollama / llama.cpp 文档为准。
建议继续沿用实验目录:
mkdir -p ~/local-llm-lab/{notes,scripts,logs}
cd ~/local-llm-lab
# 本文用到:diagnose_local_llm.sh / context_probe.py / concurrency_probe.py
| 文件 | 作用 |
|---|---|
scripts/diagnose_local_llm.sh | 看模型列表、服务端口、内存/显存快照 |
scripts/context_probe.py | 用逐步加长输入,观察上下文是否撑得住 |
scripts/concurrency_probe.py | 并发请求,看一高是否变慢或失败 |
1. 跑通,不等于能用
本地部署里有一个很容易产生的错觉:
终端里能问答了,说明本地大模型已经可用。
更准确的说法是:主路径通了。是否能用,还要看它能不能稳定承接你的真实任务。
常见落差是:
- 闲聊还行,贴一段业务代码就开始胡说
- 单窗口勉强能用,插件和脚本一并发就崩
- 昨天还好好的,今天更新后模型名或接口变了

图1. 演示成功之后,真正拉开体验的,往往是量化、上下文、并发和更新维护。
所以这一篇不讨论“要不要开始本地部署”,而讨论:
已经跑通了,为什么还是不好用,以及按什么顺序查。
2. 结论先行
| 体验问题 | 更优先怀疑 | 先做什么 |
|---|---|---|
| 回答变飘、细节丢、逻辑发虚 | 量化过猛或模型过小 | 换同系列更稳的量化/稍大模型对比 |
| 长代码、长文档后半段像没看见 | 上下文不够或输入无裁剪 | 做上下文探测,拆分材料 |
| 多窗口/插件一开就卡或报错 | 并发与显存/内存争用 | 降并发,先单请求打基线 |
| 突然全坏、旧命令失效 | 更新、模型标签、服务端口变化 | 冻结版本,核对 list 与接口 |
| 怎么都不如云端 | 任务本身不适合本机小模型 | 把本地定位成私有/离线补充,不强替 |
再记四句:
- 跑通只是起点,稳定性才是体验。
- 先用同一批真实任务做对比,再下结论换模型或加硬件。
- 量化、上下文、并发,比“再买一张更贵的卡”更常是第一现场。
- 更新前先能回滚,否则一次升级就能把可用环境打回安装日。
3. 跑通后最容易踩的几类坑

图2. 四类问题经常被误判成“本地大模型不行”或“必须马上加卡”。
3.1 量化过猛
量化能让模型更容易塞进本机,但压得太狠时,表现会像“模型变笨”:
- 指令遵循变差
- 代码细节漏改
- 摘要丢掉关键约束
这时很多人会误判为“开源模型不行”或“必须上更大显卡”。更稳的动作是:固定同一套提示词和任务,换一个量化更保守或参数稍大的版本对比。
3.2 上下文不够
本地默认上下文往往比云端旗舰短。输入一长,模型并不是“更努力”,而是中后段进不去,于是开始补齐、猜测、跑偏。
3.3 并发一高就崩
本机资源是共享的。你同时开:
- 终端对话
- 编辑器插件
- 自己的脚本请求
等于多路抢同一块显存/内存。单路测试时“还行”,一并发就掉崖,非常常见。
3.4 更新后全坏
自动更新、模型标签变更、默认端口或 API 路径变化,都会让昨天还能跑的脚本今天集体失败。看起来像“本地部署太脆”,根因经常是缺少版本冻结。
4. 先做一次环境快照
保存为 scripts/diagnose_local_llm.sh:
#!/usr/bin/env bash
set -euo pipefail
echo "== time =="
date
echo
echo "== ollama version / models =="
if command -v ollama >/dev/null 2>&1; then
ollama --version || true
ollama list || true
else
echo "ollama not found"
fi
echo
echo "== local api tags =="
curl -s http://127.0.0.1:11434/api/tags || echo "api not reachable"
echo
echo "== memory =="
free -h
echo
echo "== disk =="
df -h /
echo
echo "== gpu =="
if command -v nvidia-smi >/dev/null 2>&1; then
nvidia-smi
else
echo "nvidia-smi not found"
fi
chmod +x ~/local-llm-lab/scripts/diagnose_local_llm.sh
~/local-llm-lab/scripts/diagnose_local_llm.sh | tee ~/local-llm-lab/logs/diagnose.txt
先把“当前到底在跑哪个模型、服务是否还在、资源是否顶满”记下来。后面所有对比,都尽量基于同一快照条件。
5. 坑一:量化过猛,看起来像模型不行
5.1 怎么判断
用同一道真实题,连续测两个配置,例如:
- 更激进量化 / 更小模型
- 更保守量化 / 同系列稍大模型
题目必须来自你的工作,不要用“写首诗”。
可记录成正文表格(保存到 notes/quant_compare.md 时也建议直接用表格,不要塞进代码块里):
| 配置 | 同一题是否改对关键点 | 是否漏约束 | 速度体感 | 备注 |
|---|---|---|---|---|
| 配置 A(更小/更激进) | ||||
| 配置 B(更稳/稍大) |
如果 A 明显更飘、B 明显更稳,优先把问题归到量化或模型容量,而不是先买旗舰卡。
5.2 可执行动作
ollama list
# 按你当前可用标签调整;先保证同系列对比
# ollama pull qwen2.5:7b
# ollama pull qwen2.5:14b
原则很简单:
先找到“可用且可接受速度”的配置,再谈极致压缩。
6. 坑二:上下文不够,长输入直接翻车

图3. 输入很长时,中后段丢失会直接表现为回答跑偏。
6.1 典型症状
- 你贴了完整文件,它只像看见开头
- 要求“基于第 3 节修改”,它像没读到第 3 节
- 材料越长,幻觉越明显
6.2 用脚本做上下文探测
保存为 scripts/context_probe.py:
#!/usr/bin/env python3
"""逐步加长输入,观察本地模型是否还能抓住末尾标记。
依赖:
pip3 install openai
默认对接 Ollama OpenAI 兼容接口:
https://github.com/ollama/ollama/blob/main/docs/openai.md
"""
from __future__ import annotations
from openai import OpenAI
def main() -> None:
client = OpenAI(base_url="http://127.0.0.1:11434/v1", api_key="ollama")
model = "qwen2.5:7b" # 改成 ollama list 中的名字
for n in [20, 80, 200, 400]:
body = ("这是第%s段填充内容,用于增加输入长度。\n" % i for i in range(1, n + 1))
text = "".join(body) + "\n【末尾标记】请只回答:看见末尾标记了\n"
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": text}],
temperature=0,
)
answer = (resp.choices[0].message.content or "").strip()
ok = "看见末尾标记了" in answer
print(f"segments={n} ok={ok} answer={answer[:80]!r}")
if __name__ == "__main__":
main()
pip3 install openai
python3 ~/local-llm-lab/scripts/context_probe.py | tee ~/local-llm-lab/logs/context_probe.txt
若短输入正常、一加长就抓不住末尾标记,优先处理上下文,而不是先换更大显卡。
6.3 实操缓解
- 先摘要再提问,不要一次塞整仓
- 按文件/按函数拆开多次问
- 明确告诉模型“只基于下面材料,材料外的不要编”
- 确认当前工具/模型的上下文配置,不要假设和云端一样大
7. 坑三:并发一高就崩
7.1 为什么单测正常、一并发就挂
单请求时,显存和内存还能排开;多请求同时来,就会出现:
- 排队极慢
- 超时
- 服务直接重启
- 系统内存被打到 swap
7.2 并发探测脚本
保存为 scripts/concurrency_probe.py:
#!/usr/bin/env python3
"""对本地接口做简单并发压测,观察失败率和耗时。"""
from __future__ import annotations
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from openai import OpenAI
def one_call(client: OpenAI, model: str, i: int) -> tuple[int, float, str]:
t0 = time.perf_counter()
try:
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": f"用一句话回答:{i}+{i}=?"}],
temperature=0,
)
dt = time.perf_counter() - t0
content = (resp.choices[0].message.content or "").strip()
return i, dt, content
except Exception as exc: # noqa: BLE001
dt = time.perf_counter() - t0
return i, dt, f"ERROR: {exc}"
def main() -> None:
client = OpenAI(base_url="http://127.0.0.1:11434/v1", api_key="ollama")
model = "qwen2.5:7b"
workers = 4 # 先从 2~4 试,不要一上来很高
t0 = time.perf_counter()
with ThreadPoolExecutor(max_workers=workers) as ex:
futs = [ex.submit(one_call, client, model, i) for i in range(workers)]
for fut in as_completed(futs):
i, dt, content = fut.result()
print(f"id={i} dt={dt:.2f}s result={content[:60]!r}")
print(f"total={time.perf_counter() - t0:.2f}s workers={workers}")
if __name__ == "__main__":
main()
python3 ~/local-llm-lab/scripts/concurrency_probe.py | tee ~/local-llm-lab/logs/concurrency.txt
# 另开终端观察
# watch -n 1 nvidia-smi
# free -h
7.3 实操缓解
- 编辑器插件、脚本、终端不要无限制同时打满
- 先保证单请求基线稳定,再逐步加并发
- 笔记本上更要保守;散热和功耗墙会让“理论显存够”变得不够用
8. 坑四:更新后全坏
8.1 典型现象
ollama run xxx提示模型不存在- 旧脚本连不上端口
- 同一标签效果突然变化
- 昨天的自动化今天全部报错
8.2 更新前先留回滚点
# 更新前记录
ollama list | tee ~/local-llm-lab/logs/models_before_update.txt
curl -s http://127.0.0.1:11434/api/tags | tee ~/local-llm-lab/logs/api_before_update.txt
# 关键脚本里写死当前可用的模型名,不要依赖“最新默认”
原则:
个人实验环境可以追新;已经进入工作流的环境,先求可回滚,再求新特性。
若你把本地模型接进了日常脚本,建议在备忘录里固定三样东西:
| 项目 | 写清楚 |
|---|---|
| 模型名 | 当前可用的精确标签 |
| 接口地址 | 如 http://127.0.0.1:11434/v1 |
| 验收题 | 一道必过的真实小任务 |
更新后先跑这道验收题,再决定是否继续用新版本。
9. 体验差时,按这个顺序排查

图4. 先看任务是否合适,再查量化/模型、上下文、并发与更新。
| 步骤 | 你要回答的问题 | 通过标准 |
|---|---|---|
| 1. 任务是否合适 | 这是不是本机小模型该扛的活 | 私有/离线/短闭环优先 |
| 2. 量化/模型 | 同题换配置后是否明显改善 | 有可感知提升再固定配置 |
| 3. 上下文 | 加长输入后是否还抓得住关键信息 | context_probe.py 末尾标记能看见 |
| 4. 并发 | 多请求时是否仍稳定 | 先单路稳定,再小并发 |
| 5. 更新与版本 | 是否刚变更模型或服务 | 能回到更新前可用状态 |
只有前几步都稳,仍然长期顶满显存且速度不可接受,再回到上一篇的硬件决策。

图5. 小问题本地收尾;大问题知道何时回云端,而不是整机硬扛。
10. 常见误区
10.1 一不好用就换更大显卡
很多体验问题出在量化、上下文和并发,加卡治不好提示词和输入裁剪问题。
10.2 用闲聊效果判断能否写代码
验收必须用真实仓库问题和真实文档。
10.3 默认本机上下文和云端一样
本地方案常常更短。长任务要拆,不要假设“全贴进去就行”。
10.4 无并发限制地接插件
插件一多,本机就会从“能用”变成“能卡”。
10.5 自动更新从不验收
进入工作流后,更新也是变更。没有验收题,就没有稳定性。
11. 术语速查
| 术语 | 含义 |
|---|---|
| 量化 | 降低权重精度以减少资源占用,可能损伤效果 |
| 上下文 | 单次请求里模型能有效利用的输入范围 |
| 并发 | 同一时间打向本机服务的请求数量 |
| 基线 | 单请求、固定模型、固定题目下的可用表现 |
| 回滚点 | 更新前可恢复的模型与配置记录 |
| 验收题 | 用于判断环境是否仍可用的固定真实任务 |
12. 小结
本地大模型跑通了却不好用,优先别急着宣判“本地没前途”或“必须马上买卡”。更常见的现场是:
- 量化过猛
- 上下文不够
- 并发失控
- 更新破坏了可复现环境
按同一批真实任务,把这四项查完,你才会知道下一步该换配置、改用法,还是再谈硬件。
先把“能对话”变成“能稳定干活”;再决定要不要让硬件去放大这个已验证的工作流。
13. 相关阅读
相关链接:
如果这篇帮你把“跑通但不好用”定位清楚了,欢迎点赞、收藏,也欢迎关注后续更新。

4810

被折叠的 条评论
为什么被折叠?



