最近在做RAG项目,用的Milvus + bge-large-zh,文本分块固定512字符,overlap设了64。检索出来的top5结果总感觉相关度不够,比如问“合同违约金的计算方式”,召回的片段却是合同里其他条款的内容。手动看了一些chunk,发现很多语义完整的段落被切碎了,尤其是有小标题和列表的地方。想问问大家,这种情况一般是分块策略的问题,还是embedding模型本身对长文本的语义捕捉能力有限?有没有比较系统的调优路径可以参考?先谢过各位了。
楼主
2026-08-23
向量数据库召回率一直上不去,是分块策略问题还是embedding模型选错了?
请 登录 后发表回复
全部回复
共 45 条
2楼
2026-09-24
512字符固定切确实太粗暴了,碰到小标题和列表基本必碎。我之前也遇到过类似情况,后来改成按标题层级+语义段落切,召回明显好转。你的case感觉更像是分块把“违约金计算方式”这个完整语义单元切散了,embedding再好也救不回来。建议先别急着换模型,拿几个bad case手动重切一下,对比召回效果,能快速定位是切分还是模型的问题。
3楼
4天前
写得挺好,建议补充一些性能数据。
4楼
4天前
刚入门,这个对我帮助很大。
5楼
3天前
固定512字符切分确实容易把语义切碎,尤其合同这种带小标题和列表的结构化文本,标题和内容被分到两个chunk里,embedding再强也救不回来。我建议先别怀疑模型,把chunk拿出来人工看一遍,如果语义断裂明显,那八成是分块的问题。可以试试按标题层级或段落做递归切分,overlap适当加大到100左右,或者用语义分块工具先跑一版对比召回效果。另外bge-large-zh对中文短query和长chunk的匹配本身有点吃亏,query那边也可以做一下改写或扩展。调优路径我一般是这样:先固定embedding,只调分块看recall变化,再换模型对比,最后才动top-k和rerank。你们现在有做召回的人工标注集吗?没有的话先建个小规模的,不然调参全靠感觉很难定位问题。
6楼
2天前
先试试按小标题和列表结构切,固定512字符肯定把完整语义切碎了,再考虑换模型的事。