3-RAG介绍
1 LLM的缺陷
大型语言模型(LLM)虽然在很多方面表现出色,但也存在一些缺陷和局限性:
- 知识截止限制:LLM的知识是基于其训练数据的,这意味着它们对2025年之后发生的事件或最新发展可能缺乏了解或者理解不准确。
- 误解上下文:尽管LLM可以处理复杂的对话和文本,但有时候它们可能会误解问题的具体上下文或细微差别,导致回答不够精确或相关性不足。
- 生成错误信息:LLM有时会自信地提供看似合理但实际上不正确或虚构的信息。这是因为模型并非基于事实核查机制运行,而是根据概率模式生成回复。
- 伦理与偏见问题:如果训练数据中包含偏见,LLM可能会学习并反映这些偏见,从而在某些情况下产生不公平或有争议的回答。此外,如何确保AI行为符合道德规范也是一个持续讨论的话题。
- 过度泛化:LLM可能会在没有足够具体指导的情况下,尝试回答超出其实际能力范围的问题,导致答案表面看起来合理但实际上可能毫无意义或误导性强。
- 依赖大量计算资源:训练和部署大型语言模型需要大量的计算资源,这不仅成本高昂,而且对环境造成影响。
- 理解和推理能力有限:尽管LLM可以在表面上模仿人类的语言使用,但在深层次的理解、逻辑推理以及抽象思维方面仍然有限。
为了克服这些挑战,研究人员正在探索改进方法,包括更好的训练技术、更广泛的数据集、增强的事实核查机制以及开发更加透明和可控的模型架构。同时,也强调了跨学科合作的重要性,以确保技术进步的同时考虑到社会影响。
2 为什么使用RAG
在大型语言模型(LLM)中使用Retrieval-Augmented Generation(RAG,检索增强生成)框架,主要是为了结合检索模型和生成模型的优势,以提高生成内容的准确性和相关性。
RAG的工作原理是首先通过一个检索组件从一个大规模的知识源或文档集合中找到与输入查询最相关的文本片段,然后将这些片段作为额外的上下文信息传递给生成组件。生成组件基于这个附加的上下文以及原始输入来生成最终的回答。这种方法有几个关键的优点:
- 提高准确性:通过引入外部知识库中的具体信息,可以显著提高回答问题的准确性,尤其是对于那些需要最新数据或非常特定领域知识的问题。
- 减少幻觉现象:LLM有时会自信地生成看似合理但实际上不正确的信息。通过使用RAG,可以使生成过程基于真实、具体的参考资料,从而减少这种“幻觉”。
- 增强上下文理解:对于复杂的查询,仅依靠模型内部参数可能无法充分捕捉所有细节。而通过检索到的相关文档段落作为补充,可以帮助模型更好地理解和响应查询。
- 灵活性:RAG允许根据不同任务的需求调整检索部分的数据源,使得它能够适应多样化的应用场景,如问答系统、摘要生成等。
总之,在LLM中采用RAG机制可以通过整合实时检索的信息来丰富模型的输出, 使得生成的内容更加精准和可靠。这对于提升用户体验,特别是在专业领域或是需要引用具体事实的情况下尤为重要。
3 RAG概念
RAG(Retrieval Augmented Generation)顾名思义,通过检索外部数据,增强大模型的生成效果。
RAG即检索增强生成,为LLM提供了从某些数据源检索到的信息,并基于此修正生成的答案。RAG 基本上是Search + LLM 提示,可以通过大模型回答查询,并将搜索算法所找到的信息作为大模型的上下文。查询和检索到的上下文都会被注入到发送到 LLM 的提示语中。

为什么需要一个向量数据库?

通过RAG来处理的效果

