【深度学习】检索增强生成 RAG

RAG (Retrieval-Augmented Generation) 是由 Facebook AI Research (FAIR) 提出的。具体来说,RAG 是在 2020 年的论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 中首次被提出的。

为什么提出 RAG?

在 NLP 中,有很多知识密集型任务(Knowledge-Intensive Tasks),如开放领域问答、知识生成等,这些任务依赖于模型掌握大量的外部知识。然而,传统的预训练生成模型(如 GPT-3、BERT)存在以下问题:

  1. 知识静态性:模型只能使用训练过程中学到的知识,更新知识需要重新训练。
  2. 参数限制:模型大小有限,不可能记住所有知识。
  3. 生成质量的限制:没有外部支持的生成模型可能会生成不准确或不相关的内容。

RAG 的目标 是解决这些问题,通过引入一个外部知识库来增强生成模型的知识能力,同时使得模型更灵活和可扩展。

RAG 的创新

  1. 检索增强生成:
    • 通过引入检索机制,模型在生成答案时可以动态查询外部知识库(如维基百科)。
  2. 端到端训练:
    • 检索模块和生成模块可以端到端地联合训练,从而优化检索和生成的整体性能。
  3. 结合生成和检索的优点:
    • 保留生成模型的语言生成能力,同时利用检索模块动态补充知识,提升生成的准确性和相关性。

RAG 的核心思想

传统生成模型(如 GPT、BERT)在回答问题时依赖于预训练数据的记忆,而 RAG 提供了一种动态查询外部知识库的能力。具体而言:

  1. 检索(Retrieval):
    • 通过检索模型,从外部知识库(如维基百科、企业文档)中找到与输入问题最相关的文档。
  2. 生成(Generation):
    • 将检索到的文档作为上下文输入生成模型,由生成模型(如 BART、GPT)生成答案。

这种设计使 RAG 能够动态获取外部知识,解决生成模型对训练数据依赖的问题。

RAG 的工作流程

  1. 输入问题
    用户提供一个查询(Query),例如“Who won the Nobel Prize in Physics in 2023?”

  2. 检索阶段(Retrieval)

    • 使用基于嵌入的检索模型(如 SentenceTransformer、BM25、Dense Retriever)从知识库中挑选最相关的文档。
    • 知识库的内容通常被预处理为嵌入向量,存储在向量数据库(如 FAISS)中。
    • 输出是检索到的文档集合(例如 5 个文档)。
  3. 生成阶段(Generation)

    • 将检索到的文档与查询合并,作为上下文输入到生成模型中(如 BART、GPT)。
    • 模型基于上下文生成答案。
  4. 输出答案
    最终生成的答案由生成模型直接输出。

RAG 的优点

### 检索增强生成 RAG 技术原理 检索增强生成RAG)是一种融合了检索技术和生成模型的方法,旨在通过结合外部知识库中的信息来改进自然语言处理任务的效果。具体而言,在面对特定查询时,系统会先利用检索模块从大量文档或其他形式的数据集中提取最相关的片段或条目;随后这些被选中的资料作为附加输入提供给生成组件,帮助其构建更加精准且富含背景支持的回答。 #### 工作流程概述 1. **检索阶段**:当接收到用户提出的请求后,RAG架构内的搜索引擎负责查找与之匹配度最高的若干候选答案来源。此过程可能涉及全文搜索、关键词定位或是更复杂的语义相似度计算等方式[^3]。 2. **生成阶段**:紧接着上述操作所得的结果会被传递至预训练的语言模型那里。此时后者不仅要理解原始问题本身所表达的意思,还需充分吸收由前者所提供的额外素材,并据此产出既贴合事实又具备良好流畅性的最终回复[^2]。 为了确保整个系统的高效运作以及输出质量,还需要特别关注以下几个方面: - 对于检索部分来说,采用先进的算法设计至关重要。这包括但不限于考虑如何衡量不同文本间的关联程度、怎样快速锁定目标范围等问题。实践中往往倾向于运用诸如BM25、TF-IDF这样的经典方案或者是基于深度学习框架下的新兴手段如BERT等来进行优化配置[^4]。 - 针对生成环节,则强调要让模型学会有效整合多源异构的知识表示形式——即能够把来自结构化表格记录、半结构性网页内容乃至纯叙述性描述等各种类型的有用资讯无缝衔接到一起,从而实现高质量的对话交互体验[^1]。 ```python from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-nq") retriever = RagRetriever.from_pretrained("facebook/rag-token-nq", index_name="exact", use_dummy_dataset=True) model = RagSequenceForGeneration.from_pretrained("facebook/rag-token-nq") input_dict = tokenizer.prepare_seq2seq_batch( "What is the capital of France?", return_tensors="pt" ) outputs = model.generate(input_ids=input_dict["input_ids"], context_input_ids=retriever(contexts=["Paris"])) print(tokenizer.batch_decode(outputs, skip_special_tokens=True)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值