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

如何将自定义训练的BPE分词器词汇更新到预训练Tokenizer中

可行实现方案

transformers加载的默认是fast分词器,其Python层面暴露的vocab属性是底层Rust实现的分词器实例的只读映射,直接修改vocab字典、执行update或者赋值操作都不会同步更新底层结构,因此不会生效。

方案1:仅修改已有token的id(适配原始需求)

如果你的需求确实是用自定义分词器中相同token的id,覆盖预训练分词器的原有id,可以直接操作fast分词器的底层实例:

custom_vocab = tokenizer.get_vocab()

for token, custom_idx in custom_vocab.items():
    # 仅更新两个分词器共有的token
    if token in pr_tokenizer.vocab:
        # 调整底层token映射的id
        pr_tokenizer._tokenizer.model.set_id(token, custom_idx)

注意:修改完成后可以用pr_tokenizer.vocab[目标token]验证id是否已经更新成功

方案2:保留预训练分词器配置,替换完整词汇表

如果你需要完全使用自定义训练的BPE词汇逻辑,同时保留预训练分词器的填充、截断、特殊token等使用习惯,可以直接将自定义分词器包装为transformers兼容的格式:

from transformers import PreTrainedTokenizerFast

# 导出自定义训练的分词器配置
tokenizer.save("custom_bpe_tokenizer.json")

# 基于预训练分词器的配置,生成新的兼容分词器
updated_tokenizer = PreTrainedTokenizerFast(
    tokenizer_file="custom_bpe_tokenizer.json",
    unk_token = pr_tokenizer.unk_token,
    cls_token = pr_tokenizer.cls_token,
    sep_token = pr_tokenizer.sep_token,
    pad_token = pr_tokenizer.pad_token,
    mask_token = pr_tokenizer.mask_token,
    model_max_length = pr_tokenizer.model_max_length,
    truncation_side = pr_tokenizer.truncation_side,
    padding_side = pr_tokenizer.padding_side
)

重要提醒

如果你后续需要搭配原始的distilbert-base-uncased预训练权重使用修改后的分词器,修改原有token对应的id会导致分词输出的输入id和模型预训练时的词汇表完全不匹配,直接使用会得到错误的输出。这种场景建议优先选择向预训练分词器添加新词,而非修改原有token的id映射。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:09:04