4 RAG vs Fine-tuning
LLM:高中毕业的学生
RAG:毕业后进入了企业。继承了家业。做了老总,不熟悉公司的业务,但是配置了各种副总,业务负责人。这时老总做的各种决策都需要先和各个负责人沟通后做出
Fine-tuning:微调, 毕业后开始学习专业领域的系统知识,然后做相关的工作,比如7年学习医学,毕业后做医生
RAG(检索增强生成)与微调(Fine-tuning)是两种不同的方法,用于提高语言模型在特定任务上的性能。它们各有优缺点,适用于不同类型的应用场景。
RAG(检索增强生成)
概念:RAG是一种将信息检索和文本生成相结合的方法。它首先从一个大规模的知识库中检索出与输入相关的文档或片段,然后使用这些信息来辅助生成回答。
- 优点:
- 最新信息利用:由于可以实时从外部知识源检索最新信息,RAG能够提供更新鲜、更准确的答案。
- 减少幻觉:通过基于实际检索到的信息生成回复,减少了模型生成不正确或虚构内容的可能性。
- 灵活性:可以根据不同任务的需求调整检索的数据源,适应多样化的应用场景。
- 缺点:
- 复杂性增加:需要维护和访问外部知识库,增加了系统的复杂性和计算成本。
- 检索质量依赖:最终输出的质量高度依赖于检索步骤的准确性。
Fine-tuning(微调)
概念:微调是指在预训练模型的基础上,使用特定任务的数据集对模型进行进一步训练,以使其更好地适应该任务。
- 优点:
- 简化部署:一旦完成微调,模型可以直接应用于目标领域,无需额外的知识检索步骤。
- 性能优化:针对具体任务的数据进行微调,可以显著提升模型在该领域的表现。
- 一体化解决方案:对于不需要频繁更新知识库的任务,微调提供了一个较为简单的一体化解决方案。
- 缺点:
- 固定知识限制:微调后的模型其知识受限于训练数据的时间点,难以处理训练后出现的新信息。
- 过拟合风险:如果微调数据集不够大或者代表性不足,可能导致模型过拟合,影响泛化能力。
总结:选择RAG还是微调取决于具体的应用需求:
- 如果您的应用需要最新的信息,或者面对的是快速变化的领域(如新闻报道),那么RAG可能是一个更好的选择。
- 相反,如果您有一个明确且相对稳定的目标领域,并希望获得最佳性能,同时避免复杂的系统架构,微调可能是更合适的选择。
两者并非互斥,实际上,在某些情况下,结合使用RAG和微调可能会带来最好的结果,例如先通过微调使模型适应某个领域,再用RAG的方式增强其实时获取最新信息的能力。
5 RAG工作流程
RAG论⽂: https://arxiv.org/pdf/2312.10997


6 RAG系统的搭建流程

索引(Indexing):索引⾸先清理和提取各种格式的原始数据,如 PDF、HTML、Word 和 Markdown,然后将其转换为统⼀的纯文本格式。为了适应语⾔模型的上下文限制,文本被分割成更小的、可消化的块(chunk)。然后使用嵌入模型将块编码成向量表示,并存储在向量数据库中。这⼀步对于在随后的检索阶段实现高效的相似性搜索至关重要。知识库分割成 chunks,并将 chunks 向量化至向量库中。
检索(Retrieval):在收到用户查询(Query)后,RAG 系统采用与索引阶段相同的编码模型将查询转换为向量表示,然后计算索引语料库中查询向量与块向量的相似性得分。该系统优先级和检索最高 k (Top-K)块,显示最大的相似性查询。 例如,⼆维空间中的向量可以表示为 (𝑥,𝑦),表示从原点 (0,0) 到点 (𝑥,𝑦) 的有向线段

- 将文本转成⼀组浮点数:每个下标 i ,对应⼀个维度
- 整个数组对应⼀个 n 维空间的⼀个点,即文本向量又叫 Embeddings
- 向量之间可以计算距离,距离远近对应语义相似度大小

