RAG 技术原理

2024-08-26 03:04
文章标签 技术 原理 rag

本文主要是介绍RAG 技术原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

      • RAG 技术原理
        • 背景和概念
        • 实现步骤
          • 1. ChatGPT/GLM 等大语言模型的调用
          • 2. 读取知识库数据
          • 3. 文本索引与答案检索
          • 4. 文本嵌入与向量检索
          • 5. 文本多路召回与重排序
          • 6. 文本问答Promopt优化
        • 原创链接

RAG 技术原理

背景和概念
  • 在自然语言处理领域,大型语言模型(LLM)如GPT-3、BERT等已经取得了显著的进展,它们能够生成连贯、自然的文本,回答问题,并执行其他复杂的语言任务。然而,这些模型存在一些固有的局限性,如“模型幻觉问题”、“时效性问题”和“数据安全问题”。为了克服这些限制,检索增强生成(RAG)技术应运而生。

    大模型现存问题大型语言模型的局限性
    问题1.1模型幻觉问题:生成内容可能不准确或不一致
    问题1.2时效性问题:生成的内容不具有当前时效性
    问题1.3数据安全问题:可能存在敏感信息泄露风险

请添加图片描述

  • RAG技术结合了大型语言模型的强大生成能力和检索系统的精确性。它允许模型在生成文本时,从外部知识库中检索相关信息,从而提高生成内容的准确性、相关性和时效性。这种方法不仅增强了模型的回答能力,还减少了生成错误信息的风险。

  • RAG被构建为一个应用于大型语言模型的框架,其目标是通过结合大模型的生成能力和外部知识库的检索机制,提升自然语言处理任务的效果。 RAG并非旨在取代已有的知识库问答(KBQA)系统,而是作为一种补充,利用检索机制强调实时性和准确性,从而弥补大型语言模型固有的局限性。

  • RAG每个步骤都面临一些挑战,这些挑战使得RAG的实现变得复杂而困难。在问题理解阶段,系统需要准确把握用户的意图。用户提问往往是短文本,而知识库中的信息可能是长文本。 将用户提问与知识库中的知识建立有效的关联是一个难点,特别是考虑到用户提问可能模糊,用词不规范,难以直接找到相关的知识。

    知识检索是RAG流程中的关键步骤,但也是面临挑战的步骤之一。用户提问可能以多种方式表达,而知识库的信息来源可能是多样的,包括PDF、PPT、Neo4j等格式。

    此外用户的意图可能非常灵活,可能是提问,也可能需要进行闲聊 。在这个阶段,需要确保生成的答案与用户的意图一致,同时保持自然、连贯的文本。此外,大型模型的输出可能存在幻觉问题,即生成的内容可能与问题不相关,增加了生成准确回答的难度。

    技术类型描述
    Naive RAGNaive RAG是RAG技术的最基本形式,也被称为经典RAG。包括索引、检索、生成三个基本步骤。索引阶段将文档库分割成短的Chunk,并构建向量索引。检索阶段根据问题和Chunks的相似度检索相关文档片段。生成阶段以检索到的上下文为条件,生成问题的回答。
    Advanced RAGAdvanced RAG在Naive RAG的基础上进行优化和增强。包含额外处理步骤,分别在数据索引、检索前和检索后进行。包括更精细的数据清洗、设计文档结构和添加元数据,以提升文本一致性、准确性和检索效率。在检索前使用问题的重写、路由和扩充等方式对齐问题和文档块之间的语义差异。在检索后通过重排序避免“Lost in the Middle”现象,或通过上下文筛选与压缩缩短窗口长度。
    Modular RAGModular RAG引入更多具体功能模块,例如查询搜索引擎、融合多个回答等。技术上融合了检索与微调、强化学习等。流程上对RAG模块进行设计和编排,出现多种不同RAG模式。提供更大灵活性,系统可以根据应用需求选择合适的功能模块组合。模块化RAG的引入使得系统更自由、灵活,适应不同场景和需求。
  • 在RAG技术流程中,涉及多个关键模块,每个模块承担着特定的任务,协同工作以实现准确的知识检索和生成自然语言回答。

    技术模块描述
    意图理解意图理解模块负责准确把握用户提出的问题,确定用户的意图和主题。处理用户提问的模糊性和不规范性,为后续流程提供清晰的任务目标。
    文档解析文档解析模块用于处理来自不同来源的文档,包括PDF、PPT、Neo4j等格式。该模块负责将文档内容转化为可处理的结构化形式,为知识检索提供合适的输入。
    文档索引文档索引模块将解析后的文档分割成短的Chunk,并构建向量索引。或通过全文索引进行文本检索,使得系统能够更快速地找到与用户问题相关的文档片段。
    向量嵌入向量嵌入模块负责将文档索引中的内容映射为向量表示,以便后续的相似度计算。这有助于模型更好地理解文档之间的关系,提高知识检索的准确性。
    知识检索知识检索模块根据用户提问和向量嵌入计算的相似度检索或文本检索打分。这一步骤需要解决问题和文档之间的语义关联,确保检索的准确性。
    重排序重排序模块在知识检索后对文档库进行重排序,以避免“Lost in the Middle”现象,确保最相关的文档片段在前面。
    大模型回答大模型回答模块利用大型语言模型生成最终的回答。该模块结合检索到的上下文,以生成连贯、准确的文本回答。
    其他功能模块可根据具体应用需求引入其他功能模块,如查询搜索引擎、融合多个回答等。模块化设计使得系统更加灵活,能够根据不同场景选择合适的功能模块组合。
