v0.13.1+ Breaks Deepseek R1 671B system messages

这个报错通常出现在 Ollama v0.13.1 及以上版本运行 Deepseek R1 671B 时,system 消息(system prompt)被模型忽略或直接丢弃,尤其是提示词中包含数字、标点等符号、长度较长时。优先排查 Ollama 版本,并确认 system prompt 是否被实际送

快速结论:这个报错通常出现在 Ollama v0.13.1 及以上版本运行 Deepseek R1 671B 时,system 消息(system prompt)被模型忽略或直接丢弃,尤其是提示词中包含数字、标点等符号、长度较长时。优先排查 Ollama 版本,并确认 system prompt 是否被实际送入模型。

适用环境:Issue 中已确认的环境为 Ollama 0.13.2(问题引入于 v0.13.1),macOS,Apple GPU / CPU,模型为 deepseek-r1:671b(含 deepseek-r1:671b-0528-q4_K_M 量化版本)。其他操作系统、Python、CUDA、PyTorch 环境未在 Issue 中明确。

最快修复方案:暂无确认的一步修复方案。已验证的最终修复来自官方:升级到 Ollama 0.22.0(对应 PR #15844)。Issue 中也有用户回退到 0.12.11 作为临时规避。

注意事项:0.15.6 仍未完全修复,Issue 中反馈该版本下 system prompt 不会被完全丢弃,但仍会漏掉关键指令,并且推理启动速度明显变慢。Issue 标签为 bug、needs more info,正文与评论中部分复现现象来自用户实测,结论请以 0.22.0 官方修复为准。

问题场景

用户在 Ollama 中使用 chat API 或 ollama run 调用 deepseek-r1:671b(含 deepseek-r1:671b-0528-q4_K_M)时,通过 messages 传入 {"role":"system","content":"..."} 的 system prompt,期望模型遵循该指令。实际结果是在 v0.13.1 及之后版本,短 system prompt 通常仍生效,但一旦 system prompt 达到一定长度或包含数字、逗号、句号等符号后,system prompt 会被完全跳过;部分版本中即使未完全跳过,也会丢失关键指令,并且推理和流式响应速度大幅变慢(Issue 中用户对比约 0:10 与约 2:45 才开始输出)。

报错原文

v0.13.1+ Breaks Deepseek R1 671B system messages

The "system" message is not making it through to Deepseek R1 671B.

$ ollama -v
ollama version is 0.13.2

$ curl -s localhost:11434/api/chat -d '{
  "model":"deepseek-r1:671b",
  "messages":[
    {"role":"system","content":"speak like a pirate"},
    {"role":"user","content":"hello"}
  ],
  "stream":false
}' | jq -r .message.content
Ahoy, matey! Welcome aboard! What brings ye to these digital waters today? 🏴‍☠️

Small system prompts still work, but there is now a threshold which, once reached, will result in it being skipped entirely.

$ ollama run deepseek-r1:671b 1 2 3 4 repeat the preceding numbers
Thinking...
First, the user said: "1 1 2 1 1 2 3 1 1 2 1 2 3 4 repeat the preceding numbers"
...

原因分析

Issue 中定位到的直接原因指向 commit 5c1063df7fb6850410a35ddfb92cd6efb818fa6e:移除 attention.key_length_mla 检查后,pre-tokenizer 在提示词包含数字时会把 token 复制放大(例如 1 2 3 4 被处理后变成 1 1 2 1 1 2 3 1 1 2 1 2 3 4)。token 重复使 prompt processor 误判上下文缓冲区即将用尽,从而把 system prompt 丢弃。用户观察到的阈值现象——数字、逗号、句号等符号越多越容易触发——与该机制一致。

属于推测、未在 Issue 中完全定论的部分:不同位置、数量、符号类型对阈值的影响存在个体差异,Issue 中未给出统一的定量结论。

环境排查

  • 确认 Ollama 版本:ollama -v,重点排除 v0.13.1、v0.13.2,以及用户反馈仍未完全修复的 0.15.6。
  • 确认模型与量化版本:deepseek-r1:671b 或 deepseek-r1:671b-0528-q4_K_M。
  • 确认运行平台:Issue 中为 macOS,Apple GPU / CPU。
  • 确认 system prompt 的形态:长度、是否包含数字、逗号、句号、编号或项目符号。
  • 确认调用方式:/api/chat 的 messages 中是否显式包含 role: system。
  • Python、CUDA、PyTorch 版本未在 Issue 中涉及,无需作为排查项。

解决步骤

  1. 先在当前版本上复现并记录现象,确认 system prompt 是否被忽略。可用 Issue 中最小复现思路:构造一个较长的、含数字的 system prompt,再提一个必须依赖该 system prompt 才能正确回答的 user 问题。
  2. 对比测试:将 system prompt 去掉一位数字或减少若干符号,观察模型是否突然开始遵循 system prompt,并留意推理速度是否显著变慢。若因此恢复,可佐证与 token 重复/阈值机制相关。
  3. 临时规避(可优先尝试):将 Ollama 回退到 0.12.11。Issue 中用户反馈该版本下 system prompt 正常生效且速度正常。
  4. 正式修复:升级到 Ollama 0.22.0,对应官方 PR #15844。这是 Issue 中明确标记为 Fixed 的版本。
  5. 升级后如仍出现指令遗漏或速度异常,保留最小复现用例并重新反馈,因为 Issue 中曾有用户在 0.15.6 报告“未被完全丢弃但仍漏指令、速度很慢”。

验证方法

在升级到 0.22.0 后,用最小复现用例重新请求:system prompt 中包含一段依赖性的长数字或符号序列,user 问题要求模型复述或遵循该 system prompt。若模型能正确遵循 system prompt,且启动流式输出的速度恢复到正常水平(不再出现 Issue 中描述的分钟级延迟),可认为问题已解决。若 system prompt 仍被忽略,说明命中的可能不是同一问题,建议附上 ollama -v、模型标签、完整请求体和响应内容重新排查。

参考来源

ollama/ollama #13388

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 28953

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注