一、 RAG 有什么用
RAG 可以解决通用大模型存在的问题
通用的基础大模型的局限性
知识的局限性
- 模型自身的知识完全源于它的训练数据,而现有的主流大模型如 ChatGPT,文心一言等的训练集基本都是构建于网络公开的数据,对于一些实时性的,非公开的或离线的数据是无法获取到的,这部分知识也就无从具备。
- 规模越大(参数越多,tokens 越多),大模型训练的成本越高,比如帮我看看今天晚上有什么电影值得去看,这种任务是需要去淘票票、猫眼等网站先获取最新电影信息的,大模型本身无法完成这个任务
幻觉问题
- 所有的 AI 模型的底层原理都是基于数学概率,其模型输出实质上是一系列数值运算,大模型也不例外,所以它有时候会一本正经胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的场景。而这种幻觉问题的区分是比较困难的,因为它要求使用者自身具备相应领域的知识
- 大模型的底层原理是基于概率,在没有答案的情况下经常会胡说八道,提供虚假信息
数据安全性
- 对于企业来说,数据安全至关重要,没有企业愿意承担数据泄漏的风险,将自身的私域数据上传第三方平台进行训练,这也导致完全依赖通用大模型自身能力的应用方案不得不在数据安全和效果方面进行取舍
- openAI 已经遭遇过几次隐私数据的投诉,对于企业来说,如果把自己的经营数据、合同文件等机密文件和数据上传到互联网上的大模型,那想想都可怕。既要保证安全,又要借助 AI 能力,那么最好的方式就是把数据全部放在本地,企业数据的业务计算全部在本地完成。而在线的大模型仅仅完成一个归纳的功能,甚至,LLM 都可以完全本地化部署。
二、 RAG 是什么
概念
- RAG(Retrieval-Augemented Generation)检索增强生成
- RAG 是一种 AI 框架,它将传统信息检索系统(例如数据库或私域数据)的优势与生成式大语言模型 LLM 的功能结合在一起,LLM 通过将这些额外的知识与自己的语言技能相结合,可以得到更准确、更具时效性且更贴合具体需求的回答
检索
- 检索是 RAG 流程的第一步,从预先建立的知识库中检索与问题相关的信息。这一步的目的是为后续的生成过程提供有用的上下文信息和知识支撑
增强
- RAG 中增强是将检索到的信息用作生成模型(即大语言模型)的上下文输入,以增强模型对特定问题的理解和回答能力。这一步的目的是将外部知识融入生成过程中,使生成的文本内容更加丰富、准确和符合用户需求。通过增强步骤,LLM 模型能够充分利用外部知识库中的信息
生成
- 生成是 RAG 流程的最后一步。这一步的目的是结合 LLM 生成符合用户需求的回答。生成器会利用检索到的信息作为上下文输入,并结合大语言模型来生成文本内容
三、 RAG 的工作原理
创建外部数据
- LLM 原始训练数据集之外的新数据称为外部数据。
- 它可以来自多个数据来源,例如 API、数据库或文档存储库。数据可能以各种格式存在,例如文件、数据库记录或长篇文本。
- 另一种称为嵌入语言模型的 AI 技术将数据转换为数字表示形式并将其存储在向量数据库中。这个过程会创建一个生成式人工智能模型可以理解的知识库。
检索相关信息
- 下一步是执行相关性搜索。用户查询将转换为向量表示形式,并与向量数据库匹配。
- 例如,考虑一个可以回答组织的人力资源问题的智能聊天机器人。如果员工搜索:“我有多少年假?”,系统将检索年假政策文件以及员工个人过去的休假记录。这些特定文件将被退回,因为它们与员工输入的内容高度相关。相关性是使用数学向量计算和表示法计算和建立的
增强 LLM 提示
- 接下来,RAG 模型通过在上下文中添加检索到的相关数据来增强用户输入(或提示)。此步骤使用提示工程技术与 LLM 进行有效沟通。增强提示允许大型语言模型为用户查询生成准确的答案
更新外部数据
- 下一个问题可能是——如果外部数据过时了怎么办? 要维护当前信息以供检索,请异步更新文档并更新文档的嵌入表示形式。您可以通过自动化实时流程或定期批处理来执行此操作。这是数据分析中常见的挑战——可以使用不同的数据科学方法进行变更管理
四、 RAG 的工作流程
数据准备
数据提取
数据加载
- 将外部数据进行清理和提取,将 csv、pdf、html、word、markdown,甚至是图片和视频等不同格式的文件转换成纯文本
- 包括多格式数据加载、不同数据源获取等,根据数据自身情况,将数据处理为同一个范式
- 使用专门的文档加载器例如 PDF 提取器或多模态模型如 OCR 技术,将这些丰富的知识源转换为大语言模型可理解的纯文本数据,对于图片和视频,OCR 技术能够识别并转换其中的文字信息
- 这里可以借助 langchain 内置的加载器来实现
数据处理
元数据获取
- 提取数据中关键信息,例如文件名、Title、时间等
文本分割
分割原因
- 鉴于文档可能存在过长的问题,还需要进行一项关键步骤:文档切片,需要将长篇文档分割成多个文本块,以便更高效地处理和检索信息
- 文本分割主要考虑两个因素,embedding 模型的 Tokens 限制情况、语义完整性对整体的检索效果的影响
分割方法
- 句分割:以句为粒度进行切分,保留一个句子的完整语义,常用切分符包括:句号、感叹号、问号、换行符等
- 固定长度分割:根据 enbedding 模型的 token 长度限制,将文本分割为固定长度(例如 256/512 个 tokens),这种切分方式损失很多语义信息,一般通过在头尾增加一定冗余量来缓解。只需要决定块中的标记数量,以及可选地确定它们之间是否应该有重叠,它的计算成本低且易于使用,因为它不需要使用任何 NLP 库。chunk size 块大小,overlap size 重叠大小
- NLP 工具分块:例如借助 spaCy,它是一个用于 NLP 任务的强大 python 库,它提供了复杂的句子分割功能,可以有效地将文本分割成单独的句子,从而在生成的块中更好地保留上下文,帮助创建更有意义的块
- 递归分块:使用一组分隔符以分层和迭代的方式输入文本划分为更小的块,
向量化
简要介绍
- 向量化是一个将文本数据转化为向量矩阵的过程,该过程会直接影响到后续检索的效果。目前常见的 embedding 模型如图,这些 embedding 模型基本能满足大部分需求,但对于特殊场景(例如涉及一些罕见专有词或字等)或者想进一步优化效果,则可以选择开源 Embedding 模型微调或直接训练适合自己场景的 embedding 模型
为什么要做嵌入
- 我们使用的日常语言中充满歧义和对表达词意无用的助词,而向量表示则更加密集、精确,能够捕捉到句子的上下文关系和核心含义。这些转换使得我们能够通过简单计算向量之间的差异来识别语义上相似的句子
什么是文本嵌入
- 嵌入也叫向量化,就是将文本内容通过 embedding 嵌入模型转化为多维向量的过程
- 虽然计算机并不能理解自然语言,但是借助 LLM 技术的一个关键部分是翻译器,它可以从人类文字语言翻译成人工智能数字语言。我们称这种翻译机为嵌入机,它输入人类语言,输出人工智能理解的数字语言
- 嵌入模型的核心任务是将文本转换为向量形式
创建索引
- 完成嵌入之后,下一步是创建索引,将原始语料块和嵌入以键值对形式存储,以便于未来进行快速且频繁的搜索。使用专业的向量数据库进行存储向量数据,常用的向量数据库有 Chroma、FAISS、ES 等
数据入库
简要介绍
- 数据向量化后构建索引,并写入数据库的过程可以概述为数据入库过程,适用于 RAG 场景的数据库包括:FAISS、Chromadb、ES、milvus 等。一般可以根据业务场景、硬件、性能需求等多因素综合考虑、选择合适的数据库
存储方式
- 向量数据库是专门设计用于存储和检索向量数据的数据库系统
- 在 RAG 系统中,通过嵌入模型生成的所有向量都会被存储在这样的数据库中
- 这种数据库优化了处理和存储大规模向量数据的效率,使得在面对海量知识向量时,我们能够迅速检索出和用户查询最相关的信息
应用阶段
数据检索
简要介绍
- 数据检索是 RAG 框架中的重要组成部分,目标是根据用户的查询,快速检索到与之最相关的知识,并将其融入提示 prompt 中
检索步骤
- 根据用户的输入,采用与索引创建相同的编码模型将查询内容转换为向量
- 系统会计算问题向量与语料库中文档块向量之间的相似性,并根据相似度水平选出最相关的前 K 个文档块作为当前问题的补充背景信息
检索方法
- 相似性检索:即计算查询向量与所有存储向量的相似性得分,返回得分高的记录。常见的相似性检索方法包括:余弦相似性、欧式距离、曼哈顿距离等
- 全文检索:全文检索是一种比较经典的检索方式,在数据存入时,通过关键词构建倒排索引;在检索时,通过关键词进行全文检索,找到对应的记录
注入 prompt
简要介绍
- prompt 作为大模型的直接输入,是影响模型输出准确率的关键因素之一。在 RAG 场景中,prompt 一般包括任务描述、背景知识(检索得到),任务指令(一般是用户提问)等,根据任务场景和大模型性能,也可以在 prompt 中适当加入其他指令优化大模型的输出
举例说明
- 一个简单知识问答场景的 prompt 如下所示
- 任务描述:假如你是一个专业的客服机器人,请参考【背景知识】,
- 背景知识:{content} // 数据检索得到的相关文本
- 问题:石头扫地机器人 p10 的续航时间是多久
- prompt 的设计只有方法,没有语法,比较依赖于个人经验,在实际应用过程中,往往需要根据大模型的实际输出进行针对性的 prompt 调优
生成
简要介绍
- 是指将用户的问题与知识库被检索出的文本块相结合,用 prompt 的形式传递给大语言模型的上下文,使大模型更好理解用户意图,生成用户想要的结果
五、 RAG 的体系结构
简要介绍
- RAG 系统的体系结构由两个主要模块和一个融合机制组成,它们协同工作,生成准确且上下文相关的输出。RAG 模块可以进行端到端训练,使算法能够联合优化检索和生成,从而生成更有依据、更可靠的结果
检索器模块
- 检索器模块可在大型数据集中进行搜索,以查找与查询最相关的信息片段
生成器模块
- 检索完成后,生成器模块会将检索到的信息作为额外的上下文,生成一致且相关的回复。通常,生成器模块是预先训练好的语言模型,如生成式预训练转换器 (GPT) 或双向自回归转换器 (BART),这种模型经过微调后可以根据输入和检索到的信息生成文本
融合机制
- 融合机制可确保在生成过程中有效结合检索到的信息。通过模块之间的这种交互,RAG 系统能够以检索到的知识为基础进行生成,从而生成更有依据、更可靠的内容。
六、 RAG 的类型
开放域问题解答
- 用例:RAG 在 ODQA 系统中非常有效,用户几乎可以就任何主题提出问题。
- 示例:客户支持聊天机器人使用 RAG 从大型知识库或常见问题解答中检索信息,从而提供准确的答案。
特定领域的专用查询
- 用例:对于法律行业而言,RAG 可以通过检索相关文档,协助分析和生成案例法、判例和法规的摘要。
- 示例:法律助理工具可为特定目的检索和汇总文档。
内容摘要
- 用例:通过检索相关信息并将其集成到生成的文本中,RAG 可以帮助生成高质量的内容,如虚拟助理的会议记录,或文章、报告或博客文章的摘要。
- 示例:记者使用 RAG 从各种来源获取关键详细信息,生成近期新闻文章的摘要。
个性化推荐
- 用例:RAG 可以通过检索特定于用户的信息并生成个性化建议来增强推荐系统。
- 示例:电子商务平台使用 RAG 根据用户的浏览历史记录和偏好推荐产品,并提供根据相关产品评论或描述生成的说明。
复杂场景分析和内容制作
- 用例:混合 RAG 模型可以通过从多个复杂源检索相关数据、文档或新闻,用于生成并合成详细的报告或分析。
- 示例:财务分析工具通过检索和汇总最近的市场趋势、历史财务数据、股票表现、专家评论和经济指标来生成投资预测、分析或报告。
研究信息和合成
- 用例:研究人员可以使用 RAG 检索并合成学术论文、报告或数据库中的信息,从而简化审查过程并促进研究项目的进行。
- 示例:学术工具通过从各种研究中提取关键发现来生成相关研究论文的摘要。
多语言和跨语言应用
- 用例:RAG 可以在多语言环境中部署,以检索不同语言的信息并生成跨语言内容。
- 示例:翻译工具在翻译文本的同时也会检索与文化相关的信息,以确保翻译在上下文中是恰当的。
参考
https://zhuanlan.zhihu.com/p/668082024
https://blog.csdn.net/m0_70486148/article/details/144883208
https://cloud.tencent.com/developer/article/2373282
https://aws.amazon.com/cn/what-is/retrieval-augmented-generation/
https://blog.csdn.net/2401_82452722/article/details/135934144
https://azure.microsoft.com/zh-cn/resources/cloud-computing-dictionary/what-is-retrieval-augmented-generation-rag