切分粒度,如何影响 TopK 的风险分布

0 阅读6分钟

很多 RAG 系统的问题,早在 TopK 之前就注定了

在 RAG 系统里,TopK 往往被当成一个“显眼参数”:

  • K 设小了 → 召回不够

  • K 设大了 → 模型胡说

 

于是大家花大量时间在调:

  • TopK

  • rerank

  • embedding

 

但如果你做过几个完整项目,会慢慢意识到一件事:

 

**TopK 本身并不决定风险,

它只是把切分阶段制造的风险,

用一种更显眼的方式暴露出来。**

 

换句话说:

 

**切分粒度,已经在“分配风险”;

TopK,只是在“放大分布结果”。**

 

41.png 切分阶段 vs TopK 阶段 风险来源对比

 

一个必须先摆出来的结论(非常重要)

在正式展开之前,我先把这篇文章的核心判断写出来:

 

**切分粒度,决定的是:

风险是“集中在少数 chunk”,

还是“被稀释到整个 TopK 里”。**

 

如果你只盯着 TopK,

而从不回头看切分粒度,

你永远只是在处理“结果”,而不是“成因”。

 

第一层误解:把切分粒度当成“召回精度问题”

很多人第一次讨论切分粒度时,关注点通常是:

  • 切得细一点 → 更精确

  • 切得粗一点 → 信息更完整

 

这个理解不算错

但它只触及了最表层的问题。

 

真正更重要的是:

 

切分粒度,决定了“一个 chunk 能承载多大的语义责任”。

  • 粒度小 → 每个 chunk 责任单一

  • 粒度大 → 每个 chunk 责任混合

 

而 TopK 一旦介入,

这些责任会被批量送进模型上下文

 

第二层:切分粒度,如何改变 TopK 的“风险形态”

我们先不谈模型,只谈 TopK 看到的“世界”。

 

当切分粒度很小

  • 每个 chunk 信息单一

  • 语义指向性强

  • 上下文依赖弱

 

这时候 TopK 的风险通常是:

  • 证据不足

  • 关键前提没被召回

  • 模型开始“合理补全”

 

风险形态偏向:

 

缺失型风险(missing evidence)

 

当切分粒度很大

  • 每个 chunk 内部信息复杂

  • 条件、例外、背景混在一起

  • 很难只“取对的部分”

 

这时候 TopK 的风险往往变成:

  • 证据冲突

  • 不同 chunk 各自“看起来都对”

  • 但组合在一起逻辑不成立

 

风险形态偏向:

 

冲突型风险(conflicting evidence)

 

注意这一点非常重要:

 

**切分粒度,不是在减少风险,

而是在“选择风险类型”。**

 

第三层:TopK 为什么会“放大”切分粒度的问题

TopK 的本质,是一种概率筛选机制

 


从所有 chunk 中,

选出“最像问题”的 K 个

 

但它完全不关心:

  • 这些 chunk 是否互补

  • 是否重复

  • 是否互相矛盾

 

于是切分粒度一旦不合理,TopK 会做三件事:

  • 把同一类偏差信息集中召回

  • 把边缘但相关的信息一起拉进来

  • 放大 chunk 内部的“语义噪声”

 

结果就是:

 

**TopK 并没有帮你“多看一点”,

而是帮你“集中地看错”。**

 

42.png TopK 聚集效应示意图

 

第四层:细粒度切分下,TopK 的风险分布特征

当 chunk 切得非常细时,TopK 里常见的问题包括:

  • 同一事实的不同表述被多次召回

  • 缺乏背景说明

  • 条件信息散落在多个 chunk 中

 

这会导致模型:

  • 必须自行拼接事实

  • 依赖语言模型的“常识补全”

  • 在证据不足时自信输出

 

你会发现:

 

**TopK 看起来“相关度很高”,

但实际上“信息密度很低”。**

 

这类风险,往往在:

  • 长尾问题

  • 需要推理的问题

  • 边界条件问题

 

中爆发。

 

第五层:粗粒度切分下,TopK 的风险分布特征

当 chunk 切得很大时,问题又完全不同。

 

