这道题其实是在问,怎么让[[RAG]]系统从知识库里精准捞出有用的信息,本质是个匹配问题。我主要从评估、检索模型、[[重排]]和数据质量几个角度来说。
先说评估。检索阶段和生成阶段的关注点不一样,检索阶段我只看召回率,就是正确答案在不在TopK里,用 Recall@K 来衡量。如果场景对顺序敏感,比如客服系统里必须把最相关的退款政策排第一,那我还会看 MRR,也就是第一个正确答案的排名。但端到端评估像[[RAGAS]]那种,是测最终答案好不好,这跟检索评估是两码事,我一般分开看。
然后说检索模型优化。这里有个很实际的选择:用关键词还是向量。关键词检索像 [[BM25]],对专有名词、订单号这类精确匹配特别稳,可解释性强,但语义理解弱。向量检索 [[Embedding]] 语义能力强,但领域不匹配时效果会崩。真正落地我倾向 [[混合检索]],把 BM25 和向量分数加权融合,或者用 RRF 合并排名。举个例子,在企业SOP合规文档场景,员工问“报销流程”,关键词可能漏掉“费用申请”这种同义词,向量能补上;但如果搜“合同编号123”,关键词更准。所以两条腿走路更稳。
这里有个前提,就是向量模型要领域适配。直接用通用模型,比如中文场景用开源的bge,如果不微调,对业务术语的理解可能不准。常见失败场景是,把“满减”和“优惠券”当成不相关的向量,导致漏召回。所以我会用业务数据做对比学习微调,或者用 HyDE 先生成伪文档再检索,能缓解一点。
再一个就是重排序策略。检索阶段拿回Top100,但精度不够,需要精排。我一般用 [[Cross-Encoder]] 模型,它把查询和文档同时输入做交互,精度高,但慢,所以只对Top100做重排,取Top10。另一个方案是 [[ColBERT]],用后期交互平衡效率和效果,适合在线场景。但重排不是万能的,如果检索阶段Top100里就没有正确答案,重排也救不了。所以我会先保证检索召回率,再靠重排提升排序质量。
数据质量这块,最容易被忽视。文档切分是个大坑,固定按500字切,可能把完整逻辑切碎。我倾向语义切分,按段落或主题分,控制chunk在300到500 tokens。另外,信息密度低的内容,比如网页里的广告、无关注释,要清洗掉。还有个坑:多跳关联的文档,比如一个政策引用了另一个政策,如果没显式链接,检索会漏。我有时会用 [[知识图谱]] 来显式关联,但成本高,只有关键场景才做。
最后提一句,如果知识库有强关联结构,比如法律合同引用了多个条款,我会考虑用 [[GraphRAG]] 来增强召回,但它的工程复杂度很高,不是所有场景都值得。
所以总结一下,我会把召回优化看成一条链路:先保证数据质量,再选合适的检索模型,用重排兜底,评估时关注Recall@K和MRR。我更倾向于混合检索加领域微调这个组合,因为它在大多数业务场景里性价比最高。