OpenMOSS / MOSS

An open-source tool-augmented conversational language model from Fudan University
https://txsun1997.github.io/blogs/moss.html
Apache License 2.0
11.9k stars 1.14k forks source link

关于tokenizer对特殊字符的处理 #315

Open gnodgnodtonmi opened 1 year ago

gnodgnodtonmi commented 1 year ago

你好,感谢你们的出色工作。

我在使用模型的 tokenizer 时遇到了一些问题。当我使用 tokenizer 对包含连续的空格和特殊字符(如 \n, \t 等)进行 encode 操作时,我发现 tokenizer 会忽略周围有多个空格的特殊字符,或者会将这些特殊字符转为多个空格,这使得再次进行 decode 操作后,文本中这些特殊字符会丢失。测试的代码如下:

tokenizer = AutoTokenizer.from_pretrained("fnlp/moss-moon-003-sft", trust_remote_code=True)

text = "a  \n  b\n   \nc \n "

# input_ids: [64, 106058, 106058, 65, 106057, 66, 220, 56599]
input_ids = tokenizer.encode(text, add_special_tokens=False)

# 输出: "a       b     c \n "
print(tokenizer.decode(input_ids))

我按照这样测试其他模型的 tokenizer 时均未发现这个现象,其他模型的 tokenizer 对文本经过 encodedecode 后均会还原为和原来一致的文本。

这个问题是我对 MOSS 进行微调后发现的,我发现微调后的 MOSS 模型在生成代码时,当遇到代码中有换行加缩进的时候,微调模型从来不会生成换行,而原本的 MOSS 在这种情况下是会生成换行的。在我检查了 tokenizer 后发现了这一问题,请问应该如何解决呢?

MiyazonoKaori commented 1 year ago

你好,同样遇到了这个问题,请问有什么解决方法吗?

MiyazonoKaori commented 1 year ago

改了下tokenizer文件解决了。。。 moss_tokenizer.zip