首页/AI/RAG 与向量库速查/按 Token 数切分

按 Token 数切分

按 token 而不是字符切分,才能与 embedding 模型的输入上限和计费口径对齐;用与实际模型一致的 tokenizer 计数可避免长块被静默截断。

RAG 与向量库速查AI更新于 2026-10-13

为什么按 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 系模型;换用其它模型或本地向量模型时,要按实际分词器重新校准切片长度,不能直接沿用同一个数值。

易错点

  • 用字符数近似 token 在中文场景误差明显,切片可能超出模型输入上限而被静默截断
  • 不同模型的 tokenizer 不同,换模型后切片长度未重新校准
  • 重叠长度按字符设置却按 token 切分,实际重叠远小于预期
  • 只在单条样例上验证参数,批量语料里的超长段落才真正触发问题

数据来源与参考

  • tiktoken 项目 README(github.com/openai/tiktoken)
  • LangChain 官方文档(from_tiktoken_encoder)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