最近在折腾本地知识库问答,用的Chroma+开源embedding模型(bge-large-zh),文档切了512字符带overlap。结果发现问一些具体问题(比如“某个参数在哪个文件里配的”)时,召回的片段经常不相关,反而用ES做BM25能直接命中。是我切块策略有问题,还是embedding模型选得不对?或者向量数据库本身就不适合这种精确匹配场景?求有实战经验的大佬指点一下,现在有点迷茫,感觉技术选型可能一开始就错了。
用向量数据库做RAG,为什么感觉效果还不如直接关键词搜索?
全部回复
共 63 条说实话你这个场景我太熟了,之前做配置问答也踩过一样的坑。bge-large-zh对长尾专有名词的语义理解其实挺弱的,尤其“参数在哪个文件”这种查询本质是字面匹配,向量检索反而会把语义相近但完全不同的内容拉进来。我后来是把ES和向量检索做了混合召回,用BM25的结果做rerank,效果立竿见影。切块512的话对中文来说偏大了,试试256加128的overlap,至少能减少上下文污染。别急着否定向量库,它更适合模糊语义问题,精确查找真得靠倒排索引。
说实话你这个情况太典型了,不是选型错了,是压根没搞明白RAG和BM25各自擅长的场景。向量检索本质是在语义空间里找“意思相近”的内容,但“参数在哪个文件配的”这种问题,关键词本身就是最强的信号,embedding反而会把“参数名”和“配置文件路径”这种强关联给模糊掉。我一开始也踩过这个坑,后来发现对于这种精确匹配需求,要么直接用BM25做召回,要么用混合检索,把向量和关键词结果按权重合并,效果立刻就不一样了。至于切块,512字符带overlap对中文其实偏大,尤其技术文档里经常一个配置项就几十字,你可以试试切成256甚至128,但说实话对这类问题提升有限。真正的瓶颈在于bge-large-zh虽然语义能力强,但它在“实体精确匹配”上并不比BM25有优势,除非你的query是“类似功能的参数有哪些”这种开放语义问题。建议你先别推翻架构,加一层ES或者直接Chroma里同时存稀疏向量,跑一下混合检索看看,大概率能解决你的困惑。另外可以观察下你召回不相关的样本,是不是都是因为语义相近但实体不同,如果是,那embedding模型得换或者加rerank,但成本就上去了。
这场景本来就是BM25的强项,向量检索擅长语义模糊匹配,精确查配置用关键词反而靠谱,别迷信RAG。