最近在折腾一个基于本地llama.cpp和ChromaDB的RAG系统,想给内部文档做个问答助手。用的是Qwen2.5-7B和bge-small-zh的embedding模型。问题是检索出来的top5结果感觉跟问题相关性不高,比如问“报销流程”却返回一堆“出差申请”的内容。我已经把chunk_size从512调到256了,还是不太行。想问下各位大佬,是不是embedding模型选错了?还是说需要加reranker?或者我的chunk重叠策略有问题?求指点,感觉卡在这儿好几天了。
楼主
1天前
用本地开源模型搭RAG,检索出来的内容老是不对味,咋调?
请 登录 后发表回复
全部回复
共 1 条
2楼
19小时前
说实话你这情况我太熟了,之前用bge-small-zh的时候也翻过车,感觉它对那种语义相近但实体不同的文本区分力不太够,“报销”和“出差申请”这种在词向量空间里可能真挨得挺近。我个人觉得可以先换个embedding模型试试,比如bge-m3或者stella-base-zh,它们对中文长文本的区分度会好一些,而且你这7B模型本身不差,别被小embedding拖了后腿。另外chunk size调成256后,如果文档里“报销流程”和“出差申请”经常出现在同一段落里,那哪怕重叠策略改得再花哨,检索出来的还是容易混,建议你观察下原始文档里这两个概念是不是经常挨着写,如果是的话不如干脆按章节标题把chunk切得更干净点。至于reranker,加一个肯定能提升准确率,但本地部署的话得考虑性能开销,像bge-reranker-v2-m3这种轻量级的可以试试,不过得先确认你机器跑得动。还有个取巧的办法,就是在检索前加个简单的关键词预过滤,比如用户问“报销流程”时先强制把“出差”相关的embedding分数降权,虽然粗暴但很有效。总之别只盯着参数调,先看看原始数据里chunk边界的语义干净度,这个往往比模型本身更关键。