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

如何向已有的Huggingface AutoTokenizer中添加新token?

如何向已有的Huggingface AutoTokenizer中添加新token?

要在现有AutoTokenizer基础上扩展词汇表(不重新训练、保留原token索引),你需要使用add_tokens()方法,而非train_new_from_iterator()——后者会从头训练新的tokenizer,完全替换原有的词汇体系。

错误方法回顾

你之前尝试的train_new_from_iterator()会重新训练tokenizer,导致原token的索引被覆盖,新token从预留ID之后开始分配:

import pandas as pd

def batch_iterator(batch_size=3, size=8):
        df = pd.DataFrame({"note_text": ['foobar', 'helloworld']})
        for x in range(0, size, batch_size):
            yield df['note_text'].to_list()

old_tokenizer = AutoTokenizer.from_pretrained('roberta-base')
training_corpus = batch_iterator()
new_tokenizer = old_tokenizer.train_new_from_iterator(training_corpus, 32000)

print(len(old_tokenizer))
print(old_tokenizer( ['foobarzz', 'helloworld'] ))
print(new_tokenizer( ['foobarzz', 'hello world'] ))

输出:

50265
{'input_ids': [[0, 21466, 22468, 7399, 2], [0, 20030, 1722, 39949, 2]], 'attention_mask': [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]}
{'input_ids': [[0, 275, 2], [0, 276, 2]], 'attention_mask': [[1, 1, 1], [1, 1, 1]]}

正确实现方法

使用add_tokens()直接向现有tokenizer添加新token,新token的ID会从原词汇表长度开始分配:

from transformers import AutoTokenizer

# 加载原有tokenizer
old_tokenizer = AutoTokenizer.from_pretrained('roberta-base')
print(f"原词汇表大小: {len(old_tokenizer)}")

# 定义要添加的新token
new_tokens = ['foobar', 'helloworld']
# 添加新token
num_added_tokens = old_tokenizer.add_tokens(new_tokens)
print(f"成功添加 {num_added_tokens} 个新token")
print(f"扩展后词汇表大小: {len(old_tokenizer)}")

# 测试效果
test_texts = ['foobar', 'helloworld', 'foobarzz']
print(old_tokenizer(test_texts))

输出示例:

原词汇表大小: 50265
成功添加 2 个新token
扩展后词汇表大小: 50267
{'input_ids': [[0, 50265, 2], [0, 50266, 2], [0, 50265, 22468, 7399, 2]], 'attention_mask': [[1, 1, 1], [1, 1, 1], [1, 1, 1, 1, 1]]}

注意事项

  1. 添加token后,如果要将新词汇表应用到模型,需要同步扩展模型的embedding层:
    from transformers import AutoModel
    
    model = AutoModel.from_pretrained('roberta-base')
    model.resize_token_embeddings(len(old_tokenizer))
    
  2. add_tokens()支持批量添加单个token,也可以添加子词(但需确保tokenizer的分词逻辑兼容)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:47:28