概念
从数据源中检索信息来辅助大语言模型(Large Language Model, LLM)生成答案。简而言之,RAG 结合了搜索技术和大语言模型的提示词功能,即向模型提出问题,并以搜索算法找到的信息作为背景上下文,这些查询和检索到的上下文信息都会被整合进发送给大语言模型的提示中。在大模型的提升方面主要有:(1)有效避免幻觉问题,知识库中的内容可控具有生成的权威性;(2)经济高效的处理知识&开箱即用,用户的问题和知识库进行相关性搜索结合,就能高效的提供大模型不知道的知识;(3)数据安全:企业的数据可以得到有效的保护,通过私有化部署基于 RAG 系统开发的AI产品,可以有效避免企业数据的泄露。
技术逻辑
完整的 RAG 应用流程主要包含两个阶段:
-
数据准备阶段:(1)数据提取–> (2)分块(Chunking)–> (3)向量化(embedding)–> (4)数据入库
-
检索生成阶段:(1)问题向量化–> (2)根据问题查询匹配数据–> (3)获取索引数据 --> (4)将数据注入Prompt–> (5)LLM生成答案
数据提取
将不同格式的多种数据过滤,整理成同一个格式的数据
分块(Chunking)
通常大型文档或数据集可能包含大量的数据信息,直接处理这样的数据在技术和管理上都极具挑战,可以通过分块的方式将数据集分解成更小的部分,有如下的优势:
- 提高检索效率:
- 优化内存使用:通过分块技术,系统可以每次只加载和处理一个块,从而减少内存使用
- 增强可扩展性:提高实时或频繁的更新的能力
根据场景和应用需求具体实现分块的策略有很多种,这包括确定块的大小、形状、边界以及是否保留特定的上下文信息。包括
- 基于规则的切分:文本按照固定长度(字符数,或句子单词数)进行切分,简单但可能会破坏文本的连贯性;基于特定符号的切分 (段落分隔符,换行符等),能保证更好的文本连贯性但依赖文本中是否有这些符号。
- 基于语义的切分:
- 基于机器学习的切分:
向量化(embedding)
神经网络等算法没有办法直接处理文本,需要将文本转化成数学表达,这个数学表达的方式就是嵌入向量,这个转换的过程就是embedding的过程,embedding包括两个步骤:
- 首先将文本根据词表(vocab)转化成整数序列索引或者one-hot矩阵
- 使用embedding层将高维稀疏的one-hot整数序列或索引通过嵌入矩阵转化成低维的嵌入向量
常见的词嵌入算法,例如word2vec、fasttext、Glove来构建嵌入矩阵
使用嵌入矩阵来获取嵌入向量的方法有两种:
- 一种是使用one-hot矩阵与嵌入矩阵相乘,所得到的矩阵就是所求的嵌入向量;
- 另一种是使用token在词表中的索引(即one-hot中不为零的元素所在的列数)直接查找对应嵌入向量的对应行,所得到的矩阵就是所求的嵌入向量。
参考视频:学习Transformer,应该从词嵌入WordEmbedding开始_哔哩哔哩_bilibili
数据入库
将处理好的向量数据以及原始文本数据一起存储到数据库或搜索引擎中,以便后续快速检索。数据库或搜索引擎需要支持高效的向量搜索功能,以便能够快速地找到与给定查询最相似的文本。
向量数据库
问题向量化
当用户提出一个问题时,首先使用相同的向量化技术将这个问题转换为向量形式。这个向量将用于在数据库中搜索最相关的文本。
基于英文的实现中可以使用正则表达式将非字母字符删除,然后拆分成关键词
根据问题查询匹配数据
使用问题向量在数据库中执行向量搜索,找到与问题最相似的文本片段。这些文本片段将作为候选答案集
检索方式有很多种,基于关键词的检索、基于知识向量的检索、基于图的检索
获取索引数据
从数据库中检索出与问题最相关的文本片段及其相关信息(如来源、上下文等)
将数据注入prompt
将检索到的文本片段作为“提示”(Prompt)注入到大型语言模型中。这个提示可以包含问题、检索到的文本片段以及任何其他有用的上下文信息。
LLM生成答案
基于提供的 Prompt,大型语言模型(LLM)将生成一个回答。这个回答不仅考虑了问题的直接内容,还融合了检索到的外部知识,从而提高了回答的质量和相关性。
标签:检索,RAG,嵌入,综述,矩阵,文本,数据,向量 From: https://blog.csdn.net/weixin_67031452/article/details/141673607