高阶RAG-ReRank

1.背景-现RAG存在的问题

现在很明显,仅仅依靠向量检索技术不足以开发 RAG 应用程序,尤其是在生产环境中部署。

以下为案例:

  • 关键词搜索容易返回不回答问题的结果
  • 稠密检索容易返回不正确的结果

实际RAG检索中也有很多类型问题,关键词或者稠密检索知识基于向量相似度,完全没有考虑逻辑语义。导致检索失败,有时适得其反。

2.ReRank的原理

ReRank 在许多 QA 对上进行了训练

  • ReRank Model是通过监督学习训练好的预训练模型
  • 给定大量正确的查询-文件对(QA pairs),让模型学习给出高分数
  • 同时给定大量不正确的查询-文件对,让模型学习给出低分数
  • 通过最大化正确对的分数和最小化不正确对的分数来训练
  • 经过训练后,ReRank 就能区分查询和文件之间的关联性
  • 从而按照相关性对检索结果进行排序

直接看ReRank的原理图

  • ReRank 可以给查询和回答一个相关性分数,从而排序结果
  • ReRank 可以用来改进关键词检索和稠密检索,找到正确答案

rerank 模型通过根据候选文档与用户查询的语义一致性对候选文档进行重新排序来增强语义排序结果。 其核心原则包括计算用户问题与每个文档之间的相关性分数,然后返回按相关性排序的文档列表,从高到低。流行的rerank模型包括 Cohere rerank、bge-reranker 等。

通常,在rerank之前进行初步搜索,因为计算查询与数百万个文档之间的相关性分数效率非常低。因此,rerank通常位于搜索过程的末尾,使其成为合并和排序来自各种搜索系统的结果的理想选择。

然而,重新排名不仅限于组合来自不同搜索系统的结果。这在单一搜索模式下也很有用。引入重新排名步骤,例如语义重新排名后关键字搜索,可以显着提高文档召回率。

在实际应用中,除了规范化多个查询结果之外,传递给大型模型的文本段数量通常在提供它们之前受到限制(即 TopK,可在重新排名模型参数中调整)。此限制是由于大型模型的输入窗口大小,通常范围为 4K 到 128K token。因此,有必要选择与模型的输入窗口大小约束相一致的合适分割策略和 TopK 值。

重要的是,即使模型的上下文窗口足够大,过多的chunk片段也会带来不太相关的内容影响prompt结构内容,从而降低答案的质量。因此,重新排名中较大的 TopK 参数并不是越大越好。prompt中放入越多的无关知识,会干扰大模型的生成能力。

重新排序不应被视为搜索技术的替代品,而应被视为增强现有搜索系统的补充工具。它的主要优势在于提供了一种简单、低复杂性的方法来优化搜索结果,从而能够将语义相关性集成到当前的搜索系统中,而无需进行重大的基础设施修改。

3.基于LLM或者Agent的ReRank

以下过程展示了Embedding检索后,将检索结果返回给大模型去做一次评估。类似CRAG或者Self-RAG,本质上都是利用了大模型的推理能力加强检索的准确性。由之前的完全由 向量检索相似度 转化为逻辑推理相似度。但是这种方案会降低RAG的效率,提升了准确度。

4.其它ReRank方案 

4.1. 使用更精细的评分函数

RAG通常会在检索阶段根据输入问题或上下文生成一系列候选文档,然后利用这些文档的信息进行生成式回答。
reranking可以通过设计更精细的评分函数,对这些候选文档进行重新排序,优先选择与输入问题更相关、质量更高的文档作为生成回答的依据。
这可能涉及:
融合更多特征:除了原始的检索得分(如BM25分数),考虑加入其他特征,如文档长度、主题相关性、实体提及次数、段落位置等,以更全面地评估文档与问题的匹配程度。
引入深度学习模型:使用预训练的语言模型(如BERT、RoBERTa等)计算问题与文档的语义相似度,或者使用专门针对文档相关性设计的模型(如ANCE、DPR等)进行reranking。
考虑上下文敏感性:对于多轮对话或具有明确上下文的场景,评分函数应考虑上下文信息,确保所选文档不仅与当前问题相关,还与对话历史或上下文保持一致。

4.2. 集成外部知识

在reranking阶段,可以引入外部知识源(如百科、词典、专家规则等)来辅助判断文档的质量和相关性。例如:
利用领域专业知识:对于特定领域的应用,如医疗、法律、金融等,可以利用领域知识库或规则库来筛选出符合专业要求的文档。
利用常识知识:使用常识推理模型或知识图谱来判断文档内容是否符合常识,避免生成不符合事实的回答。

4.3. 采用多阶段reranking

将reranking过程分为多个阶段,逐步精细化文档排序:
粗排阶段:首先基于简单、高效的指标(如BM25得分)进行初步排序,筛选出一部分高潜力文档。
精排阶段:对粗排后的文档集使用更复杂的评分函数或模型进行二次排序,进一步提升相关文档的优先级。
微调阶段(可选):对于某些关键应用场景,可以加入人工规则或专家干预的微调阶段,确保最终选择的文档满足特定业务需求。
 

5.ReRank的意义

引入Rerank模型后的retrieval引擎能够去除上下文不相关的污染数据、提供更精准的上下文信息。重排后(Rerank)精准的上下文不仅可减少了token的使用量进而还可能提高LLM推理速度与准确率。

### RAG 架构中的重排序 (Rerank) 模型 #### 工作原理 在检索增强生成(Retrieval-Augmented Generation, RAG)架构中,重排序模型用于优化初始检索阶段获得的文档片段列表。通过评估这些片段与查询之间的相关性,重排序过程能够更精准地筛选出最有可能帮助生成高质量响应的内容[^1]。 具体来说,当用户输入一个问题或提示时,系统首先利用索引数据库执行快速检索操作来获取一批候选文档片段;接着,重排序模块会对这批初步选定的结果集进行二次处理——基于更加复杂的匹配算法计算各条目同原始请求间的相似度得分,并据此调整顺序,使得最终呈现给下游任务使用的资料具备更高的针对性和准确性[^2]。 #### 使用方法 为了实现上述功能,在实际开发过程中可以借助Hugging Face提供的Text Embedding Inherence工具部署专门训练过的重排序模型实例。该流程通常涉及以下几个方面: - **定义数据管道**:构建连接上游检索组件与当前环节的数据流路径,确保能顺利接收待评分项目作为输入并向后续步骤传递经过重新排列后的输出结果; - **调优超参设置**:根据实验反馈不断迭代修改影响性能表现的关键因子直至达到满意的效果为止。 ```python from transformers import AutoModelForSequenceClassification, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("cross-encoder/ms-marco-MiniLM-L-12-v2") model = AutoModelForSequenceClassification.from_pretrained("cross-encoder/ms-marco-MiniLM-L-12-v2") def rerank(query, documents): inputs = tokenizer([query]*len(documents), documents, return_tensors="pt", padding=True, truncation=True) outputs = model(**inputs).logits.flatten().tolist() ranked_docs = sorted(zip(outputs, documents), reverse=True) return [doc for score, doc in ranked_docs] ``` 此代码展示了如何使用交叉编码器模型来进行简单的重排序任务。这里选择了`ms-marco-MiniLM-L-12-v2`这个针对MARCO数据集微调过的小型BERT变体版本作为例子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值