实现步骤
1. ChatGPT/GLM 等大语言模型的调用
2. 读取知识库数据
3. 文本索引与答案检索

文本检索是一个多步骤的过程,其核心是构建倒排索引以实现高效的文本检索:

  • 步骤1(文本预处理):在文本预处理阶段,对原始文本进行清理和规范化,包括去除停用词、标点符号等噪声,并将文本统一转为小写。接着,采用词干化或词形还原等技术,将单词转换为基本形式,以减少词汇的多样性,为后续建立索引做准备。
  • 步骤2(文本索引):构建倒排索引是文本检索的关键步骤。通过对文档集合进行分词,得到每个文档的词项列表,并为每个词项构建倒排列表,记录包含该词项的文档及其位置信息。这种结构使得在查询时能够快速找到包含查询词的文档,为后续的文本检索奠定了基础。
  • 步骤3(文本检索):接下来是查询处理阶段,用户查询经过预处理后,与建立的倒排索引进行匹配。计算查询中每个词项的权重,并利用检索算法(如TFIDF或BM25)对文档进行排序,将相关性较高的文档排在前面

在实际应用中,倒排索引的构建和维护需要考虑性能问题,采用一些优化技术来提高检索效率,如压缩倒排索引、分布式索引等。这些步骤共同构成了一个有序而逻辑完整的文本检索流程。

4. 文本嵌入与向量检索

语义检索流程

语义检索是通过词嵌入和句子嵌入等技术,将文本表示为语义丰富的向量。通过相似度计算和结果排序找到最相关的文档。用户查询经过自然语言处理处理,最终系统返回经过排序的相关文档,提供用户友好的信息展示。语义检索通过深度学习和自然语言处理技术,使得系统能够更准确地理解用户查询,提高检索的准确性和效果。

Sentence Transformer
问题句子
PDF内容句子
标准化
标准化
相似度计算
相似度计算
排序
选取最大值
写入结果
加载模型
编码文本
问题Embeddings
PDF内容Embeddings
相似度矩阵
排序后的相似度
最相似的页码
生成提交结果

文本编码模型

文本编码模型对于语义检索的精度至关重要。目前,大多数语义检索系统采用预训练模型进行文本编码,其中最为常见的是基于BERT(Bidirectional Encoder Representations from Transformers)的模型,或者使用GPT(Generative Pre-trained Transformer)等。这些预训练模型通过在大规模语料上进行训练,能够捕捉词语和句子之间的复杂语义关系。选择合适的文本编码模型直接影响到得到的文本向量的有效性,进而影响检索的准确性和效果。

