《Advanced RAG》-11-RAG查询分类和细化

总结

文章介绍了两种高级的检索增强生成(RAG)技术:自适应 RAG 和 RQ-RAG,以及它们在问题复杂性学习和查询细化方面的应用和优势,以及如何通过小型模型的训练来提高这些技术的性能。

摘要

传统 RAG 技术虽然能够减少大型语言模型(LLM)答案的不准确性,但不能增强初始查询。

自适应 RAG 和 RQ-RAG 两种技术,通过对小型模型的训练,提出了查询分类和查询细化的概念,以适应不同复杂度的查询。

  • 自适应 RAG 通过精心构建的分类器根据查询的复杂程度,动态选择最合适的 LLM 策略,包括迭代、单一甚至无检索方法。
  • RQ-RAG 则侧重于学习如何根据需要重写、分解和消除查询的歧义,以提高信息检索的质量。

文章详细描述了自适应 RAG 的整体流程,包括如何根据查询的复杂性选择合适的工具,以及如何使用 LlamaIndex 版本的代码来解释这一过程。还强调了分类器的构造,包括数据集的构建和训练、以及如何通过交叉熵损失来训练分类器。此外,文章讨论了分类器尺寸的选择,并通过实验结果表明,即使是较小的模型也能达到较高的性能。

接着,文章介绍了 RQ-RAG 的查询细化方法,包括它如何通过重写、分解和消除歧义来提高检索增强生成的查询质量。RQ-RAG 的方法包括以端到端的方式训练 Llama2 7B 模型,以便动态增强搜索查询。RQ-RAG 的数据集构建过程,包括如何收集语料库、分类任务、使用 ChatGPT 完善查询以及如何生成训练样本。

最后,文章对 Self-RAG 和 CRAG 进行了比较,并讨论了工程实施时的一些考虑点,如查询分类的优化性和小型模型的性能。文章强调,通过精心构建的数据集和生成过程,小型模型也能取得显著的成果。

虽然传统的 RAG 技术可以减少 LLM 答案的不准确性,但它并不能以任何方式增强初始查询。图 1 中的红框说明了这一点。

在这里插入图片描述

这种方法可能会导致一些潜在的问题,例如

  1. 对于简单问题,该系统可能会消耗过多的计算资源来处理。
  2. 对于复杂的查询,仅使用原始查询进行检索往往无法收集到足够的信息。
  3. 对于可能有多个答案的模糊查询,使用原始查询进行信息检索是不够的。

本文将介绍两种先进的解决方案:查询分类和查询细化。通过对小型模型的训练,这两种方法都有所改进。最后,文章将讨论从这两种算法中获得的启示和思考。

自适应-RAG:通过问题复杂性学习调整检索增强大型语言模型

整体流程

Adaptive-RAG 引入了一个新的自适应框架。如图 2 所示,它根据查询的复杂程度,动态选择最合适的 LLM 策略,从最简单到最复杂不等。

在这里插入图片描述

图 2 (A) 表示一种单步方法,即首先检索相关文档,然后生成答案。但是,对于需要多步骤推理的复杂查询,这种方法可

### RAG Sequence NQ 技术概述 RAG (Retrieval-Augmented Generation) 模型中的 `sequence-nq` 特指一种特定配置下的检索增强生成模型,该配置特别针对自然问题(Natural Questions, NQ)。此配置旨在通过结合外部知识源来提高问答系统的性能。 #### 构建流程与机制 在构建过程中,`rag-sequence-nq` 使用了专门设计用于处理自然语言提问的数据集方法论。具体来说: - **检索器组件**:采用密集向量表示法(Dense Passage Retrieval, DPR),能够更精准地定位到最相关的文档片段[^2]。 ```python from transformers import RagTokenizer, RagSequenceForGeneration tokenizer = RagTokenizer.from_pretrained("facebook/rag-sequence-nq") model = RagSequenceForGeneration.from_pretrained("facebook/rag-sequence-nq") ``` - **生成器模块**:基于T5架构进行了优化调整,使其更适合于从检索得到的信息中提炼出简洁而准确的答案。 这种组合方式不仅提升了对于复杂问题的理解能力,同时也增强了答案的质量可靠性。 #### 实现细节 为了更好地理解其实现过程,下面提供了一个简单的Python代码示例,展示了如何加载并使用预训练好的`rag-sequence-nq`模型来进行问答操作: ```python from transformers import pipeline qa_pipeline = pipeline('question-generation', model='facebook/rag-sequence-nq') context = "The Eiffel Tower is a wrought iron lattice tower on the Champ de Mars in Paris." questions_answers = qa_pipeline(context) for q_a in questions_answers: print(f"Question: {q_a['question']}") print(f"Answer: {q_a['answer']}\n") ``` 这段代码首先创建了一个问答管道对象,接着定义了一段背景信息作为上下文,最后调用了pipeline函数执行具体的问答回路,并打印出了产生的问题及其对应的答案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静愚 AGI

你的善意终将流回自己,加油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值