快速结论:该报错通常出现在部分视觉语言(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;不带该参数时不会触发此错误。
解决步骤
- 先复现并确认错误是否由用户文本中包含图像占位符引起:检查 messages 中
{"type": "text", "text": "..."}的文本内容,是否出现了模型对应的图像占位符字符串。 - 如果只是想要表达“如何转换/如何书写该标签”这类语义,尝试修改用户文本,不要直接写入模型真正的图像占位符;可先校验修改后
apply_chat_template(messages, tokenize=True)是否不再抛错。 - 若你使用的是 LFM2 / LFM2.5-VL,并希望从模型侧解决,可优先尝试评论中提到的窄修复方向:将模型图像占位符由
<image>替换为不会与用户文本碰撞的 sentinel(该方案在 Issue 中尚属提议,未被确认合并)。 - 若需要从根本上解决,需等待上游结构性修复,使
apply_chat_template()的输出能够将用户文本中的占位符与真实多模态内容区分开;评论中明确指出该修复无法仅靠现有函数签名(返回str | list[int] | ...)完成,需要额外的元数据或签名变更。 - 在问题修复前,对于受影响的 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
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