TopK 召回的每个 chunk,通常都:

  • 信息丰富

  • 上下文完整

  • 看起来“很有说服力”

 

但风险在于:

  • chunk 内部包含多个条件

  • 例外条款和主规则混在一起

  • 模型无法判断“哪一部分才是重点”

 

于是当 TopK 聚合多个大 chunk 时,模型面对的是:

 

多个“内部自洽,但彼此不兼容”的证据块。

 

这时候模型最常见的行为是:

  • 强行综合

  • 抹平冲突

  • 给出一个“听起来合理”的答案

 

而这,正是高风险幻觉的温床。

 

第六层:切分粒度,如何影响 TopK 的“风险集中度”

这是一个非常关键、但很少被显式讨论的点。

 

你可以把 TopK 想成一个“风险容器”:

  • K 固定

  • 容量固定

 

切分粒度,决定的是:

  • 每个 chunk 占用多少“风险空间”

 

粒度小的世界

  • 单个 chunk 风险低

  • 但 TopK 里需要拼很多块

  • 风险来自“组合失败”

 

粒度大的世界

  • 单个 chunk 风险高

  • TopK 里风险高度集中

  • 一旦选错,后果严重

 

换句话说:

 

**切分粒度在决定:

风险是“平均分布”,

还是“集中爆炸”。**

 

第七层:为什么“调 TopK”往往治标不治本

当系统开始胡说时,最常见的反应是:

  • K 小一点

  • 或 K 大一点

 

但如果你没有调整切分粒度,

你其实只是在:

  • 改变“风险暴露概率”

  • 而不是“风险结构本身”

 

比如:

  • 在细粒度切分下

 

  * K 变大 → 碎片更多,补全更多

  • 在粗粒度切分下

 

  * K 变小 → 冲突减少,但漏关键信息

 

于是你会陷入一个循环:

 

**TopK 越调越拧巴,

系统行为却始终不稳定。**

 

43.png TopK 调参循环图

 

第八层:一个极简示意,理解切分 × TopK 的关系

我们用一段非常简化的伪代码,看风险是怎么被“放大”的。

 

 


# 假设每个 chunk 都有一个隐含风险权重

chunks = split_document(document, chunk_size)

 

# 向量检索只关心相似度

topk_chunks = topk_by_similarity(chunks, query, k=K)

 

# 模型看到的是这些 chunk 的“并集风险”

total_risk = sum(chunk.risk for chunk in topk_chunks)

 

 

关键不在于 K

而在于:

  • chunk.risk 的分布

  • chunk_size 如何塑造这个分布

 

如果单个 chunk 风险就很高,

TopK 只会把它们一起端上来。

 

第九层:什么时候切分粒度已经“明显不对”

在工程实践中,你可以留意一些非常直观的信号:

  • TopK 里的 chunk 经常“看起来都对,但用不了”

  • 模型回答越来越像“综合作文”

  • 同一个问题,多次问答案差异很大

  • 调 TopK 效果越来越有限

 

这些都在暗示:

 

**问题已经不在 TopK,

而在切分粒度。**

 

一个非常实用的自检问题(强烈建议)

在你准备继续调 TopK 之前,可以问自己一句话:

 

**如果我只看 Top1,

这个 chunk 是否已经承担了

“回答这个问题所需的主要责任”?**

  • 如果不能 → 粒度可能太细

  • 如果承担过多 → 粒度可能太粗

 

这是一个比任何指标都更有效的判断方式。

 

很多团队在 RAG 系统中反复调整 TopK,却忽略了切分粒度对风险分布的决定性影响。用LLaMA-Factory online对不同切分策略下的 TopK 行为进行对照分析,更容易看清:风险是在切分阶段被制造的,还是在检索阶段被放大的。

 

总结:TopK 放大的是切分的后果,而不是问题本身

我用一句话,把这篇文章彻底收住:

 

**切分粒度,

早在 TopK 之前,

就已经决定了

模型将以什么方式犯错。**

 

当你开始:

  • 把切分看成风险建模

  • 而不是文本处理

  • 把 TopK 看成放大器,而不是修复器

 

你才真正开始工程化地设计 RAG 系统