You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改HuggingFace预训练Tokenizer的Normalizer及相关疑问

HuggingFace预训练Tokenizer的Normalizer修改问题及解决方案

对于自带Normalizer的HuggingFace预训练Tokenizer(例如mistralai/Mistral-7B-v0.1),我们可以通过替换backend_tokenizer.normalizer的方式修改其文本归一化规则,示例代码如下:

import json

from transformers import AutoTokenizer
from tokenizers.normalizers import Sequence, Replace, Prepend

tokenizer_name = "mistralai/Mistral-7B-v0.1"
old_tok = AutoTokenizer.from_pretrained(tokenizer_name)

assert old_tok.backend_tokenizer.normalizer != None

new_normalizer = Sequence(
    [Prepend('▁'), Replace('▁', ' '), Replace("foo", "bar"), Replace('<br>', '\n')]
)

old_tok.backend_tokenizer.normalizer = new_normalizer
new_tokenizer_name = f"new_tokenizer-{tokenizer_name}"
old_tok.save_pretrained(new_tokenizer_name)


old_tok = AutoTokenizer.from_pretrained(tokenizer_name)
new_tok = AutoTokenizer.from_pretrained(new_tokenizer_name)

测试验证修改已生效:

>>> print(' '.join(old_tok.batch_decode(old_tok("I foo you<br>hello world")['input_ids'])))
<s> I foo you < br > hello world

>>> print(' '.join(new_tok.batch_decode(new_tok("I foo you<br>hello world")['input_ids'])))
<s>  I  bar  you 
 hello  world

但上述方法对mistralai/Mistral-7B-v0.3无效,针对这类问题,以下是相关技术问题的解答:

问题与解答

1. 如何为HuggingFace预训练Tokenizer添加或修改Normalizer?

有两种主流实现方式:

  • 直接替换后端归一器:对于基于HuggingFace tokenizers库的Fast Tokenizer(多数BPE类模型属于此类),可直接修改tokenizer.backend_tokenizer.normalizer。用tokenizers.normalizers模块中的组件(如Sequence、Replace、Prepend)组合出新的归一规则,赋值替换后调用save_pretrained()保存修改后的Tokenizer即可。
  • 自定义预处理逻辑:若无法直接修改后端Normalizer,可在Tokenizer的预处理阶段添加自定义函数,要么通过tokenizer.pre_processor注入,要么在调用tokenize()前手动完成文本归一化。这种方式属于额外预处理步骤,而非修改Tokenizer内置的Normalizer。

2. 是否所有预训练Tokenizer的Normalizer都可修改,还是仅特定类型可修改?

并非所有Tokenizer都支持修改Normalizer,仅基于tokenizers库的Fast Tokenizer(Rust后端实现)支持直接修改后端Normalizer。纯Python实现的Tokenizer(部分早期模型)或特殊架构的Tokenizer(如自定义字符级Tokenizer)通常不提供可修改的接口。

3. 若仅特定类型可修改,原因是什么,如何判断预训练Tokenizer的Normalizer能否扩展或修改?

原因

  • Fast Tokenizer将Normalizer作为核心可配置组件,设计时支持动态修改与序列化;而纯Python Tokenizer的归一逻辑多为硬编码,未暴露修改接口。
  • 部分新模型(如mistralai/Mistral-7B-v0.3)的归一化逻辑与预训练过程深度绑定,或其Tokenizer配置锁定了Normalizer,直接替换会破坏token映射的一致性,因此无法生效。

判断方法

  1. 检查tokenizer.is_fast属性:若值为True,则大概率支持修改后端Normalizer。
  2. 查看tokenizer.backend_tokenizer是否存在:若该属性存在且tokenizer.backend_tokenizer.normalizer不为None,则可尝试替换;反之则不支持直接修改。
  3. 查看模型的tokenizer_config.json配置文件:若包含normalizer相关配置项,说明支持修改;若无该配置或配置被锁定,则无法直接修改。

内容的提问来源于stack exchange,提问作者alvas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:02:13