ValueError: The number of images in the text [2] and images [1] should be the same.

该报错通常出现在部分视觉语言(VL)模型上:当用户在文本里手动写入了模型的图像占位符(例如 )时, apply_chat_template(..., tokenize=True) 会因为字符串匹配到两个占位符而抛错。优先排查用户文本中是否误写了占位符,并确认所使用处理器的占位符计数逻

快速结论:该报错通常出现在部分视觉语言(VL)模型上:当用户在文本里手动写入了模型的图像占位符(例如 <image>)时,apply_chat_template(..., tokenize=True) 会因为字符串匹配到两个占位符而抛错。优先排查用户文本中是否误写了占位符,并确认所使用处理器的占位符计数逻辑。

适用环境:Issue 中确认的环境为:transformers 5.13.0;macOS-26.3.1-arm64;Python 3.14.3;huggingface_hub 1.23.0;safetensors 0.8.0;未安装 Accelerate、DeepSpeed、PyTorch。复现脚本额外依赖 torchvision>=0.28.0,评论中在 5.13.0、CPU only 条件下确认可确定性复现。

最快修复方案:暂无确认的一步修复方案。Issue 中提到的窄修复方向是把 LFM2/LFM2.5-VL 的图像占位符换成不会与用户文本冲突的 sentinel(即非 <image> 的占位符),但该方案在撰写时仍属于提议,尚未确认合并。

注意事项:Issue 已关闭(Closed at 2026-10-13),但讨论中维护者尚未确认最终的通用结构性修复方案。用户侧可优先尝试的规避方式是:不要在用户文本中手动书写模型的图像占位符;若必须书写,需确认它与真实图像内容不会产生歧义。该规避方式并非官方修复,且对通用结构化缺陷无效。

问题场景

用户在使用 transformers 的 AutoProcessor 加载视觉语言模型(例如 LiquidAI/LFM2.5-VL-1.6B),并通过 apply_chat_template() 处理包含图像的多模态消息时触发问题。具体地,用户在对话的文本内容中手动写入了图像占位符(如 <image>),随后调用 apply_chat_template(messages, tokenize=True) 进行分词,即会抛出异常。未开启 tokenize=True 时仅返回字符串,不会触发该错误。

评论中扩展的复现脚本显示,该问题在多个流行 VL 模型上可复现,包括 LFM2.5-VL、Qwen3-VL、Qwen3.5、SmolVLM2、Gemma-4、InternVL3 / InternVL3.5 等,其共性是在用户文本里含模型对应的图像占位符。

报错原文

ValueError: The number of images in the text [2] and images [1] should be the same.

原因分析

根据 Issue 中的分析,根因是“结构化消息 → apply_chat_template() → 字符串 → __call__() → tokens”这一管线存在有损(lossy)的往返转换。处理器的图像占位符计数是基于字符串匹配完成的:在 processing_lfm2_vl.py 中,处理器会在字符串上做计数(L103)和字符串切分(L154)。因此,当用户在文本中手动输入了与真实图像占位符相同的字符串(如 <image>)时,处理器无法区分「用户书写的文本」与「真实的图像内容占位符」,导致统计到 2 个占位符而实际图像只有 1 个,从而抛出该 ValueError。

评论中还指出,这是一个影响多个主流 VL 模型的普遍缺陷,而非 LFM2 专属问题。提出的修复方向包括:在用户消息内容上以 split_special_tokens=True 分词、在 chat template 其余部分以 split_special_tokens=False 分词;或从根本上改为结构化记录图像位置,而非依赖字符串匹配。

环境排查

  • 确认 transformers 版本(Issue 中为 5.13.0,评论确认在该版本可确定性复现)。
  • 确认 Python 版本(Issue 中为 3.14.3)。
  • 确认是否安装了 torchvision(复现脚本要求 torchvision>=0.28.0)。
  • 确认是否安装了 PyTorch / CUDA / 显卡加速环境;Issue 中为未安装 PyTorch、CPU only、无分布式并行。
  • 确认所使用的模型与其图像占位符形式,例如 LFM2.5-VL 为 <image>,Qwen3-VL 为 <|vision_start|><|image_pad|><|vision_end|>,Gemma-4 为 <|image|>,InternVL3 为 <img><IMG_CONTEXT></img>。
  • 确认调用 apply_chat_template() 时是否使用了 tokenize=True;不带该参数时不会触发此错误。

解决步骤

  1. 先复现并确认错误是否由用户文本中包含图像占位符引起:检查 messages 中 {"type": "text", "text": "..."} 的文本内容,是否出现了模型对应的图像占位符字符串。
  2. 如果只是想要表达“如何转换/如何书写该标签”这类语义,尝试修改用户文本,不要直接写入模型真正的图像占位符;可先校验修改后 apply_chat_template(messages, tokenize=True) 是否不再抛错。
  3. 若你使用的是 LFM2 / LFM2.5-VL,并希望从模型侧解决,可优先尝试评论中提到的窄修复方向:将模型图像占位符由 <image> 替换为不会与用户文本碰撞的 sentinel(该方案在 Issue 中尚属提议,未被确认合并)。
  4. 若需要从根本上解决,需等待上游结构性修复,使 apply_chat_template() 的输出能够将用户文本中的占位符与真实多模态内容区分开;评论中明确指出该修复无法仅靠现有函数签名(返回 str | list[int] | ...)完成,需要额外的元数据或签名变更。
  5. 在问题修复前,对于受影响的 VL 模型,尽量避免在用户消息文本中书写其图像占位符;这是目前最直接的规避方式,而非官方修复。

验证方法

在修改用户文本或走窄修复方向后,重新运行原始复现脚本,确认 processor.apply_chat_template(messages, tokenize=True) 不再抛出 ValueError: The number of images in the text [2] and images [1] should be the same.,而是正常返回 token 化结果(预期行为为无异常且 tokenization 正确)。

参考来源

huggingface/transformers #47217

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29016

发表回复

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