一、LLMs 已经具备了较强能力,为什么还需要 RAG?
尽管大语言模型(LLM)已展现出显著的能力,但以下几个挑战依然值得关注:
- 幻觉问题:LLM 采用基于统计的概率方法逐词生成文本,这一机制内在地导致其可能出现看似逻辑严谨实则缺乏事实依据的输出,即所谓的'郑重其事的虚构陈述'。
- 时效性问题:随着 LLM 规模扩大,训练成本与周期相应增加。鉴于此,包含最新信息的数据难以融入模型训练过程,导致 LLM 在应对诸如'请推荐当前热门影片'等时间敏感性问题时力有未逮。
- 数据安全问题:通用的 LLM 没有企业内部数据和用户数据。企业想要在保证安全的前提下使用 LLM,最好的方式就是把数据全部放在本地,企业数据的业务计算全部在本地完成。而在线的大模型仅仅完成一个归纳的功能。
二、什么是 RAG?
RAG(Retrieval Augmented Generation,检索增强生成)是一种技术框架,其核心在于当 LLM 面对解答问题或创作文本任务时,首先会在大规模文档库中搜索并筛选出与任务紧密相关的素材,继而依据这些素材精准指导后续的回答生成或文本构造过程,旨在通过此种方式提升模型输出的准确性和可靠性。
三、RAG 主要包含哪些模块?
- 版面分析:本地知识文件读取(pdf、txt、html、doc、excel、png、jpg、语音等),并进行知识文件复原。
- 知识库构建:知识文本分割,构建 Doc 文本;Doc 文本 embedding;Doc 文本构建索引。
- 大模型微调:针对特定领域对模型进行参数调整。
- 基于 RAG 的知识问答:用户 query embedding,query 召回,query 排序,将 Top K 个相关的 Doc 进行拼接构建 context,基于 query 和 context 构建 Prompt,将 prompt 喂给大模型生成答案。
四、RAG 相较于直接使用 LLMs 进行问答有哪些优点?
RAG(检索增强生成)方法赋予了开发者无需为每个特定任务重新训练大型模型的能力,仅需连接外部知识库,即可为模型注入额外的信息资源,从而显著提升其回答的精确度。这一方法尤其适用于那些高度依赖专业知识的任务。
以下是 RAG 模型的主要优势:
- 可扩展性:减小模型规模及训练开销,同时简化知识库的扩容更新过程。
- 准确性:通过引用信息源,用户能够核查答案的可信度,进而增强对模型输出结果的信任感。
- 可控性:支持知识内容的灵活更新与个性化配置。
- 可解释性:展示模型预测所依赖的检索条目,增进理解与透明度。
- 多功能性:RAG 能够适应多种应用场景的微调与定制,涵盖问答、文本摘要、对话系统等领域。
- 时效性:运用检索技术捕捉最新信息动态,确保回答既即时又准确,相比仅依赖固有训练数据的语言模型具有明显优势。
- 领域定制性:通过对接特定行业或领域的文本数据集,RAG 能够提供针对性的专业知识支持。
- 安全性:通过在数据库层面实施角色划分与安全管控,RAG 有效强化了对数据使用的管理,相较于微调模型在数据权限管理上的潜在模糊性,展现出更高的安全性。
五、对比一下 RAG 和 SFT,说一下两者有哪些区别?
实际上,对于 LLM 存在的上述问题,SFT(Supervised Fine Tuning,监督微调)是一个最常见最基本的解决办法,也是 LLM 实现应用的基础步骤。那么有必要在多个维度上比较一下两种方法:
当然这两种方法并非非此即彼的,合理且必要的方式是结合业务需要与两种方法的优点,合理使用两种方法。
六、模块一:版面分析
为什么需要版面分析?
尽管 RAG 技术的核心价值在于其结合检索与生成手段以提升文本内容的精确度与连贯性,然而在一些具体应用领域,如文档解析、智能化写作及对话系统构建中,特别是在面对结构化或半结构化信息的处理需求时,其功能边界可能拓展至版面分析。
这是由于此类信息往往嵌于特定的布局结构中,需要对页面元素及其相互关系进行深入理解。
此外,当 RAG 模型面对包含丰富多媒体或多模态成分的数据源,诸如网页、PDF 文件、富文本记录、Word 文档、图像资料、语音片段、表格数据等复杂内容时,为了能高效地摄取并利用这些非文本信息,具备基本的版面分析能力变得至关重要。这种能力有助于模型精准解析各类信息单元,并成功将它们融合成有意义的整体解读。
Step 1:本地知识文件获取
本地知识文件获取涉及从多种数据源(如.txt、.pdf、.html、.doc、.xlsx、.png、.jpg、音频文件等)提取信息的过程。针对不同类型的文件,需要采取特定的访问与解析策略来有效获取其中蕴含的知识。
- 富文本 txt:富文本主要存储于 txt 文件中,因为排版比较整洁,所以获取方式比较简单,通常直接读取文件流即可。
- PDF 文档:PDF 文档中数据比较复杂,包含文本、图片、表格等不同样式的数据,所以解析过程中会比较复杂。常用工具包括 pdfplumber 和 PyMuPDF。
- HTML 文档:网页 HTML 解析通常使用 BeautifulSoup 等库提取 DOM 树中的文本节点。
- Doc 文档:Docx 解析神器 python-docx 可用于读取 Word 文档结构。
- 图片内容:使用 OCR(光学字符识别)获取图片内容。目前开源的 OCR 项目包括 Tesseract、PaddleOCR、EasyOCR 等。思路包括文字检测(哪里有文字)和文字识别(是什么文字)。
- 语音内容:使用 ASR(自动语音识别)将语音信号转换成文本信息。目标是将人类的语音中的词汇内容转换为计算机可读的输入。思路包括声学信号预处理、特征提取、声学模型、语言模型及字典与解码。
Step 2:知识文件复原
本地知识文件获取包含对多源化数据进行读取之后,容易将一个多行段落分割成多个段落,从而导致段落遇到被分割,所以需要根据内容逻辑重新组织段落。
方法包括基于规则的知识文件复原,以及基于 Bert NSP 进行上下句拼接。
Step 3:版面分析优化策略篇
在实际应用中,需根据具体场景优化版面分析流程,例如处理跨页表格、混合图文混排等情况,以提高后续检索的准确率。
Step 4:实践任务
任务描述:使用上述方法对金融大模型挑战赛的数据集进行版面分析。
任务效果:分析各种方法效果和性能。
七、模块二:知识库构建
为什么需要知识库构建?
在 RAG 中构建知识库是至关重要的,原因包括但不限于以下几点:
- 扩展模型能力:大规模语言模型虽然具有强大的语言生成和理解能力,但受限于训练数据集的覆盖范围,它们可能无法准确回答一些基于特定事实或详细背景信息的问题。通过构建知识库,RAG 可以补充模型自身的知识局限性。
- 实时更新信息:知识库可以实时更新和扩充,确保模型能够获取最新的知识内容,这对于处理时效性强的信息尤为关键。
- 提高准确性:RAG 结合了检索与生成两个过程,在生成回答前先检索相关文档,从而提高了回答问题时的准确性。
- 减少过拟合与幻觉:大模型有时会因为过度依赖内在模式而出现 hallucination 现象。通过引用知识库中的确切证据,RAG 可以降低此类错误产生的可能性。
- 增强可解释性:RAG 不仅能提供答案,还能指出答案的来源,增强了模型生成结果的透明度和可信度。
- 支持个性化及私有化需求:对于企业或个人用户,可以通过构建专属知识库满足特定领域或私人定制的需求。
Step 1:知识文本分块
为什么需要对文本分块?
- 信息丢失的风险:试图一次性提取整个文档的嵌入向量,虽然可以捕捉到整体的上下文,但也可能会忽略掉许多针对特定主题的重要信息。
- 分块大小的限制:在使用如 OpenAI 这样的模型时,分块大小是一个关键的限制因素。例如 GPT-4 模型有一个 32K 的窗口大小限制。
主要考虑两个因素:embedding 模型的 Tokens 限制情况;语义完整性对整体的检索效果的影响。
Step 2:Docs 向量化(Embedding)
什么是 Docs 向量化?
Embedding 也是文本语义含义的信息密集表示,每个嵌入都是一个浮点数向量,使得向量空间中两个嵌入之间的距离与原始格式中两个输入之间的语义相似性相关联。
简单来说,Embedding 帮助计算机来理解如人类信息所代表的'含义',Embedding 可以用来获取文本、图像、视频、或其他信息的特征'相关性',这种相关性在应用层面常用于搜索、推荐、分类、聚类。
Embedding 是如何工作的?
举例来讲,这里有三句话:
- 'The cat chases the mouse'(猫追逐老鼠)
- 'The kitten hunts rodents'(小猫捕猎老鼠)
- 'I like ham sandwiches'(我喜欢火腿三明治)
如果是人类来将这三个句子来分类,句子 1 和句子 2 几乎是同样的含义,而句子 3 却完全不同。但我们看到在英文原文句子中,句子 1 和句子 2 只有'The'是相同的,没有其他相同词汇。计算机该如何理解前两个句子的相关性?
Embedding 将离散信息(单词和符号)压缩为分布式连续值数据(向量)。如果我们将之前的短语绘制在图表上,它可能看起来像这样:在文本被 Embedding 压缩到计算机可以理解的多维向量化空间之后,由于句子 1 和 2 的含义相似,它们会被绘制在彼此附近。句子 3 却距离较远,因为它与它们没有关联。
Embedding 的语义检索方式对比关键词检索的优势?
- 语义理解:基于 Embedding 的检索方法通过词向量来表示文本,这使得模型能够捕捉到词汇之间的语义联关系,相比之下,基于关键词的检索往往关注字面匹配。
- 容错性:由于基于 Embedding 的方法能够理解词汇之间的关系,所以在处理拼写错误、同义词、近义词等情况时更具优势。
- 多语言支持:许多 Embedding 方法可以支持多种语言,有助于实现跨语言的文本检索。
- 语境理解:基于 Embedding 的方法在处理一词多义的情况时更具优势,因为它能够根据上下文为词语赋予不同的向量表示。
Embedding 检索存在哪些限制?
- 输入词数限制:即便借助 Embedding 技术选取与查询最为匹配的文本片段供大型模型参考,词汇数量的约束依然存在。
- 仅支持文本数据:现阶段的 GPT-3.5 及诸多大型语言模型尚不具备图像识别功能,然而,在知识检索过程中,许多关键信息往往依赖于图文结合来充分理解。
- 大模型的胡编乱造:当检索到的相关文献资料不足以支撑大型模型准确回答问题时,为尽力完成响应,模型可能会出现一定程度的'即兴创作'。
Step 3:Docs 构建索引
介绍:为了加速检索过程,需要将 Embedding 后的向量存入向量数据库。
实战技巧:常用的向量数据库包括 Faiss、Milvus、Elasticsearch 等。
八、模块三:大模型微调
为什么需要大模型微调?
通常,要对大模型进行微调,有以下一些原因:
- 成本考量:因为大模型的参数量非常大,训练成本非常高,每家公司都去从头训练一个自己的大模型,这个事情的性价比非常低。
- Prompt Engineering 的局限:Prompt Engineering 的方式是一种相对来说容易上手的使用大模型的方式,但是它的缺点也非常明显。因为通常大模型的实现原理,都会对输入序列的长度有限制,Prompt Engineering 的方式会把 Prompt 搞得很长。越长的 Prompt,大模型的推理成本越高,因为推理成本是跟 Prompt 长度的平方正向相关的。另外,Prompt 太长会因超过限制而被截断,进而导致大模型的输出质量打折,这也是一个非常严重的问题。
- 效果要求:Prompt Engineering 的效果达不到要求,企业又有比较好的自有数据,能够通过自有数据,更好的提升大模型在特定领域的能力。这时候微调就非常适用。
- 个性化服务:要在个性化的服务中使用大模型的能力,这时候针对每个用户的数据,训练一个轻量级的微调模型,就是一个不错的方案。
- 数据安全:如果数据是不能传递给第三方大模型服务的,那么搭建自己的大模型就非常必要。通常这些开源的大模型都是需要用自有数据进行微调,才能够满足业务的需求。
如何对大模型进行微调?
大模型的微调技术路线问题
从参数规模的角度,大模型的微调分成两条技术路线:
- 技术路线一:对全量的参数,进行全量的训练,这条路径叫全量微调 FFT (Full Fine Tuning)。
- 技术路线二:只对部分的参数进行训练,这条路径叫 PEFT (Parameter-Efficient Fine Tuning)。
大模型的全量微调 FFT 技术存在哪些问题?
FFT 也会带来一些问题,影响比较大的问题,主要有以下两个:
- 训练的成本会比较高,因为微调的参数量跟预训练的是一样的多的。
- 灾难性遗忘 (Catastrophic Forgetting),用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差。
大模型的 PEFT 解决哪些问题?
PEFT 主要想解决的问题,就是 FFT 存在的上述两个问题,PEFT 也是目前比较主流的微调方案。
从训练数据的来源、以及训练的方法的角度,大模型的微调有以下几条技术路线:
- 技术路线一:监督式微调 SFT (Supervised Fine Tuning),这个方案主要是用人工标注的数据,用传统机器学习中监督学习的方法,对大模型进行微调。
- 技术路线二:基于人类反馈的强化学习微调 RLHF (Reinforcement Learning with Human Feedback),这个方案的主要特点是把人类的反馈,通过强化学习的方式,引入到对大模型的微调中去,让大模型生成的结果,更加符合人类的一些期望。
- 技术路线三:基于 AI 反馈的强化学习微调 RLAIF (Reinforcement Learning with AI Feedback),这个原理大致跟 RLHF 类似,但是反馈的来源是 AI。这里是想解决反馈系统的效率问题,因为收集人类反馈,相对来说成本会比较高、效率比较低。
微调的最终目的,是能够在可控成本的前提下,尽可能地提升大模型在特定领域的能力。
大模型 LLM 进行 SFT 操作的时候在学习什么?
- 预训练:在大量无监督数据上进行预训练,得到基础模型 -> 将预训练模型作为 SFT 和 RLHF 的起点。
- SFT:在有监督的数据集上进行 SFT 训练,利用上下文信息等监督信号进一步优化模型 -> 将 SFT 训练后的模型作为 RLHF 的起点。
- RLHF:利用人类反馈进行强化学习,优化模型以更好地适应人类意图和偏好 -> 将 RLHF 训练后的模型进行评估和验证,并进行必要的调整。
Step 1:大模型微调训练数据构建
介绍:如何构建训练数据?通常需要整理高质量的指令 - 输出对。
Step 2:大模型指令微调篇
介绍:如何构建训练数据?
实战技巧:包括继续预训练、指令微调、奖励模型训练、强化学习(PPO/DPO)等。
九、模块四:文档检索
为什么需要文档检索?
文档检索作为 RAG 核心工作,其效果对于下游工作至关重要。
虽然可以通过向量召回的方式从文档库里召回和用户问题相关的文档片段,同时输入到 LLM 中,增强模型回答质量。
常用的方式直接用用户的问题进行文档召回。但是很多时候,用户的问题是十分口语化的,描述的也比较模糊,这样会影响向量召回的质量,进而影响模型回答效果。
本章主要介绍文档检索过程中存在的一些问题和对应的解决方法。
Step 1:文档检索负样本样本挖掘
介绍:在各类检索任务中,为训练好一个高质量的检索模型,往往需要从大量的候选样本集合中采样高质量的负例,配合正例一起进行训练。
Step 2:文档检索优化策略
介绍:文档检索优化策略,包括重排序、混合检索等。
十、模块五:Reranker
为什么需要 Reranker?
基本的 RAG 应用包括四个关键技术组成部分:
- Embedding 模型:用于将外部文档和用户查询转换成 Embedding 向量。
- 向量数据库:用于存储 Embedding 向量和执行向量相似性检索(检索出最相关的 Top-K 个信息)。
- 提示词工程(Prompt engineering):用于将用户的问题和检索到的上下文组合成大模型的输入。
- 大语言模型(LLM):用于生成回答。
上述的基础 RAG 架构可以有效解决 LLM 产生'幻觉'、生成内容不可靠的问题。但是,一些企业用户对上下文相关性和问答准确度提出了更高要求,需要更为复杂的架构。一个行之有效且较为流行的做法就是在 RAG 应用中集成 Reranker。
什么是 Reranker?
Reranker 是信息检索(IR)生态系统中的一个重要组成部分,用于评估搜索结果,并进行重新排序,从而提升查询结果相关性。
在 RAG 应用中,主要在拿到向量查询(ANN)的结果后使用 Reranker,能够更有效地确定文档和查询之间的语义相关性,更精细地对结果重排,最终提高搜索质量。
Step 1:Reranker 篇
理论学习:RAG 文档检索——Reranker 篇。
实战技巧:bge-reranker 篇。
十一、模块六:RAG 评测面
为什么需要对 RAG 进行评测?
在探索和优化 RAG(检索增强生成器)的过程中,如何有效评估其性能已经成为关键问题。
Step 1:RAG 评测 篇
理论学习:RAG 评测篇。
十二、模块七:RAG 开源项目推荐学习
前面已经带你走完了 RAG 的各个流程,下面将推荐一些 RAG 开源项目,帮助大佬们进行消化学习。
- RAGFlow:一款基于深度文档理解构建的开源 RAG 引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠的问答以及有理有据的引用。
- QAnything:一个本地知识库问答系统,旨在支持多种文件格式和数据库,允许离线安装和使用。使用 QAnything,您可以简单地删除本地存储的任何格式的文件,并获得准确、快速和可靠的答案。
- ElasticSearch-Langchain:受 langchain-ChatGLM 项目启发,由于 Elasticsearch 可实现文本和向量两种方式混合查询,且在业务场景中使用更广泛,因此本项目用 Elasticsearch 代替 Faiss 作为知识存储库,利用 Langchain+Chatglm2 实现基于自有知识库的智能问答。
- Langchain-Chatchat:基于 Langchain 与 ChatGLM 等语言模型的本地知识库问答 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM) QA app with langchain。