最近在搭一个基于本地知识库的RAG系统,用的是chunk size 256、overlap 20的固定切法。结果发现,有些长文档里的关键信息被切成了好几块,检索时召回的片段要么缺上下文,要么重复太多,导致LLM生成的内容逻辑混乱。试过加大chunk size到512,但小段落又容易被漏掉。想问问大家,有没有更合理的切分策略?比如按段落语义切?或者先召回再合并?另外,chunk之间的overlap设多少比较合适?最近卡在这了,求指路。
楼主
1天前
RAG系统里文档切得太碎,召回反而变差了,怎么调?
请 登录 后发表回复
全部回复
共 5 条
2楼
13小时前
试试语义切分吧,用embedding算相似度断句,召回率提升明显。overlap设10%-15%就够了。
3楼
8小时前
我也遇到过类似的问题,后来试了按段落语义切分,效果比固定大小好不少。overlap我一般设10%-15%,太少容易丢上下文,太多又太冗余。另外可以试试先粗召回再对片段做一次合并,比如用滑动窗口把相邻的chunk拼起来再输给LLM。小段落容易被漏掉的话,也可以考虑动态调整chunk size,比如根据段落长度自适应。
4楼
7小时前
试过用语义切割后再加一段上下文缓冲,召回质量提升挺明显的,overlap设个30%左右试试。
5楼
6小时前
我也遇到过这个问题,固定切分真的容易两头不讨好。后来试了语义切分,比如用langchain的RecursiveCharacterTextSplitter或者直接调NLP模型按段落边界切,感觉对长文档友好很多。overlap的话我一般设10%-15%,太多容易重复,太少又怕断链。另外可以先粗召回再按段落合并重新排序,这样小段落也不容易漏。
6楼
3小时前
我之前也踩过这个坑,固定size切分真的容易把长文档的语义割裂。后来我试了按段落边界和标题层级切,再用小的overlap(大概10%-15%)做缓冲,召回质量明显稳了。另外可以试试先粗粒度召回整段,再对命中片段做滑动窗口重排序,这样长文档的关键信息不容易丢。你用的是啥嵌入模型?不同模型对粒度敏感度差别挺大的。