这些块随后被用作 prompt 中的扩展上下文。Query 向量化,匹配向量空间中相近的 chunks。 RAG具体实现流程:加载文件 => 读取文本 => 文本分割 =>文本向量化 =>输入问题向量化 =>在文本向量中匹配出与问题向量最相似的 top k 个 =>匹配出的文本作为上下文和问题⼀起添加到 prompt 中 =>提交给 LLM 生成回答。
7 RAG的缺陷
RAG痛点问题分析论文,论文:《Seven Failure Points When Engineering a Retrieval Augmented Generation System》
地址: https://arxiv.org/pdf/2401.05856
https://www.163.com/dy/article/JFTQNA200511D3QS.html
7.1 具体痛点问题总结
Index Process(文本向量化构建索引的过程):
- MIssing Content(内容缺失): 原本的文本中就没有问题的答案
- 文档加载准确性和效率: 比如pdf文件的加载,如何提取其中的有用文字信息和图片信息等
- 文档切分的粒度: 文本切分的大小和位置会影响后面检索出来的上下文完整性和与大模型交互的token数量,怎么控制好文档切分的度,是个难题。
Query Process(检索增强回答的过程中):
- Missed Top Ranked: 错过排名靠前的文档
- Not in Context: 提取上下文与答案无关
- Wrong Format(格式错误): 例如需要Json,给了字符串
- Incomplete(答案不完整): 答案只回答了问题的一部分
- Not Extracted(未提取到答案:) 提取的上下文中有答案,但大模型没有提取出来
- Incorrect Specificity: 答案不够具体或过于具体
7.2 痛点问题策略分析
7.2.1 文档加载准确性和效率
优化文档读取器
一般知识库中的文档格式都不尽相同,HTML、PDF、MarkDown、TXT、CSV等。每种格式文档都有其都有的数据组织方式。怎么在读取这些数据时将干扰项去除 (如一些特殊符号等),同时还保留原文本之间的关联关系(如csv文件保留其原有的表格结构),是主要的优化方向。 目前针对这方面的探索为:针对每一类文档,设计一个专门的读取器。如LangChain中提供的WebBaseLoader专门用来加载HTML文本等。 网址: https://python.langchain.com/v0.1/docs/modules/data_connection/document_loaders/
数据清洗与增强
输入垃圾,那也必定输出垃圾。如果你的源数据质量低劣,比如包含互相冲突的信息,那不管你的 RAG 工作构建得多么好,它都不可能用你输入的垃圾神奇地输出高质量结果。这个解决方案不仅适用于这个痛点,任何RAG工作流程想要获得优良表现,都必须先清洁数据。
7.2.2 文档切分的粒度
粒度太大可能导致检索到的文本包含太多不相关的信息,降低检索准确性,粒度太小可能导致信息不全面,导致答案的片面性。问题的答案可能跨越两个甚至多个片段。
固定长度的分块:直接设定块中的字数,每个文本块有多少字
内容重叠分块:在固定大小分块的基础上,为了保持文本块之间语义上下文的连贯性,在分块时,保持文本块之间有一定的内容重叠。
基于结构的分块:基于结构的分块方法利用文档的固有结构,如HTML或Markdown中的标题和段落,以保持内容的逻辑性和完整性。
基于递归的分块:重复的利用分块规则不断细分文本块。在langchain中会先通过段落换行符(\n\n)进行分割。然后,检查这些块的大小。如果大小不超过一定阈值,则该块被保留。对于大小超过标准的块,使用单换行符(\n)再次分割。以此类推,不断根据块大小更新更小的分块规则(如空格,句号)。
分块大小的选择:
(1)不同的嵌入模型有其最佳输入大小。比如Openai的text-embedding-ada-002的模型在256 或 512大小的块上效果更好。
(2)文档的类型和用户查询的长度及复杂性也是决定分块大小的重要因素。处理长篇文章或书籍时,较大的分块有助于保留更多的上下文和主题连贯性;而对于社交媒体帖子,较小的分块可能更适合捕捉每个帖子的精确语义。如果用户的查询通常是简短和具体的,较小的分块可能更为合适;相反,如果查询较为复杂,可能需要更大的分块。
7.2.3 内容缺失
准备的外挂文本中没有回答问题所需的知识。这时候,RAG可能会提供一个自己编造的答案。
- 增加相应的知识库:将相应的知识文本加入到向量知识库中。
- 数据清洗与增强:输入垃圾,那也必定输出垃圾。如果你的源数据质量低劣,比如包含互相冲突的信息,那不管你的 RAG 工作构建得多么好,它都不可能用你输入的垃圾神奇地输出高质量结果。这个解决方案不仅适用于这个痛点,任何RAG工作流程想要获得优良表现,都必须先清洁数据。
- 更好的Prompt设计:通过Prompts,让大模型在找不到答案的情况下,输出“根据当前知识库,无法回答该问题”等提示。这样的提示,就能鼓励模型承认自己的局限,并更透明地向用户传达它的不确定。虽然不能保证 100% 准确度,但在清洁数据之后,精心设计 prompt 是最好的做法之一。
7.2.4 错过排名靠前的文档
外挂知识库中存在回答问题所需的知识,但是可能这个知识块与问题的向量相似度排名并不是靠前的,导致无法召回该知识块传给大模型,导致大模型始终无法得到正确的答案。
- 增加召回数量:增加召回的 topK 数量,也就是说,例如原来召回前3个知识块,修改为召回前5个知识块。不推荐此种方法,因为知识块多了,不光会增加token消耗,也会增加大模型回答问题的干扰。
- 重排(Reranking):该方法的步骤是,首先检索出 topN 个知识块(N > K,过召回),然后再对这 topN 个知识块进行重排序,取重排序后的 K 个知识块当作上下文。重排是利用另一个排序模型或排序策略,对知识块和问题之间进行关系计算与排序。
7.2.5 提取上下文与答案无关
内容缺失 或 错过排名靠前的文档 的具体体现
7.2.6 格式错误
Prompt调优:优化Prompt逐渐让大模型返回正确的格式。
7.2.7 答案不完整
将问题分开提问:一方面引导用户精简问题,一次只提问一个问题。 另一方面,针对用户的问题进行内部拆分处理,拆分成数个子问题,等子问题答案都找到后,再总结起来回复给用户。
7.2.8 未提取到答案
提示压缩技术: 网址: https://mp.weixin.qq.com/s/61LZgc1a5yRP2J7MTIVZ4Q
7.3 RAG评估
- 评估出RAG对大模型能力改善的程度
- RAG优化过程,通过评估可以知道改善的方向和参数调整的程度
人工评估:最Low的方式是进行人工评估:邀请专家或人工评估员对RAG生成的结果进行评估。他们可以根据预先定义的标准对生成的答案进行质量评估,如准确性、连贯性、相关性等。这种评估方法可以提供高质量的反馈,但可能会消耗大量的时间和人力资源。
自动化评估:自动化评估肯定是RAG评估的主流和发展方向。
LangSmith:需要准备测试数据集,不仅可以评估RAG效果,对于LangChain中的Prompt模板等步骤都可进行测试评估。
RAGAS:RAGAs(Retrieval-Augmented Generation Assessment)是一个评估框架,文档。考虑检索系统识别相关和重点上下文段落的能力,LLM 以忠实方式利用这些段落的能力,以及生成本身的质量。
- 数据集格式 question:作为 RAG 管道输入的用户查询。输入。
- answer:从 RAG 管道生成的答案。输出。
- contexts:从用于回答question外部知识源中检索的上下文。
- ground_truths:question的基本事实答案。这是唯一人工注释的信息。
评估指标
评估检索质量:
- context_relevancy(上下文相关性,也叫 context_precision)
- context_recall(召回性,越高表示检索出来的内容与正确答案越相关)
评估生成质量:
- faithfulness(忠实性,越高表示答案的生成使用了越多的参考文档(检索出来 的内容))
- answer_relevancy(答案的相关性)
Context Recall:上下文召回衡量检索到的上下文(contexts)与标准答案(ground_truths)的匹配程度。