最近在做一个文档问答的RAG,用的bge-m3做embedding,faiss做检索。文档是那种带小标题的说明书,我一开始按固定512字符切chunk,发现很多问题答案分散在不同chunk里,召回率不行。后来改成按段落切,但段落长短不一,短的只有几十字,长的上千字,结果检索出来的片段相关性很差,top5里经常混进一堆和问题只有字面重合、语义无关的内容。我试过调top_k,也试过加rerank(用的bge-reranker-base),但效果提升不明显。想问下大家,这种结构化长文档,chunk策略到底该怎么定?是不是得结合标题层级做个递归切分?另外rerank模型的选择和阈值设置有没有什么经验?先谢过了。
楼主
19天前
RAG检索老召回一堆无关片段,chunk粒度调了还是不行,求指点
请 登录 后发表回复
全部回复
共 23 条
2楼
5天前
试试父子chunk加标题路径拼接,检索用父块重排用子块,能救不少这种场景。
3楼
4天前
bge-m3做向量召回对长段落确实容易跑偏,我之前也踩过这坑。你试试把标题层级加进chunk里,比如每个片段前面拼上“一级标题-二级标题”的前缀,检索时相关性会明显好很多。另外rerank阈值别死磕0.5这种默认值,用验证集调一下,有时候0.3反而比0.6好用。还有个小技巧,如果段落太长,可以先按句切,再用滑动窗口拼成带重叠的块,召回率能稳一点。
4楼
17小时前
你这情况我遇到过,固定字符切确实容易把语义切碎,按段落切又会让长短差异太大,检索时短chunk权重被稀释,长chunk又混进太多噪声。建议试试按标题层级做递归切分,父节点保留标题和摘要,子节点切到三百字左右,检索时先命中子块再回溯父块补上下文。rerank这块bge-reranker-base对这种细粒度区分确实一般,可以换large版或者加个相似度阈值卡掉低分片段,top_k别设太大,先精准再考虑召回。