编码模型排行榜:https://huggingface.co/spaces/mteb/leaderboard

文本切分方法

文本的长度是另一个关键因素,影响了文本编码的结果。短文本和长文本在编码成向量时可能表达不同的语义信息。即使两者包含相同的单词或有相似的语义,由于上下文的不同,得到的向量也会有所不同。因此,当在语义检索中使用短文本来检索长文本时,或者反之,可能导致一定的误差。针对文本长度的差异,有些系统采用截断或填充等方式处理,以保持一致的向量表示。

更多阅读资料:

  • https://python.langchain.com/docs/modules/data_connection/document_transformers/ 119
  • https://chunkviz.up.railway.app/
名称分割依据描述
递归式分割器一组用户定义的字符递归地分割文本。递归分割文本的目的是尽量保持相关的文本段落相邻。这是开始文本分割的推荐方式。
HTML分割器HTML特定字符基于HTML特定字符进行文本分割。特别地,它会添加有关每个文本块来源的相关信息(基于HTML结构)。
Markdown分割器Markdown特定字符基于Markdown特定字符进行文本分割。特别地,它会添加有关每个文本块来源的相关信息(基于Markdown结构)。
代码分割器代码(Python、JS)特定字符基于特定于编码语言的字符进行文本分割。支持从15种不同的编程语言中选择。
Token分割器Tokens基于Token进行文本分割。存在一些不同的Token计量方法。
字符分割器用户定义的字符基于用户定义的字符进行文本分割。这是较为简单的分割方法之一。
语义分块器句子首先基于句子进行分割。然后,如果它们在语义上足够相似,就将相邻的句子组合在一起。

对于自然语言,可以推荐使用Token分割器,结合Chunk Size和Overlap Size可以得到不同的切分:

  • Chunk Size(块大小):表示将文本划分为较小块的大小。这是分割后每个独立文本块的长度或容量。块大小的选择取决于应用的需求和对文本结构的理解。
  • Overlap Size(重叠大小):指相邻两个文本块之间的重叠部分的大小。在切割文本时,通常希望保留一些上下文信息,重叠大小就是控制这种上下文保留的参数。
5. 文本多路召回与重排序

多路召回逻辑

多路召回逻辑是在文本检索中常用的一种策略,其目的是通过多个召回路径(或方法)综合获取候选文档,以提高检索的全面性和准确性。单一的召回方法可能由于模型特性或数据特点而存在局限性,多路召回逻辑引入了多个召回路径,每个路径采用不同的召回方法。

  • 实现方法1:将BM25的检索结果 和 语义检索结果 按照排名进行加权
  • 实现方法2:按照段落、句子、页不同的角度进行语义编码进行检索,综合得到检索结果。

重排序逻辑(BM25 + BGE Rerank)

重排序逻辑是文本检索领域中一种重要的策略,主要用于优化原有文本检索方法返回的候选文档顺序,以提高最终的检索效果。在传统的文本检索方法中,往往采用打分的逻辑,如计算BERT嵌入向量之间的相似度。而重排序逻辑引入了更为复杂的文本交叉方法,通过特征交叉得到更进一步的打分,从而提高排序的准确性。

  • 重排序逻辑常常使用更为强大的模型,如交叉编码器(cross-encoder)模型。这类模型能够更好地理解文本之间的交叉关系,捕捉更复杂的语义信息。
  • 首先通过传统的嵌入模型获取初始的Top-k文档,然后使用重排序逻辑对这些文档进行重新排序。这样可以在保留初步筛选文档的基础上,更精确地排列它们的顺序。
6. 文本问答Promopt优化
原创链接

这部分内容属于摘录,原文见 http://discussion.coggle.club/t/topic/30

这篇关于RAG 技术原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107363

相关文章

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit