15-大模型 RAG 经验篇

一、LLMs 已经具备了较强能力了,存在哪些不足点?

在 LLM 已经具备了较强能力的基础上,仍然存在以下问题:

  • 幻觉问题:LLM 文本生成的底层原理是基于概率的 token by token 的形式,因此会不可避免地产生"一本正经的胡说八道"的情况;
  • 时效性问题:LLM 的规模越大,大模型训练的成本越高,周期也就越长。那么具有时效性的数据也就无法参与训练,所以也就无法直接回答时效性相关的问题,例如"帮我推荐几部热映的电影?";
  • 数据安全问题:通用的 LLM 没有企业内部数据和用户数据,那么企业想要在保证安全的前提下使用 LLM,最好的方式就是把数据全部放在本地,企业数据的业务计算全部在本地完成。而在线的大模型仅仅完成一个归纳的功能;

二、什么是 RAG?

RAG(Retrieval Augmented Generation, 检索增强生成),即 LLM 在回答问题或生成文本时,先会从大量文档中检索出相关的信息,然后基于这些信息生成回答或文本,从而提高预测质量。
在这里插入图片描述

R:检索器模块

在 RAG技术中,"R"代表检索,其作用是从大量知识库中检索出最相关的前 k 个文档。然而,构建一个高质量的检索器是一项挑战。研究探讨了三个关键问题:

如何获得准确的语义表示?

在 RAG 中,语义空间指的是查询和文档被映射的多维空间。以下是两种构建准确语义空间的方法。

  1. 块优化

处理外部文档的第一步是分块,以获得更细致的特征。接着,这些文档块被嵌入。

选择分块策略时,需要考虑被索引内容的特点、使用的嵌入模型及其最适块大小、用户查询的预期长度和复杂度、以及检索结果在特定应用中的使用方式。实际上,准确的查询结果是通过灵活应用多种分块策略来实现的,并没有最佳策略,只有最适合的策略。

  1. 微调嵌入模型

在确定了 Chunk 的适当大小之后,我们需要通过一个嵌入模型将 Chunk 和查询嵌入到语义空间中。如今,一些出色的嵌入模型已经问世,例如 UAE、Voyage、BGE等,它们在大规模语料库上预训练过。

如何协调查询和文档的语义空间?

在 RAG 应用中,有些检索器用同一个嵌入模型来处理查询和文档,而有些则使用两个不同的模型。此外,用户的原始查询可能表达不清晰或缺少必要的语义信息。因此,协调用户的查询与文档的语义空间显得尤为重要。研究介绍了两种关键技术:

  1. 查询重写

一种直接的方式是对查询进行重写。

可以利用大语言模型的能力生成一个指导性的伪文档,然后将原始查询与这个伪文档结合,形成一个新的查询。

也可以通过文本标识符来建立查询向量,利用这些标识符生成一个相关但可能并不存在的"假想"文档,它的目的是捕捉到相关的模式。

此外,多查询检索方法让大语言模型能够同时产生多个搜索查询。这些查询可以同时运行,它们的结果一起被处理,特别适用于那些需要多个小问题共同解决的复杂问题。

  1. 嵌入变换

在 Liu 于 2023 年提出的 LlamaIndex 中,研究者们通过在查询编码器后加入一个特殊的适配器,并对其进行微调,从而优化查询的嵌入表示,使之更适合特定的任务。

Li 团队在 2023 年提出的 SANTA 方法,就是为了让检索系统能够理解并处理结构化的信息。他们提出了两种预训练方法:一是利用结构化与非结构化数据之间的自然对应关系进行对比学习;二是采用了一种围绕实体设计的掩码策略,让语言模型来预测和填补这些被掩盖的实体信息。

如何对齐检索模型的输出和大语言模型的偏好?

在 RAG流水线中,即使采用了上述技术来提高检索模型的命中率,仍可能无法改善 RAG 的最终效果࿰

### Retrieval-Augmented Generation (RAG) 大模型概述 Retrieval-Augmented Generation (RAG) 是一种用于知识密集型自然语言处理任务的技术,该技术通过结合检索模块和生成模块来提升模型性能。具体来说,在面对一个问题时,RAG 模型会先调用检索组件查找相关的外部文档片段,随后将这些片段连同原始问题一起送入生成器中,从而得到更加精准的回答[^1]。 #### RAG 工作原理 当接收到用户查询后,RAG 首先启动检索部分,从预先构建的知识库或者互联网资源里提取出若干可能含有有用信息的文章摘要或段落;接着把这些选中的文本片段以及用户的实际提问共同作为输入传递给下游的语言生成网络,使得后者可以依据最新且最贴切的数据源来进行高质量回复的创作[^2]。 #### 应用场景 由于其独特的工作机制——即借助于实时获取到的真实世界资讯而非单纯依赖内部参数记忆来做决策判断,因此非常适合应用于那些对于时效性和准确性有着较高要求的任务领域,比如医疗咨询解答、法律条文解释等专业服务行业内的问答系统开发工作之中[^3]。 ```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", retriever=retriever) input_dict = tokenizer.prepare_seq2seq_batch( ["What is the capital of France?"], return_tensors="pt" ) outputs = model.generate(input_ids=input_dict["input_ids"]) print(tokenizer.batch_decode(outputs, skip_special_tokens=True)) ``` 此代码展示了如何加载预训练好的 RAG 模型,并使用它来生成针对特定问题的答案。这里选择了 Facebook 提供的一个基于 token 的版本 `facebook/rag-token-nq` 进行演示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xianghan收藏册

极简精品作,一分也是一份鼓励哦

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

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

打赏作者

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

抵扣说明:

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

余额充值