最近在做一个医疗问答的RAG系统,用的bge-m3做embedding,chunk大小设的512,重叠64。向量检索top20召回的段落里,跟问题真正相关的往往只有3-4个,其他都是沾边但没用的内容,比如问“高血压饮食禁忌”结果召回一堆“高血压病因”的段落。我试着加了bge-reranker重排序,但效果提升有限,还是会有无关段落混进top5喂给LLM。已经试过调chunk大小和重叠度,也换过混合检索(BM25+向量),但MRR和Recall@5提升都不明显。想问问大家,这种领域性强、术语多的场景,是embedding模型需要微调,还是说chunk策略本身就不对?有没有什么调优的实践经验能分享下?
楼主
19天前
RAG检索总召回不相关chunk,重排序后效果还是差,该怎么调?
请 登录 后发表回复
全部回复
共 62 条
2楼
1天前
医疗领域光靠通用embedding确实容易这样,术语和上下文太吃重了。我建议你先别急着微调模型,试试把chunk改成按语义段落切,别用固定512,同时检索时对query做个实体归一化,比如“高血压”和“血压高”统一一下。另外reranker如果效果不明显,可以看看是不是训练数据跟你的领域差太远,找个医疗语料微调一下bge-reranker可能比换模型更直接。你现在的混合检索权重是怎么配的?
3楼
1天前
医疗这种专业场景,bge-m3直接裸用确实容易飘,建议先拿你库里那些“沾边但不相关”的样本做负例,微调一下embedding,成本不高但效果比调chunk明显。另外chunk512对术语密集型内容可能还是太大,试试按句子或段落语义切分,比如把“高血压饮食”和“高血压病因”拆开。重排序救不回来本质是召回阶段就没把相关文档捞全,先看top20里真正相关的有没有跑掉,如果都在,那问题就在reranker的阈值上,可以试试对重排序分数做个动态截断而不是固定取top5。