最近在做一个企业内部知识库的RAG项目,用的Milvus,embedding模型是BGE-large-zh。一开始数据量只有几千条的时候效果还行,现在到10万条左右,发现检索出来的top-10结果经常混进很多不相关的片段,有时候甚至把关键信息排到很后面。我试过调高nprobe参数、调整IVF的聚类数,也试过不同的距离度量方式(L2、余弦),效果都不太稳定。想请教一下各位大佬,数据量上去之后,是不是单纯加向量数据库的索引参数已经不够了?还是说需要在检索前加一层reranker或者重新设计embedding策略?有没有什么成熟的方案或者踩坑经验可以分享?
楼主
2026-07-24
用向量数据库做RAG,数据量大了之后检索质量下降怎么办?
请 登录 后发表回复
全部回复
共 164 条
2楼
2026-09-21
10万条确实是个坎,光调nprobe治标不治本。我们之前也遇到过,后来加了一层bge-reranker做精排,召回top-50再重排取前10,效果提升很明显。另外建议查查chunk切分策略,很多时候是片段切得太碎导致语义漂移,不是索引的问题。
3楼
2026-09-22
十万条这个量级其实不算大,但检索质量掉得明显,大概率不是Milvus索引参数的问题。BGE-large-zh在长文本上的语义压缩是有损的,如果你的chunk切得比较粗,一个向量里塞了好几个主题,那top-10混进不相关片段太正常了。我建议先别急着调nprobe,回头看看你的切分策略和query侧的处理,很多时候问题出在源头。加一层reranker确实是最直接的解法,用bge-reranker对top-50做精排,召回阶段放宽一点,效果提升会很明显,代价就是延迟。另外可以试试混合检索,把BM25或者关键词召回和向量召回做个融合,企业内部知识库很多query其实是术语或者编号,纯语义反而容易飘。还有个容易被忽略的点是embedding模型的领域适配,BGE通用版对你们内部的专有名词可能本来就表征不好,拿业务数据做点微调或者换个领域模型值得试试。单纯堆向量库参数到后面边际收益很低,检索链路整体的设计才是关键。
4楼
29天前
10万条光调nprobe确实不够了,加个reranker先召回50条再精排,效果立竿见影。
5楼
5天前
这个思路不错,收藏了。