为什么按 token 切分
按 token 切分的价值在于口径统一:向量模型的输入上限、接口计费、上下文预算都以 token 计量,用字符数近似会在中文场景产生明显偏差。做法是先用与实际模型一致的分词器统计长度,再按目标 token 数切分,保证每块都能完整送入模型而不会被静默截断。
基本信息
| 常用工具 | tiktoken(OpenAI 系编码),本地模型用其自带分词器 |
|---|---|
| 常见编码 | cl100k_base |
| 参数口径 | chunk_size 与 chunk_overlap 均按 token 计 |
| 注意 | 换模型或换分词器后,切片长度需要重新校准 |
tiktoken 计数切分
tiktoken 计数切分
import tiktoken
from langchain_text_splitters import RecursiveCharacterTextSplitter
enc = tiktoken.get_encoding("cl100k_base")
print("token 数:", len(enc.encode("示例文本…")))
splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
encoding_name="cl100k_base", chunk_size=512, chunk_overlap=64)
chunks = splitter.split_text(text)使用要点
- 先量后切:统计语料的 token 分布,再决定 chunk_size 取值
- 重叠按 token 设:重叠过小会丢掉跨块语义,过大会让存储与检索成本上升
- 切片上限留余量:按模型上限的八到九成设置,给特殊字符与编码差异留空间
- 切片长度与查询长度分别设限:入库切片可以长,查询一般很短
- 把分词器名称写进配置,换模型时才能定位哪些参数需要重算
两种口径的差异
| 对比项 | 字符口径 | token 口径 |
|---|---|---|
| 与模型上限的关系 | 需要换算,容易超限 | 直接对齐,不易超限 |
| 中文误差 | 明显,单字常占多个 token | 无,按真实分词计数 |
| 计算开销 | 几乎为零 | 需要分词,批量处理时略慢 |
| 可移植性 | 换模型后仍可复用 | 换分词器后需重新校准 |
落地检查
- 抽一条最长切片送进向量接口,确认没有被截断或报错
- 核对入库切片的总 token 数与预估量级是否接近,偏差大说明参数没生效
- 评测时同时记录切片 token 分布,便于对比不同参数的切分方案
- 切片参数与 embedding 模型版本一起存档,重建索引时有据可依
cl100k_base 对应 OpenAI 系模型;换用其它模型或本地向量模型时,要按实际分词器重新校准切片长度,不能直接沿用同一个数值。