- Published on
1.1.rag高频面试题
- Authors

- Name
- xiaobai
RAG 高频题目
RAG 介绍
大模型的局限性
- 幻觉问题:LLM 文本生成的底层原理是基于概率的 token by token 的形式,因此会不可避免地产生“一本正经的胡说八道”的情况。
- 知识盲点于实时性:大模型通过预训练获得通用语言能力,但不具备专业领域的知识。对某些专业问题无法做出准确回答。有些知识不停的有更新,大模型需要在训练和微调时才能灌入新知识。
- 记忆力有限:大语言模型参数量虽然很大,但仍然无法记住大量具体的事实知识。容易在需要记忆的任务上表现不佳。
- 时效性问题:大语言模型的规模越大,大模型训练的成本越高,周期也就越长。那么具有时效性的数据也就无法参与训练,所以也就无法直接回答时效性相关的问题,例如“帮我推荐几部热映的电影?”。
- 数据安全问题:通用大语言模型没有企业内部数据和用户数据,那么企业想要在保证安全的前提下使用大语言模型,最好的方式就是把数据全部放在本地,企业数据的业务计算全部在本地完成。而在线的大模型仅仅完成一个归纳的功能。
- 没有外部世界感知:大语言模型无法感知外部世界,缺少视觉、听觉输入。对涉及感知的问题无法直接建模。
- 无用户建模:大语言模型没有建模特定用户的能力,对不同用户给出同样的反应和回复,无法进行个性化的对话。
什么是检索增强的语言模型(Retrieval-based LMs)
RAG 其全称为 Retrieval-Augmented Generation,即检索增强生成,它是一种结合信息检索和文本生成的技术,旨在提高自然语言处理任务的性能。它可以从一个大型知识库中检索与输入相关的信息,并将这些信息作为上下文和问题一起输入给模型进行处理。通过这种方式,RAG 可以帮助模型生成更加准确,相关和丰富的回答。简单说,RAG 就是先检索后生成,让模型"有据可依"。
为什么要使用检索增强的语言模型(Retrieval-based LMs)?
- LLMs 不能够仅通过参数来记忆全部的长尾(long-tail)知识。(所谓长尾知识,即为不热门不常用的知识(e.g. 河北省 2020 年的总人口数有多少))
- LLMs 通过参数所记忆的知识很容易过时,并且难以更新。如今互联网的信息呈爆炸式增长,知识更新速度极快,而语言模型通过参数所记忆的知识只能够保证是当时数据收集时的最新,而无法与时俱进,且语言模型预训练的消耗量极大,无法完成对于知识的频繁更新。
- LLMs 的输出难以解释和验证。通常很难对于语言模型所给出答案的原因以及依靠来源进行分析,这便导致我们很难去判断语言模型这个“黑箱”内部的真实运行逻辑,也使得我们无法完全相信其所给出的答案。而检索增强的语言模型通过返回检索得到的外部文档作为依靠,我们可以很容易地知道模型正在依靠怎样的文本知识去进行当前内容的生成,通过分析及验证其检索到的相关文档,来理解模型生成当前内容的运行逻辑。
- LLMs 很容易泄露隐私训练数据。如果将隐私数据(e.g. 用户住址、联系方式等)加入语言模型的预训练阶段,则使用语言模型的所有人均能够接触到这部分数据,显然这会造成用户隐私数据的泄露(OpenAI的ChatGPT也曾经面临过此类问题),并且此类问题难以通过指令微调或者偏好对齐的方式进行彻底解决。而检索增强的语言模型允许我们将隐私数据存储在外部的知识库中,而与语言模型本身参数没有关系,语言模型可以通过访问知识库中的这部分数据来为我们提供更为个性化的服务,保护隐私的同时也能够提高其个性化定制的能力。
- LLMs规模极大,训练和运行均极其昂贵。
RAG 和 SFT 微调有什么不同?
- 知识更新
- RAG:直接更新检索知识库,确保信息持续更新,无需频繁重新训练,非常适合动态变化的数据环境。
- Fine-tuning:存储静态数据,需要重新训练用于知识和数据的更新。
- 外部知识
- RAG:擅长利用外部资源,特别适合处理文档或其他结构化/非结构化数据库。
- Fine-tuning:可用于将预训练中外部学习到的知识与大语言模型保持一致,但对于频繁变化的数据源可能不太实用。
- 数据处理
- RAG:对数据的处理和操作要求极低。
- Fine-tuning:依赖于构建高质量的数据集,有限的数据集可能无法显著提高性能。
- 模型定制
- RAG:侧重于信息检索和融合外部知识,但可能无法充分定制模型行为或写作风格。
- Fine-tuning:允许根据特定风格或术语调整 LLM 行为、写作风格或特定领域知识。
- 可解释性
- RAG:答案能够追溯到具体的数据来源,提供更高的可解释性和可追踪性。
- Fine-tuning:就像一个黑盒子,并不总是清楚模型为什么会做出某种反应,可解释性相对较低。
- 计算资源
- RAG:需要计算资源来支持检索策略和数据库相关技术。外部数据源的整合和更新需保持维护。
- Fine-tuning:有必要准备和整理高质量的训练数据集,确定微调目标,并提供相应的计算资源。
- 延迟要求
- RAG:因涉及数据检索,可能带来较高的延迟。
- Fine-tuning:经过微调的大语言模型 (LLM) 可以不通过检索直接回应,降低延迟。
- 降低幻觉
- RAG:由于每个回答都基于检索到的实际证据,因此本质上更不容易产生错误或虚构的回答。
- Fine-tuning:根据特定领域的数据训练模型,有助于减少幻觉,但面对未训练过的输入时仍可能出现幻觉。
- 伦理和隐私问题
- RAG:从外部数据库存储和检索文本可能引起伦理和隐私方面的担忧。
- Fine-tuning:训练数据中的敏感内容可能会引起伦理和隐私方面的问题。
知识库构建
为什么要进行文本切块?
- 大模型输入长度有限制:随着深度学习模型的发展,虽然已经出现了许多功能强大的大型模型,但是它们的输入长度仍然存在限制。对于某些任务或平台,输入文本的长度可能会受到限制。因此,通过进行文本切分,可以确保输入的文本长度在可接受的范围内,从而更好地满足模型的需求。
- 成本问题:在某些平台上,收费是按照文本中的 token 数量计算的,因此发送大量文本可能会带来相当高的费用负担。
- 优化答案质量:有研究表明,发送少量相关信息可以获得更好的答案。在某些情况下,过多的文本可能会导致信息过载或混淆,从而降低了答案的准确性或可理解性。通过将文本切分成更小的片段,可以更精确地传达所需信息,提高系统对输入的理解和处理效率,从而获得更好的答案。
选择分块策略时,需要考虑哪些要素?
- 被索引内容的特点:考虑被索引内容的类型和特点,确定是处理较长的文档(如文章或书籍)还是处理较短的内容(如微博或即时消息)。这决定了哪种嵌入模型更适合您的目标,并从而决定应用哪种分块策略。
- 使用的嵌入模型及其最适块大小:根据所选用的嵌入模型及其适用的块大小,选择合适的分块策略。例如,Sentence-Transformer 更适合单句处理,而 text-embedding-ada-002 更适合处理包含 256 或 512 Token 的文本块。
- 用户查询的预期长度和复杂度:考虑用户输入的问题文本是简短而具体的还是冗长而复杂的。这直接影响到我们选择分组内容的方式,以确保在嵌入查询和嵌入文本块之间有更紧密的相关性。
- 检索结果在特定应用中的使用方式:考虑检索结果在特定应用中的使用方式。根据检索结果的使用情况,调整分块策略,以提高检索效率和结果的实用性。
分块策略都有哪些?
- 分块长度(字符、token):将文本按照字符数或 token 数进行分块。可以根据任务的要求和所使用的嵌入模型的限制,确定每个分块的长度,以便更有效地进行处理和分析。
- 重合长度:设置分块之间的重叠部分长度。通过在相邻分块之间引入重叠部分,可以确保相关信息不会丢失,并且在处理边界处能够获得更准确的结果。
- 标题:根据文本内容的标题或章节标题进行分块。这种策略可以根据文档的结构和语义信息进行划分,使得每个分块都具有一定的完整性和相关性。
- 层次分级:根据文本的层次结构进行分块。这种策略通常适用于包含层次性信息的文本,例如技术文档、报告或论文,其中存在多个级别的标题和子标题。
- 切分符:根据特定的切分符号将文本分成块。可以使用特定的符号或标记来指示文本的分块边界,例如换行符、句号、逗号等。
- 语义切分:根据文本的语义信息进行分块。这种策略利用自然语言处理技术来识别文本中的语义边界,并根据语义关联性将文本分成块,从而更好地捕捉文本的含义和逻辑结构。
语义分块模型都有哪些?
- 基于 BERT 的朴素文本切分方法:使用BERT模型对文本进行切分,这是一种基本的方法,通过BERT的预训练模型来识别文本的分块边界。
- Cross-Segment 模型:该模型充分利用了更长的上下文信息,以提高预测效率。首先,利用BERT模型为每个句子生成向量表示。然后,将连续的多个句子的向量表示输入到另一个BERT或LSTM模型中,一次性预测每个句子是否是文本分段的边界。这种方法有助于更全面地理解文本的语义结构和逻辑关系。(论文:《Text Segmentation by Cross Segment Attention》)
- SeqModel 模型:这种模型利用BERT对多个句子同时编码,以建模更长的上下文之间的依赖关系,然后计算句子向量,并预测每个句子后是否需要进行文本分割。此外,该模型还采用了自适应滑动窗口方法,在不降低准确性的情况下进一步提高推理速度。
长篇知识如何产生问答对?
在处理大量知识内容时,提取有效信息并转化为问答对是一种高效的信息整理方法。通过利用大型语言模型(LLM)的先进功能,我们可以自动化地从文本中抽取关键信息,形成<问题,答案>对,从而简化了信息管理和检索的过程。 流程如下:
- 知识输入:⾸先,将⻓篇知识输⼊到⼤型语⾔模型中。例如,输⼊关于⼤模型的定义: ⼤模型(Large Language Models)是基于深度学习技术,通过使⽤⼤量语⾔数据进⾏训练,构建出的具有数⼗亿、甚⾄万亿级别参数的⾃然语⾔处理模型。这些模型可⽤于⾃然语⾔理解、⽣成等多种任务,并在某些领域的任务上达到与⼈类相当或更优的表现。
- 自动化提取:利⽤⼤型语⾔模型的理解和⽣成能⼒,⾃动识别并提取关键概念,形成初步的问答对。例如,模型可能会识别出 ⼤模型 这⼀概念,并⾃动⽣成对应的问题: 什么是⼤模型? 随后,模型会从输⼊的知识中提取相关信息作为答案。
- 问答对生成:经过自动化提取后,会得到一系列问答对。
- 人工质检:虽然大型语言模型在信息提取方面表现出色,但仍需人工进行质检,以确保问答对的准确性和相关性。质检过程中,专业人员会对生成的问答对进行评估,修正任何不准确或不清晰的表述。
- 数据质量提升:通过人工质检,可以显著提高问答对的数据质量。
长文本如何存储用于检索?
如果需要从大量文档中检索信息,需要能够高效地搜索这些文档,找到相关信息,并将其整合成一个包含参考来源的统一答案。对于大型数据库,一个有效的方法是创建两个索引:一个包含摘要,另一个包含所有的文档块,并通过两步搜索,先利用摘要筛选相关文档,再在这些相关文档中进行具体搜索。
- 文档摘要生成:利用大型语言模型(LLM)自动为所有文档创建摘要,以便快速捕捉文档的主要内容。
- 二级索引构建:将文本组织成两级索引结构,第一级索引基于文档的关键信息,第二级索引指向原始文本,确保二者之间存在一一映射关系。
- 检索系统优化:检索系统应首先在文档摘要上进行检索,以迅速缩小搜索范围,避免直接在所有文档细节中搜索。
- 两步搜索策略实施:对大型数据库实施两步搜索策略,先通过摘要筛选出相关文档,然后在这些文档中进行详细的搜索,以找到最准确的信息。
向量化模型都有哪些?
- BGE:这是国人开发的中文embedding模型,在HuggingFace的MTEB(海量文本Embedding基准)上排名前2,实力强劲。
- M3E:也是国人开发的中文embedding模型,总体来说也算可以。
- 通义千问的embedding模型:1500+维的模型。
- Text-embedding-ada-002:这是OpenAI的embedding模型,1536维,感觉上应该是目前最好的模型,但在MTEB上排名好像只有第六,且国内不太能用。
- 自己训练embedding模型:基于一个既有embedding模型,一般有希望让它在原来的基础上提升 3%-10% 的性能。
Query 扩写模块
为什么进行 Query 扩写?
粗略排序(粗排)阶段的目标是快速识别出与查询(Query)相关的大量文本。为了实现这一目标,可以采用大型语言模型(LLM)来扩展原始查询,从而增加检索到的相关文本数量。
- Query扩展的目的:主要目的是通过生成与原始Query语义相关或互补的变体,来增加搜索引擎检索到的相关文档的数量。提高检索系统的覆盖面,提高用户找到所需信息的概率。
- 利用LLM进行Query扩展:通过使用LLM(如GPT-3),可以自动生成一系列与原始Query相关的扩展Query。理解意图和上下文,产生新的表达方式(同义词替换、句子重构、相关概念引入)。
- 生成多样化的扩展Query:LLM可以生成多种不同形式的扩展Query,包括长尾查询、相关问题、相关短语等。
- 提升检索效率:通过Query扩展,可以显著提高粗排阶段的效率。扩展后的Query集合能够覆盖更广泛的相关文本,减少遗漏重要信息的风险。
- 结合检索系统优化:在实际应用中,Query扩展模块应与检索系统紧密结合,例如对扩展后的Query集合进行预处理,去除冗余或低质量的Query。

