这个坑值得记一笔。为了让答案更完整把 chunk 从 512 调到 1024,召回率从 0.81 掉到 0.72,检索回来的段落里混进大量无关内容,重排之后仍然答偏。

刚开始盯着「top_k 不变时总上下文超出预算被截断」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。块变长后单块语义被稀释,向量不够聚焦;重叠比例没跟着调,重复内容占比上升;评测只看了答案质量,没有单独看召回。

先按块长分桶统计召回率

python recall_eval.py --chunks chunk_512,chunk_1024 --queries q_300.jsonl

然后把重叠比例从 100 降到 50 再测

python build_chunks.py --size 1024 --overlap 50 --out chunks_v2.jsonl

试父子块结构,用小块检索大块补全

python build_chunks.py --size 256 --parent 1024 --out chunks_v3.jsonl

剩下的就是对比三种方案的召回与答案质量

python ab_rag.py --sets v1,v2,v3 --queries q_300.jsonl

别只看报错消失,验证要多做一步。小块检索加父块补全的方案召回回到 0.83,答案完整度没有下降,平均上下文长度减少 18%。

这里还有个坑。块长不是越大越好,召回看的是块内语义是否聚焦;用小块检索、大块补全,比直接放大块长更划算。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189