上下文长度(如 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),可以通过以下方法验证:

  1. 汉字验证:一个句子中有多少汉字被分解为多少 tokens。
  2. 英文验证:复杂的单词、句子是如何拆分的。
  3. 工具检查:可以使用 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。