Query 扩写的 Prompt 如何构建?
模板示例:
模板="""你是一个AI语言模型助手。你的任务是生成给定用户问题的3个不同版本,以从向量数据库中检索相关文档。
通过对用户问题生成多个角度,你的目标是帮助用户克服基于距离相似性搜索的一些限制。
通过换行符分隔提供这些替代问题。原始问题:{question}"""
粗排模块
使用什么相似度模型?
根据 Hugging Face 平台上的排行榜,一些性能优异的模型如 m3e、bge 等,在多个任务和数据集上展现出了卓越的相似度判别能力。
为什么要微调 Bert 模型
- 增强专业领域知识的理解:原生BERT模型主要接触的是广泛的常识性文本数据,在专业领域的知识理解上存在局限。通过微调,引入特定领域的数据集,使其学习到该领域的专业术语、概念和语言模式。
- 改善向量表示,优化召回效果:原生BERT模型生成的向量可能不足以满足直接召回的需求。微调后的BERT模型能够生成更适合特定任务的向量表示,更能反映查询意图和文档的相关性,从而提高召回系统的准确性和效率。
如何构造微调 Bert 相似度向量模型数据?
- 基于医疗领域的正负样本构建:
- 利用医疗数据集,根据相同疾病相关的问题构建相似数据对(正样本)。例如:“什么是冠心病?”和“冠心病怎么治疗?”(1表示相似)。
- 不同疾病的问题视为不相似(负样本)。例如:“冠心病的症状是什么?”和“什么是糖尿病?”(-1表示不相似)。
- 利用大型语言模型生成同义句:使用LLM(如GPT-3)生成给定问题的同义句或变体,增加数据集的多样性和丰富性。
- 数据质量控制:进行严格的质量控制,包括人工审核,检查语义一致性、同义句真实性及相似度标注的正确性。
微调模型中正负样本比例的策略是什么
- 样本比例的基本原则:通常情况下,负样本的数量会超过正样本。如果正样本的数量超过1万,负样本可以设置为正样本的2到4倍。
- 根据数据量调整比例:当数据集规模较大时,可以适当增加负样本的比例,以帮助模型学习不相似样本的特征,但应避免负样本数量远远超过正样本,以免造成训练不平衡。
使用 DSSM 双塔模型微调 Bert
DSSM (Deep Structured Semantic Model) 双塔模型优点在于高效率,以及能够离线计算向量表示。
代码示例 (PyTorch):
import torch
import torch.nn as nn
import torch.nn.functional as F
class DSSM(nn.Module):
def __init__(self, bert_model, t):
super(DSSM, self).__init__()
self.bert_model = bert_model
# 温度系数
self.t = t
def forward(self, x1, x2):
# 通过BERT模型获取文本的向量表示
v1 = self.bert_model(**x1)[1]
v2 = self.bert_model(**x2)[1]
# 计算两个向量的余弦相似度
similarity = F.cosine_similarity(v1, v2, dim=1)
# 应用温度系数进行缩放
similarity = similarity / self.t
# 通过sigmoid函数将相似度转换为0到1之间的值
y = nn.Sigmoid()(similarity)
return y
微调 Bert 为什么要设置维度系数
当相似度为1时,理论上模型应该收敛。然而,由于 sigmoid 函数的性质,当输入的相似度值为1时,sigmoid函数的输出并不是1,而是小于1的某个值。应用一个温度系数来调整相似度的值,并通过 sigmoid 函数将其映射到0到1的范围内。
- 当 x = 1 时,sigmoid 约为 0.731。
- 当 x = -1 时,sigmoid 约为 0.268。
- 当使用了温度系数(如 x = -1 / 0.01 = -100),sigmoid 的值会非常接近于 0。
微调 BERT 模型的层次选择及其原因
- 数据量与参数量的关系:数据量较大时,可以适当增加训练的参数量(训练更多层)。
- 训练时间的考量:微调更多层意味着更多计算资源和时间。
- 层次选择的策略:可以选择只训练顶层,或者训练顶层和部分中间层。
代码示例:
for name, param in model.named_parameters():
if "encoder.layer.10" in name or "encoder.layer.11" in name or "pooler.dense" in name:
param.requires_grad = True
else:
param.requires_grad = False
该代码将只有特定层的参数设置为可训练。
什么是句子窗口检索?
- 对文档中每个句子进行单独的向量化处理,以提升搜索精确度。
- 在检索到最相关的单个句子后,扩展前后k个句子作为上下文窗口,并将此扩展上下文发送给大语言模型,以增强推理能力。
什么是父文档检索器?
- 将文档递归分割为更小的子块,这些子块属于更大的父块。
- 在检索时,首先定位到较小的数据块。如果多个子块与同一父块相关联,就用这个父块作为上下文提供给大语言模型。
- 这个过程类似于自动合并多个小数据块为一个更大的父数据块,从而扩展了推理的上下文范围。
如何提高搜索质量和大语言模型的推理能力?
- 句子窗口检索
- 自动合并检索器(父文档检索器)
精排模块
什么是交互型模型
交互型模型放弃了传统的后处理匹配策略,采用直观的全局匹配方法(输入阶段就开始进行词语间的初步匹配)。
- 直接匹配信号的捕捉。
- 交互层的构建:两个文本的词语通过交互运算形成一个交互矩阵。
- 表示层的作用:利用CNN或RNN提取和整合交互信息。
Bert 排序模型
- 二分类任务的实现:将两个文本序列 S1 和 S2 拼接,送入 BERT,使用 [CLS] 标记生成的输出向量进行二分类。
- 微调过程:通常只更新少量参数(顶层分类器)。
- 离线计算的局限性:计算复杂度高,不适合大规模离线计算,通常用于较小集合的排序。
- 优化计算策略:采用“预筛选+精排”策略。
介绍下 Rerank 模型?
Re-Rank 模型是 Cross-Encoder 模型,同时接受两个文本句子作为输入,并输出相似度分数。精度高但不适合大规模数据。 流程:向量模型粗排 (Top-100) -> Re-Rank 模型精排 -> Top-K。 常用开源模型:Cohere-rerank、BAAI/bge-reranker-base、BAAI/bge-reranker-large 等。
过滤模块
领域关键词共现过滤策略
在基于向量的文本召回系统中,为了解决语义相关但文字表达差异导致的召回失败,或增强可靠性,可以采用此策略。
- 领域关键词的重要性:识别领域内频繁出现并具代表性的词汇。
- 共现过滤策略的实施:构建过滤机制,只有包含特定领域关键词共现模式的文本才会被召回。
- 益处:提升召回准确性、增强可靠性、结合向量召回的优势。
生成模块
prompt 模板如何构建?
模板 1:
PROMPT_TEMPLATE = """参考信息:
{context}
---
我的问题或指令:
{question}
---
请根据上述参考信息回答我的问题或回复我的指令。前面的参考信息可能有用,也可能没用,你需要从
我给出的参考信息中选出与我的问题最相关的那些,来为你的回答提供依据。回答一定要忠于原文,简
洁但不丢信息,不要胡乱编造。我的问题或指令是什么语种,你就用什么语种回复,
你的回复:"""
LlamaIndex 模板示例:
template = f'''
Context information is below.
---------------------
{context_str}
---------------------
Using both the context information and also using your own knowledge, answer the question: {query_str}
If the context isn't helpful, you can/don’t answer the question on your own.
'''
输入文档的顺序对大模型是否有影响?
检索的文档的拼接顺序对结果是有影响的("Lost in the Middle" 现象),可以将文档拼接到开头或者结尾进行实验。
RAG 架构
基于 Retrieval-based LMs 的对话流程是怎么样?
- 加载文件模块
- 读取文本
- 文本分割
- 文本向量化
- 问句(Query)向量化
- 在文本向量中匹配出与问句向量最相似的 top k 个
- 匹配出的文本作为上下文和问题一起添加到 prompt 中
- 提交给 LLM 生成回答
RAG 调用模式有几种?分别是什么?
- 模式一:非结构化数据 -> Embedding -> 向量数据库 -> Construct Prompts -> LLM -> 用户。
- 模式二:用户提问 -> Embedding -> 保存到长时记忆数据库 -> LLM 回答 -> 回答存入长时记忆 -> 用户。
- 模式三:用户提问 -> Embedding -> 查询 Cache(向量数据库)-> 命中则返回;未命中则交互 LLM -> 存入 Cache -> 返回用户。
RAG 评估
如何评估 RAG 系统的准确率上下限问题?
- 使用外挂知识库的准确率下限:大模型仅依赖内部预训练模型,没有额外知识库输入。
- 使用外挂知识库准确率的上限:输入文本只包含一个正确答案的文档片段。大模型直接参考该文档回答。
检索模块的评估指标有哪些?
- 命中率 (Hit Rate):包含答案的文本块在召回文本集合中出现的概率。
- 平均排名倒数 (MRR):计算召回列表中包含答案文本块的排名倒数,取平均。
- 归一化折扣累积增益 (NDCG)
- 精确度 (Precision)
RAG 评估框架都有哪些
- RAGAS
- ARES
多轮对话
如何判断上下文是否关联?
使用模型进行二分类。
上下文长度过长怎么办?
- 每一轮检索的内容如果进行拼接,会存在上下文内容太多,导致忽略本轮问题。
- 大模型 token 长度是有限的。
- 解决方案:使用大模型进行摘要抽取。
RAG 技术挑战
数据检索问题的挑战
- 语义歧义:向量表示可能无法捕捉细微差别(如“苹果”指水果还是公司)。
- 大小与方向:余弦相似度关注方向,可能导致语义遥远但方向相似的匹配。
- 粒度不匹配:查询概念特定,但数据集仅包含广泛主题。
- 向量空间密度:高维空间中,密切相关和不相关项的距离差异可能非常小。
- 全局相似性与局部相似性。
- 稀疏检索挑战:所需信息稀疏分布在多个文档中时难以识别。
信息增强问题挑战
- 上下文的集成:检索到的上下文需与当前生成任务顺利集成,避免脱节。
- 冗余和重复:检索段落包含相似信息可能导致生成内容重复。
- 排名和优先级:需正确权衡检索段落的重要性。
- 风格或语气不匹配:检索内容来源风格不同可能导致输出缺乏凝聚力。
- 过度依赖检索内容:生成模型可能仅重申检索观点,而没有增加实质性价值。
相关论文
介绍下 HyDE?
HyDE (Hypothetical Document Embeddings) 首先响应查询生成一个假设性文档(答案),然后将其嵌入,并利用此嵌入去检索与假设文档类似的真实文档。这种方法强调答案之间的嵌入相似性。
介绍下 RAG-Fusion?
- 查询语句的相关性复制:LLM将用户查询转换为相似但不同的查询。
- 并发的向量搜索。
- 智能重新排名:使用倒数排序融合 (RRF)。
- 最后优中选优。
介绍下 SELF-RAG?
SELF-RAG 是一种先进的框架:
- 自我反思:评估是否需要外部信息。
- 按需检索。
- 生成与评估。
- 定制化输出。
