上下文长度(如 100K tokens)指的是模型可以处理的 token 数量,而 token 是模型的最小语言单元,具体取决于文本的分词方式。
1. Token 对汉字和英文的占用
- 汉字:通常一个汉字被视为一个 token(例如,“你好”是 2 个 token)。
- 英文:
- 单个 英文单词 通常是一个 token,但更长的单词可能会被拆分成多个 token。例如:
-
hello
是 1 个 token。 -
extraordinary
可能是 2-3 个 token。
- 单个 字母 通常作为部分单词的一部分,不会单独计为一个 token。
2. 100K token 是多少个汉字和英文内容
- 汉字:如果是纯汉字内容,100K tokens 理论上就是 100,000 个汉字。
- 英文:
- 如果平均一个单词是 1.5 个 token(短单词少,长单词多),100K tokens 大约对应 66,666 个英文单词。
- 如果全部是简单单词(如 “cat”、“dog”),100K tokens 大约对应 100,000 个英文单词。
3. 汉字和英文的混合情况
在混合文本中,token 数量取决于具体的语言分布和单词/汉字的复杂程度。一般来说,纯汉字文本占用的 token 数少于同样字符数的英文文本。
4. 具体计算方式
分词的细节取决于所使用的分词器(Tokenizer),可以通过以下方法验证:
- 汉字验证:一个句子中有多少汉字被分解为多少 tokens。
- 英文验证:复杂的单词、句子是如何拆分的。
- 工具检查:可以使用
transformers
库的 tokenizer 来测试分词器的实际表现。
示例代码
使用 transformers
中的 tokenizer 检查:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("defog/sqlcoder-70b-alpha") # 替换为实际模型的分词器
# 汉字和英文内容
chinese_text = "这是一个测试。"
english_text = "This is a test sentence to measure tokenization."
# 计算 token 数量
chinese_tokens = tokenizer(chinese_text, return_tensors="pt")
english_tokens = tokenizer(english_text, return_tensors="pt")
print(f"汉字: {len(chinese_tokens['input_ids'][0])} tokens")
print(f"英文: {len(english_tokens['input_ids'][0])} tokens")
总结
- 100K token 的内容范围:
- 100,000 个汉字。
- ~66,666 到 100,000 个英文单词(视单词复杂性)。
- 汉字更节省 token 数量,因为每个汉字通常是 1 个 token,而英文的单词或复杂拼写会占用更多的 token。