Appearance
3.4.2 为什么有时小块更适合召回,但大块更适合生成?
先给结论:因为召回阶段更需要“局部命中能力”,而生成阶段更需要“上下文完整性”。
这就是为什么很多系统会出现一种典型张力:
- 小块召回更准
- 大块生成更稳
为什么小块常常更适合召回
1. 更容易对准问题局部
用户问题很多时候并不需要整段说明,只对应某个小规则、某个定义、某个例外条款。
块越小,系统越容易直接命中这些局部内容,而不是先命中一整段较大的背景文本。
2. 无关内容更少
块小的时候,单个候选里通常混入的无关内容更少。
这样在相关性比较时,真正有用的局部信号会更突出。
3. top-k 更像“证据点”
小块检索回来的一组结果,通常更像一组“答案证据点”,而不是几篇大而宽泛的相关材料。
这对于提高初始召回精度通常是有帮助的。
为什么大块又常常更适合生成
1. 语义更完整
模型真正生成回答时,往往不只需要看到一句局部结论,还需要知道:
- 这句话的前提是什么
- 有没有例外条件
- 它和上一句、下一句是什么关系
大一点的块通常更容易保留这些信息。
2. 模型更少需要自己补上下文
如果给模型的都是碎片化小块,它就更容易:
- 漏掉限制条件
- 把相邻关系理解错
- 把局部规则说得过于绝对
而块稍大一点时,模型通常更容易把意思说完整。
3. 引用和解释更自然
从读者体验看,一大段结构相对完整的上下文,通常也比一堆零碎短句更容易解释和引用。
一个直观例子
假设文档里有这两句:
text
普通商品签收后 7 天内支持无理由退货,但定制类商品不适用该规则。
如存在质量问题,可在 15 天内申请售后。如果用户问的是:
“定制类商品可以提现吗?”
小块召回时,最可能命中的可能只是:
- “定制类商品不适用该规则”
这对召回很有帮助。
但如果生成时只给模型这一句,它就容易少掉背景:
- 不适用的是哪条规则
- 和普通商品规则的对比关系是什么
这时给模型一个更完整的大块,往往回答会更自然、更稳。
这两者之间的典型拉扯
系统如果只有一套块,常见就会落入下面这种拉扯:
块调小
优点:
- 召回更尖锐
- 局部命中更强
缺点:
- 生成更碎
- 模型更容易缺前提
块调大
优点:
- 生成更顺
- 语义更完整
缺点:
- 召回更粗
- 无关内容更多
所以这不是单纯“哪个更好”的问题,而是它们在解决不同阶段的不同目标。
一个最小示意
python
retrieval_chunk = "定制类商品不适用该规则。"
generation_chunk = """
普通商品签收后 7 天内支持无理由退货,但定制类商品不适用该规则。
如存在质量问题,可在 15 天内申请售后。
"""这个例子最想说明的是:
- 小块更像“定位器”
- 大块更像“回答上下文”
什么信号说明你已经开始遇到这种拉扯
如果你经常看到这些现象,通常说明问题已经开始出现:
- 召回结果看起来很准,但回答像碎片拼接
- 模型总漏掉限制条件和例外情况
- 为了回答更顺你把 chunk 调大,结果召回又开始变粗
这时候,继续只围绕一个全局 chunk size 来回调,往往收益会越来越小。
一句话总结
小块更适合召回,因为它更容易精准命中局部证据;大块更适合生成,因为它更容易保留完整上下文。两者看起来冲突,其实是因为它们本来就在服务不同阶段的不同目标。