最近在搭一个基于本地知识库的RAG问答系统,用的是langchain+chroma,文档主要是技术手册和产品FAQ。目前碰到一个头疼的问题:用户问“第三版接口变更了哪些内容”,结果系统总是召回一些无关的旧版文档片段,相关文档却排得很靠后。我试过换chunk大小,从500到200字都试了,效果还是不好。想请教下各位老哥,这种情况是不是embedding模型选错导致的?目前用的是text-embedding-ada-002,有没有更适合中文技术文档的模型推荐?或者是我其他环节(比如检索策略)的问题更大?求指点,先谢过了!
RAG系统检索召回率低,是不是embedding模型选错了?
全部回复
共 129 条说实话ada-002对中文长尾词和版本号这种语义区分确实不太行,我试过换成bge-large-zh,召回率明显上来了。不过你这问题可能不全是embedding的锅,chunk切分方式也值得看看,技术手册里版本变更这种信息经常被拆得稀碎,试试按章节标题或者语义边界切,别死板按字数。另外检索策略上,可以加个rerank环节,比如用bge-reranker把召回的top20再精排一下,能救回来不少。你先用现成的中文embedding模型跑个对比,再调其他环节,一步步来别急。
检索策略影响更大,试试混合检索加BM25,光换embedding解决不了版本语义偏移。
这问题我踩过类似的坑,baai/bge-large-zh-v1.5这类中文embedding在技术文档上比ada-002强不少,你可以先换个模型试试。不过我觉得你这情况更像chunk切分和检索策略的问题,特别像“第三版接口”这种带版本号的查询,得考虑把文档标题和版本信息一起embedding进去,不然语义很容易偏。另外建议查一下choma的检索返回是不是只用了向量相似度,可以试试加个MMR或者rerank,把相关性分数重新排一下,效果可能会立竿见影。
换bge-m3或m3e试试,中文场景比ada-002强不少,另外检索时考虑下关键词权重,问题可能出在混合检索上。
你这问题大概率不是embedding的锅,先查查chunk重叠和元数据过滤,第三版这种版本敏感信息得靠检索策略兜底。
建议先看看检索策略,试试混合检索加rerank,比光换embedding模型见效快。
中文技术文档试试bge-m3,ada-002对中文长尾词确实不太行,另外建议查下检索策略是不是该上重排序了。
光换embedding解决不了这个问题,你举的例子更像查询意图和文档内容对不上。ada-002对中文长尾词确实一般,试试bge-m3或text2vec-large-chinese,但先别急着重训,建议检查下chunk是不是把版本号或关键词拆散了。另外你召回率低有多低?TopK设多少?可以试试加一层BM25混合检索做rerank,很多时候问题出在纯向量检索对精确匹配不友好。
换bge-m3或m3e试试,中文场景比ada-002强不少,另外查查元数据过滤,版本问题光靠向量不好解。
chunk调参救不了语义错位,先看看是不是检索时没带版本过滤条件,不然换啥模型都白搭。
这问题多半不在embedding,混合检索加个rerank试试,关键词匹配对“第三版”这种词很关键。