粒度如何影响召回
召回质量与切分粒度强相关:块太大时相关句子被无关内容稀释,相似度下降;块太小时语义不完整,命中若干碎块也拼不出完整答案。实践中常从 256 到 512 token 起步,再用自有评测集实测调整,而不是照搬别人的参数。
基本信息
| 起步区间 | 256 至 512 token,中文语料可再按标点结构微调 |
|---|---|
| 观测指标 | 召回率、首位命中率、答案完整性 |
| 常用手段 | 父子切片、句窗扩展、上下文补标题 |
| 结论来源 | 自有评测集,而非通用经验值 |
粒度影响
| 粒度 | 典型收益 | 典型问题 |
|---|---|---|
| 小块(≤128 token) | 定位精确、区分度高 | 上下文割裂,答案不完整 |
| 中块(256~512) | 语义与定位较平衡 | 边界含义可能丢失 |
| 大块(≥1024) | 上下文完整 | 相似度被稀释,检索退化为大段文本 |
用评测对比粒度
用评测对比粒度
for size in (256, 512, 1024):
chunks = split(docs, chunk_size=size, overlap=64)
index.rebuild(embed(chunks))
print(size, eval_retrieval(queries, gold, index)) # 同期对比 recall@k使用要点
- 一次只改一个变量:粒度、模型、top-k 同时变,结论无法归因
- 评测要固定查询集:同一批问题在三档粒度上跑,结果才可比
- 同时看召回与答案质量:召回变好但答案变差,说明块被切得太碎
- 记录切片长度分布:平均值正常但长尾过长的语料仍会出问题
- 切片变更必须重建索引,不能只改检索参数
互补手段
| 手段 | 解决什么 | 代价 |
|---|---|---|
| 父子切片 | 小块检索、大块给模型 | 需要额外维护父块存储 |
| 句窗扩展 | 命中后向前后各取若干句 | 上下文长度增加 |
| 标题回填 | 碎片补上所属章节标题 | 依赖解析阶段的标题识别 |
| 上下文摘要 | 为每片生成简短语境说明 | 入库阶段增加一次模型调用 |
配合父块与子块或句窗策略,可以同时拿到小块的高定位与大块的上下文完整性;这也是缓解粒度难题的常见组合。
评测怎么做
- 评测集要标注正确答案所在位置,才可能区分是没召回还是排得靠后
- 分档统计:简单问题、跨段问题、含专名的问题各自看一遍
- 召回率与答案完整性分开记录,二者常常此消彼长
- 每档粒度都跑同样的查询与同样的 top-k,结果才可横向比较
- 把结论连同当时的切片参数一起存档,避免下次重复试验