glm-ocr: failed to fully read image, stopped with “done”: false

当 glm-ocr 或其它 OCR/文本补全模型输出的内容里含有大量连续重复 token(例如书籍习题里成排的句点“.”)时,Ollama 的“token repeat limit”循环检测会被误触发,提前中止生成并返回 "done": false 。优先排查模型输出中是否存在这类重复串,而不是先怀

快速结论:当 glm-ocr 或其它 OCR/文本补全模型输出的内容里含有大量连续重复 token(例如书籍习题里成排的句点“.”)时,Ollama 的“token repeat limit”循环检测会被误触发,提前中止生成并返回 "done": false。优先排查模型输出中是否存在这类重复串,而不是先怀疑图像尺寸、显存或上下文长度。

适用环境:Ollama 0.15.5,Windows(最新),GPU 为 RTX 6000 Pro Max-Q 96GB VRAM;调用方式为 POST /api/chat 与 CLI ollama run glm-ocr;模型 glm-ocr:latest。Issue 中未确认 Python、CUDA、PyTorch 版本。

最快修复方案:暂无确认的一步修复方案。Issue 中仅确认了误触发循环检测这一原因,维护者正在准备补丁,使该检测可配置,并修复不正确的 "done" 返回。

注意事项:调低 OLLAMA_NUM_PARALLEL、去掉 OLLAMA_FLASH_ATTENTION/OLLAMA_NEW_ENGINE/OLLAMA_NEW_ESTIMATES、加大上下文、改图像比例或改写 prompt 均已被报告为无效。把重复 token 阈值盲目调大只是缓解手段,无法区分“真正卡在循环”和“输出里恰好有重复 token”的模型,Issue 作者也认为需要更准确的循环判定方法。

问题场景

用户在 Ollama 0.15.5(Windows)上使用 glm-ocr:latest 做图像 OCR。图片本身只有 1180×721,尺寸并不算大,其它图片都能正常识别;但其中一张包含大量填空句点的习题图会在输出到“……”一带时停止,只返回了部分文本,后续内容丢失。通过 POST /api/chatstream: falsenum_ctx: 8196)与 CLI ollama run glm-ocr Text Recognition: ./image.png 得到相同结果。

报错原文

{
    "model": "glm-ocr:latest",
    "created_at": "2026-02-06T10:01:23.4538287Z",
    "message": {
        "role": "assistant",
        "content": "IV. Podane w nawiasie przymiotniki proszę przekształcić na stopień najwyższy.\nPrzyklad: Ta ulica jest (szeroka) najszersza w naszym mieście.\n1. To jest (elegancki) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ."
    },
    "done": false
}

time=2026-02-06T11:04:04.085+01:00 level=DEBUG source=server.go:1661 msg="prediction aborted, token repeat limit reached"

原因分析

Ollama server 中有一段用于检测“模型失去连贯性、卡在循环里”的代码,它通过检查输出中是否出现重复 token 来判定。Issue 中维护者给出的判断是:最后一行里那串长长的句点(. . . . . . . . . . .)正好触发了这段逻辑,导致预测被中止。

也就是说,这属于误判:模型输出的是正确答案(书籍/习题里常用成排句点做填空线),但由于这些 token 完全相同,被循环检测当成“卡死”。其它评论也指出,这段本意是防止模型陷入循环的条件被触发了,而实际上需要有一种逻辑来区分“真正卡住的响应”和“恰好包含重复 token 的正确响应”。

环境排查

  • 确认 Ollama 版本:Issue 为 0.15.5,done: falseprediction aborted, token repeat limit reached 是该问题的主要特征。
  • 确认操作系统:Windows(最新)。
  • 确认显卡与显存:RTX 6000 Pro Max-Q 96GB VRAM。
  • 确认调用方式:POST /api/chat 与 CLI ollama run,两者结果一致,说明与客户端无关。
  • 确认日志级别:需开启 OLLAMA_DEBUG:DEBUG 才能看到 server.go:1661 的 aborted 日志。
  • 确认模型输出内容:检查被截断处是否恰好是一长串相同字符(本 Issue 为连续的 .)。
  • Issue 未提供 Python、CUDA、PyTorch 版本信息,这些暂不作为排查项。

解决步骤

  1. 先确认现象是否匹配:在 OLLAMA_DEBUG=DEBUG 下复现,查看日志中是否出现 prediction aborted, token repeat limit reached,并确认被截断的位置是否紧跟在连续重复字符之后。
  2. 核对返回体:"done": false 表示生成被提前中止,而非模型真正输出完毕。
  3. 排除用户侧变量:按 Issue 记录,调低 OLLAMA_NUM_PARALLEL、移除 OLLAMA_FLASH_ATTENTION/OLLAMA_NEW_ENGINE/OLLAMA_NEW_ESTIMATES、增大上下文(最高约 40k)、调整图像比例、改写 prompt 都无法解决,因此不必在这些方向上反复尝试。
  4. 等待或跟进上游补丁:维护者正在编写补丁,目标是让该循环检测可配置,并修复不正确的 "done" 返回;同时指出该检测机制应被更准确的“模型是否在循环”的方法替代,建议把阈值从约 300 tokens 考虑(仅作为讨论方向,非已发布配置项)。
  5. 临时规避思路(可优先尝试):如果业务允许,改用不依赖成排句点作为输出的 prompt 或后处理方式,减少连续重复 token 的出现;或换用其它 OCR 模型验证是否为该检测逻辑特有问题。

验证方法

在应用上游修复或绕过方案后,用同一张 1180×721 的图片、同样的 POST /api/chat 请求(stream: false)重新调用 glm-ocr:latest。若返回体中的 "done"true,且输出包含句点之后本应继续的文本内容,同时 DEBUG 日志中不再出现 prediction aborted, token repeat limit reached,即可认为问题已解决。若仍被截断,说明命中的仍是同一循环检测路径,需继续跟进上游补丁。

参考来源

ollama/ollama #14117

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22775

发表回复

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