检索是RAG系统至关重要的一个部分。目前本人了解的优化方向有两个,一是提高召回率,二是增加多样性。
召回率是检索的基础,能准确的找到目标文档才能为后续的生成模型提升正确的指导。
提高召回率有几个非常直观的方法:
- 检索加排序的结构,先从大量文本中用bi_encoder检索出n个的相关文档,再利用cross_encoder/ColBert 对这n个模型进行排序,从中选择相关性前k个作为检索结果。
- 微调用于嵌入embedding模型
- 同时使用 基于词法的关键词检索 和 基于语义的向量检索
从增加多样性来看,有一个非常直观的方法:
- 先从候选集中选择与问题最相关的文本块,然后再依次选择与已有结果最不相似的。
可以从LangChain的Retriver中看到一些其他的策略,例如:
- 生成问题的变体:
MultiQueryRetriever
- 集成多个嵌入模型:
MultiVectorRetriever
- 检索时直接避免重复:
Max marginal relevance
- 使用元数据对检索内容进行过滤:
Self Query Retriever
综合应用这些方法,可以通过提高所检索到的Context的质量有效提升RAG系统的效果。