目录
RAG检索增强生成技术知识梳理
一、RAG出现的原因
这个就不得不谈到目前大模型面临挑战了
1. 制造虚假事实:大模型经常制造虚假事实,特别是在处理特定领域或⾼度专业化的查询时。
2. 知识限制:当所寻求的信息超出模型训练数据范围或需要最新数据时,大模型可能⽆法提供准确答案。
二、RAG是什么
RAG,中文名叫检索增强生成,是一种使用外部数据源的方式来辅助大模型文本生成的技术,它结合了检索和生成两个主要组件的语言模型架构,通过检索相关信息来增强模型的生成能力。
原理
检索:
- 负责从一个知识库、数据库或外部数据源中检索出与查询最相关的文档或信息片段,检索到的信息和用户查询一起给到大模型,作为背景信息或事实。
- 首先,需要通过向量模型将可作为背景信息的数据经过向量化存入到向量数据库中,单用户查询时,向量模型也会计算该查询的向量,然后通过计算查询的向量和向量数据库中文档的相似性,选出分数最高的文档。
生成:
- LLM使用从上一步检索到的信息和用户的查询生成文本回复。、
工作流程
- 接受用户的输入查询
- 检索器在知识库中检索相关文档。这些文档的来源是通过在离线状态下对数据进行清理、切块、向量计算等存入向量数据库中。
- 根据相似度,选择最相似的相关文档和原始查询一起作为模型的输入
- 生成模型根据合并后的信息产生回答,在多伦对话场景中,可以整合历史对话信息,以提升回答的相关性。
三、RAG 和 微调的对比
RAG:依赖外部知识库进⾏动态检索,以实时更新和扩展模型的知识。
微调:在特定数据集上调整预训练模型的参数,以提⾼在特定任务上的表现,不涉及实时检索外部信息。
RAG和微调不是相互排斥的,⽽是可以相互补充,从不同层⾯增强模型的能⼒。在某些情况下,结合这两种技术可以实现最佳的模型性能。
四、RAG面临的挑战
- RAG比较依赖检索器检索的结果,如果检索到不准确的信息,那么生成的结果也会出现错误。
- 毕竟在大模型推理前,需要到向量数据库中检索,有一定的计算成本和性能损耗。
- 从检索器中检索到的文档可能会有很多,需要评估哪些文档可能和查询任务最相关。
- 向量数据库中的文档需要先进行切块才能放入,按照什么切,以及切块的大小也会直接影响生成的结果。
五、RAG优化
检索优化
- 整合文档元数据(比如作者、发布日期、文档类型),这样可以支持更加复杂的查询需求和改善结果的相关性。
- 结合稀疏检索和密集检索来进行检索,提高检索准确性。(稀疏检索和密集检索后面会说)
- 对检索器检索到的结果进行重排序,比如引入基于机器学习的排序模型,如学习排序技术,确保最相关的信息能够优先展现给用户。(这个没有实践过)
生成器增强
- 依据提示词优化相关技术,比如提示压缩、活跃提示、思维链提示等技术 提高模型输出质量。
六、知识库构建
6.1 文档预处理
将各种格式的文档转换为文本格式
PyPDF2:主要⽤于处理PDF⽂件,⽀持提取⽂本、分割和合并PDF⻚⾯。适⽤于简单的PDF⽂本提取任务, 但可能在处理复杂布局时遇到限制。
PDF2Text:⼀种更专注于将PDF⽂档转换为纯⽂本的⼯具,强调转换质量和速度,适合⼤规模的PDF⽂本提 取需求。
GROBID:利⽤机器学习⽅法处理PDF和其他类型⽂档的⾼级解析⼯具。能够识别⽂档的结构和元数据,适⽤ 于需要⾼精度⽂档结构化信息的场景。
OCR:
⽂字:Paddle-OCR,Rapid-OCR;
表格:Camelot,Paddle-OCR,阿⾥追光,Talbe Transformer;
公式:Nougat, marker;
选择哪个⼯具取决于具体的需求:对于需要⾼精度结构化输出的应⽤,GROBID是更好的选择;⽽对于⼤量PDF⽂本提取,PDF2Text可能更为⾼效。
1. PyPDF2 : https://github.com/py-pdf/pypdf.git
2. GROBID : https://github.com/kermitt2/grobid.git
3. Paddle-OCR : https://github.com/PaddlePaddle/PaddleOCR.git
4. Rapid-OCR : https://github.com/RapidAI/RapidOCR.git
6.2 向量数据库
向量数据库用于存储文档的向量表示,支持高效的相似度搜索。
有很多的向量数据库,下面列出部分数据库。
FAISS:由Meta开发,专为⾼效相似度搜索和密集向量聚类设计。特别适⽤于处理极⼤规模的数据集。
Milvus:⼀个开源的向量数据库,⽀持海量向量的存储和检索,提供了灵活的索引构建和搜索能⼒。适⽤于企业级应⽤。
ElasticSearch:⼀个开源的搜索引擎,⽀持全⽂搜索及稠密向量的搜索。适合于⽂本搜索与简单向量搜索的场景。
1. FAISS : https://github.com/facebookresearch/faiss.git
2. Milvus : https://github.com/milvus-io/milvus.git
3. ElasticSearch : https://github.com/elastic/elasticsearch.git
6.3 Embedding模型选择
选择合适的嵌⼊模型对于⽣成⾼质量的⽂档表示⾄关重要:
BERT、RoBERTa、GPT等预训练语⾔模型,能够捕获深层次的语义信息,适合于⽂本嵌⼊。
Sentence-BERT、SimCSE等专为句⼦级别或段落级别的相似度计算优化的模型,提供了更加精细的⽂本向量化⽅式。
Embedding中⽂模型排名:(2024.04.02)
https://huggingface.co/spaces/mteb/leaderboard
6.4 索引写⼊策略
有效的索引写⼊策略可以提⾼检索的准确性和效率。
⽂本预处理:包括去除停⽤词、词⼲提取、⼩写化等,以减少噪声并提⾼向量表示的质量。
⽂本框⼤⼩调整:根据实际需求调整⽂本块的⼤⼩,较⼩的块有助于提⾼检索的精确度,⽽较⼤的块可能更适合概览式的搜索。
⽂本块重叠处理:通过让⽂本块之间有⼀定的重叠,可以避免重要信息被切分⾄不同块中⽽影响检索效果。
七、 检索器
7.1 稀疏检索 SR,Sparse Retriever
稀疏检索器主要基于⽂档和查询的词项匹配,是⼀种传统但强⼤的信息检索技术。
BM25:作为稀疏检索的标准算法,BM25通过考虑词项频率(TF)和逆⽂档频率(IDF)来评估查询和⽂档之间的相关性。由于其简单有效,BM25常被⽤作稀疏检索的基线模型。
rank-bm25:这是BM25的⼀个基础实现,没有包含复杂的预处理步骤,因其易于使⽤,在Python社区中被⼴泛集成,如LangChain和Llama-index等库。
Pyserini BM25:Pyserini提供了⼀种更⾼级的BM25实现,包含了词⼲提取和去除特定语⾔停⽤词等预处理步骤,旨在提⾼检索的精确度和效率。
7.1.1 BM25
BM25是⼀种⼴泛使⽤的排名函数,⽤于信息检索中以评估⽂档相对于给定搜索查询的相关性。它是Okapi BM25算法的变体,基于概率检索框架。BM25考虑了词频(term frequency, TF)和逆⽂档频率(inverse document frequency, IDF),以及⽂档⻓度对搜索查询中每个词的重要性的影响。
(1)BM25算法原理
BM25的评分函数基于以下⼏个关键概念:
TF (Term Frequency): 词项在⽂档中出现的频率。BM25对传统的TF值进⾏了调整,以防⽌⻓⽂档过度放⼤词项的影响。
IDF (Inverse Document Frequency): 词项的普遍重要性的度量。IDF值越⾼,表示词项在较少的⽂档中出
现,因此具有更⾼的区分能⼒。
⽂档⻓度归⼀化:BM25通过考虑⽂档⻓度与平均⽂档⻓度的⽐例来调整评分,以公平对待⻓⽂档和短⽂档。
BM25的评分函数为每个⽂档计算⼀个分数,表示该⽂档与查询的相关性。分数越⾼,⽂档与查询的相关性越⾼。
BM25的评分公式如下
7.1.2 SR的特点
(1) 优势
1. ⾼效性:稀疏检索器因其简单的匹配机制和优化过的索引结构⽽具有⾼效的检索速度,尤其适⽤于⼤规模⽂档集合。
2. 解释性:由于稀疏检索依赖于词项的显式匹配,它的检索结果通常更易于解释。⽤户和开发者可以直观地理解为何某个⽂档与查询相关。
3. 简单性:稀疏检索器的实现相对简单,不需要复杂的模型训练过程,易于部署和维护。
4. 鲁棒性:在处理包含关键词或具有明确查询意图的搜索时,稀疏检索器能够提供可靠的性能。
(2) 劣势
1. 语义匹配限制:稀疏检索器在处理语义上相关但不共享显式词项的查询和⽂档时性能受限,可能错过语义上相关但词项不匹配的⽂档。
2. 对⻓尾查询的处理:对于⾮常具体或罕⻅的查询,稀疏检索器可能因为缺乏直接的词项匹配⽽难以检索到⾼度相关的⽂档。
3. 更新和维护开销:虽然稀疏检索器在建⽴索引时效率较⾼,但对索引的更新(如添加新⽂档)可能需要额外的处理,尤其是在⽂档集合频繁变化的情况下。
4. 查询依赖性:稀疏检索器的性能⾼度依赖于查询的质量,对于模糊或多义性查询,可能⽆法准确理解⽤户的真实意图。
7.2 密集检索 DR,Dense Retriever
密集检索器(Dense Retriever, DR)是⼀种基于深度学习的信息检索技术,旨在通过理解⽂档和查询的深层语义信息来提⾼检索的准确性和效率。
不同于传统的稀疏检索技术,如BM25,它依赖于显式的词项匹配,密集检索器利⽤预训练的神经⽹络模型,如BERT,来学习⽂档和查询的密集向量表示。这些向量表示能够捕捉到⽂本的深层语义信息,从⽽实现更精确的语义匹配。
7.2.1 DR的⼯作原理
1. 双编码器架构:DR通常采⽤双编码器架构,包括⼀个查询编码器和⼀个⽂档编码器。这两个编码器可以是同⼀个预训练模型的两个实例,也可以是不同的模型。查询编码器⽤于将⽤户查询转换为密集向量,⽽⽂档编码器将⽂档库中的每个⽂档转换为密集向量。
2. 向量相似度计算:⼀旦查询和⽂档被转换为向量,DR通过计算查询向量与⽂档向量之间的相似度来检索最相关的⽂档。相似度通常通过余弦相似性计算,选出相似度最⾼的前k个⽂档作为检索结果。
3. 预训练与微调:DR模型通常在⼤规模⽂本数据上进⾏预训练,以学习通⽤的语⾔表示。然后,可以通过在特定检索任务的标注数据上进⾏微调,来优化模型对该任务的性能。
7.2.2 DR的特点
(1)优势
1. 语义匹配能⼒:DR能够理解查询和⽂档的深层语义信息,即使没有直接的词项重叠,也能检索到语义上相关的⽂档。
2. 可扩展性:尽管密集检索器需要在预训练阶段处理⼤量数据,但⼀旦模型被训练和优化,检索过程相对⾼效,特别是通过使⽤近似最近邻搜索(Approximate Nearest Neighbor, ANN)技术来加速向量搜索。
3. 适应性:通过微调,DR可以适应不同的领域和任务,从⽽提供更定制化的检索服务。
(2)劣势
1. 计算成本:预训练和微调密集检索器需要⼤量的计算资源,特别是对于⼤规模⽂档库。
2. 冷启动问题:对于新的检索任务,可能缺乏⾜够的标注数据来进⾏有效的微调。
3. 更新与维护:⽂档库的更新可能要求重新计算⽂档向量,增加了系统的维护成本。
7.2.3 DR的应⽤
密集检索技术已经被⼴泛应⽤于各种信息检索任务中,包括但不限于:
问答系统:通过理解问题和知识库⽂档的语义,精准检索到包含答案的⽂档。
⽂档检索:在法律、医疗等领域提供基于语义的⽂档检索服务。
个性化推荐:分析⽤户的查询和历史⾏为,检索出最相关的内容或商品
八、Generator ⽣成器
在RAG中,⽣成器是另⼀个核⼼组件,负责将检索到的信息转换成⾃然流畅的⽂本。与传统的语⾔模型相⽐,RAG的⽣成器通过利⽤检索到的信息来提⾼准确性和相关性。在RAG中,⽣成器的输⼊不仅包括传统的上下⽂信息,还包括通过检索器获得的相关⽂本段落。这使得⽣成器能够更好地理解问题背后的上下⽂,并产⽣更丰富信息的回应。
8.1 后检索处理增强
后检索处理增强涉及到在检索阶段之后,对检索到的信息进⾏进⼀步处理和优化,以提升最终结果的质量和相关性。这个过程不仅提⾼了信息的利⽤效率,还确保了⽣成的内容更加符合⽤户需求。
8.1.1 信息压缩
在⼤规模信息处理中,即使检索器能够从庞⼤的数据库中提取相关信息,也存在处理和利⽤这些信息的挑战。当前
的技术发展尽管已经允许了⼤型语⾔模型处理更⻓的上下⽂,但这些模型的性能仍受到其上下⽂⻓度限制的约束。 因此,信息压缩成为了⼀种必要的⼿段,其⽬的在于:
减少噪声:通过筛选和压缩信息,去除那些对于回答⽤户查询不必要的细节,减少⼲扰信息的影响。
应对上下⽂⻓度限制:通过精炼⽂本,使其精简⽽不失核⼼信息,以适应模型的上下⽂⻓度限制。
增强⽣成效果:通过提供更加凝练和⾼质量的输⼊信息,帮助⽣成器产出更加准确和⾃然的⽂本。
信息压缩不仅提⾼了数据处理的效率,还确保了⽣成内容的质量和相关性。
8.1.2 重排
⽂档重排的作⽤是对检索到的⽂档集进⾏重新排序和优化,确保最相关的内容能够被优先处理。这⼀步骤对于提升检索效率和⽣成内容的相关性⾄关重要。具体⽽⾔,重排过程包括:
优化⽂档顺序:通过评估⽂档的相关性,将最相关的⽂档放在处理队列的前端,确保它们被优先考虑。
减少处理量:通过限制处理的⽂档数量,减轻了模型的负担,同时避免了因处理⼤量低相关性⽂档⽽导致的效率下降。
提升响应速度:通过快速识别和处理最关键的信息,提⾼了整个系统的响应速度和⽤户满意度。
重排策略不仅解决了由于检索结果过多导致的信息过载问题,还通过优化信息的质量和相关性,显著提升了后续⽣成任务的效果。
8.2 ⽣成器优化
在RAG模型中,⽣成器优化对于提⾼模型整体性能⾄关重要。⽣成器负责利⽤检索到的信息⽣成流畅且相关的⽂本回答。优化的⽬标是确保⽣成的⽂本不仅⾃然流畅,还能有效地结合检索到的内容,以更准确地满⾜⽤户的查询意图。
8.2.1 模型微调
模型微调是提升⽣成器性能的⼀种关键技术。通过在特定领域的数据集上微调⽣成器,可以显著提⾼其在该领域内的⽂本⽣成质量和相关性。微调过程涉及调整⽣成器模型的权重,使其更好地适应与查询相关的上下⽂信息。这种
⽅法可以通过以下步骤实现:
1. 数据选择:挑选与⽬标任务紧密相关的⾼质量⽂本数据集进⾏训练。
2. 微调策略:根据任务需求定制微调的参数,如学习率、批次⼤⼩和迭代次数。
3. 评估与迭代:通过与基线模型的性能⽐较,评估微调的效果,并根据需要进⾏迭代优化。
8.2.2 ⽣成控制
⽣成控制是调节⽣成器输出的另⼀种⽅法,旨在提⾼⽣成⽂本的多样性和相关性。通过引⼊特定的控制机制,可以引导⽣成器产⽣满⾜特定条件的⽂本,如⻛格、⻓度或者包含特定信息。⽣成控制的技术包括:
1. 温度调节:调整⽣成过程中的温度参数,以控制⽂本的创新性和多样性。
2. 最⼤⻓度和提前终⽌:设定⽣成⽂本的最⼤⻓度,以及在满⾜特定条件时提前终⽌⽣成,确保输出的紧凑性和相关性。
3. 控制词汇:通过强制包含或排除特定词汇,引导⽂本⽣成满⾜特定要求。
4. 条件⽣成:利⽤额外的输⼊信息(如问题类型或领域标签)来引导⽣成过程,以产⽣更加相关的回答。
小结
如果你觉得文章还不错,麻烦点赞、收藏+关注,支持一下子,后续还会持续分享更多关于Java、人工智能相关的知识。
关于我:
资深程序员,曾在北京某AI公司从事智能对话问答平台研发,也曾在大厂历练过,对AI场景应用充满热情。