一、择要
本文的讨论内容:
- 本文综述了各种紧张的检索技术,特别是检索器和检索融合技术。
- 本文进一步讨论了RAG的训练,包括有/没有数据存储更新的RAG。
- 然后先容了RAG在具有代表性的自然语言处理任务和工业场景中的应用。
- 末了,探讨了RAG未来的发展方向和面对的挑战,以促进RAG的发展。
二、RAG概述
1.检索加强天生(RAG)的三个模块:
1.检索器(retriever)
检索器(Retriever)模块通常包含三个构成部分:
- 用于将输入编码为嵌入(embeddings)的编码器(encoder)
- 支持近似最近邻搜刮的高效索引(efficient indexing)
- 以及以键值对(key-value pairs)情势存储外部知识的数据存储(datastore)
检索器模块的主要挑战:
如何在检索服从和检索质量之间找到最佳均衡
检索服从 指的是获取相关信息的速度,这涉及编码加快、高效索引、数据存储中的批量查询等。
检索质量 指的是检索到的信息与查询的相关性,这涉及块表示学习(chunk representation learning)、先辈的近似最近邻搜刮算法等。
2.天生器(generator)
天生器(Generator)模块可以分为两类天生器:
- 默认天生器(default generators) 包括大多数预训练/微调的大型语言模子,如 GPT 系列模子 、Mistral 模子 [71] 和 Gemini 系列模子。
- 检索加强天生器(RA generators) 指的是由融合检索模块构成的预训练/微调天生器,如 RETRO和 Enc-Dec。这些天生器用于天生相应或举行预测。
3.检索融合(retrieval fusions)
检索融合(Retrieval Fusions)旨在利用检索到的信息来加强天生过程。这些融合技术可分为三大类:
- 基于查询的融合(query-based fusion) 在将输入通报给天生器之前,通过检索结果对输入举行加强。
- 基于 logits 的融合(logits-based fusion) 关注天生器的输出 logits,并融合检索得到的 logits,以提高 logits 的妥当性。
- 潜伏融合(latent fusion) 通过将检索表示(retrieval representations)引入天生器的潜伏表示(latent representations),从而在隐式层面上提升模子性能。
三、检索器(Retriever)
使用检索器的两个阶段:起首构造检索器,然后是查询检索器
1.构造检索器
如何使用大型自然语言语料库构建检索器,该过程包括三个步调:
- 分块语料库(chunking corpus)
- 编码块(encoding chunks)
- 构建向量数据库(building the vector database):构建向量数据库包括构建近似最近邻(ANN)索引,并以键值对(key-value pairs)的情势存储数据。
如图:
1. 语料块划分(Chunking Corpus)
语料块划分技术通常指将大型文档划分为较小的文本块 。相关文档:[10, 13, 43, 65, 111]
其核心头脑:是为了提高检索服从和质量,确保每个文本块都能转达明白的、独立的核心头脑,便于后续模子的处理
语料块划分的目的:
- 文本块被划分为较小的片段,每个片段都包含一个明白的核心头脑或主题。这使得检索系统可以或许更加准确地理解和检索相关信息。
- 划分成较短的文本块后,每个块的长度较短,因此可以或许显著降低编码过程中的盘算和内存开销。
语料块划分技术的主要挑战:是找到最佳的划分巨细,以在文本语义和编码服从之间取得最佳均衡
解决上述挑战,在确定语料块划分巨细时需要思量三个关键点:
- 根据你的任务场景的需要:差别的任务场景,要求的划分巨细差别
- 根据你使用的编码器的属性:差别编码器对差别长度文本的编码本领差别。sentence-transformer [125] 模子在处理单句时表现更好,而 text-embedding-ada-002 [113] 在处理较长文本时效果更佳。
- 根据你查询的文本长度和切分的块也要匹配
语料块划分技术有三种范例:
- 固定长度划分(Chunking with fixed length) 是最简朴的方式,按顺序使用长度超参数将文档划分为块。
- 语义划分(Semantic chunking) 根据语义划分文档,比方使用句点字符或换行符来表示句子的竣事。现有的最先辈自然语言处理工具包,如 NLTK [112] 和 spaCy [33],提供了方便的句子切割方法。
- 基于内容的划分(Content-based chunking) 根据文档的独特结构特性对其举行分段。比方,电子病历可以根据章节轻松划分,大概编程代码可以根据函数块举行划分。
2. 编码块(encoding chunks)
编码:是指将文本块转化为向量表示(嵌入)。这些嵌入通常捕捉了语料块的语义,使得检索器可以或许基于内容相关性举行相似度搜刮,而不仅仅是举行关键词匹配。
根据嵌入的希罕性,编码方法可以分为两种:
希罕编码:希罕编码通过创建高维向量来表示文本,此中大多数元素为零。基本的希罕编码是独热编码(one-hot encoding)[50],它用与词汇表巨细相等的高维向量表示一个词,但只将表示该词存在的元素标志为 1,别的元素为零。由这种编码天生的嵌入称为独热向量。
其他常见希罕编码:
(1) 词袋模子(BoW)[51]。这种编码通过用词频替代零一计数来改进独热编码。然而,BoW 忽略了文档中的语法和词序,专注于统计信息,因此只能表达有限的语义。
(2) 词频-逆文档频率(TF-IDF)[120]。这种编码不仅统计每个词的出现频率,还根据词在全部文档中的普遍性来调解这些计数。
希罕编码是一种高效的文本块编码方式。然而,这种编码可能无法捕捉更深条理的语义含义。
密集编码:天生的向量每个维度可以捕捉一系列语义特性,且大多数元素为非零浮点值。密集嵌入通常由(深度)神经网络模子天生。如下一些编码器:
BERT及其变体 [29]:天生密集的语义嵌入,捕捉上下文信息。其他BERT变体,如RoBERTa [99]、DistilBERT [128] 和 ELECTRA [19],通过先辈的学习技术进一步提高语义表示本领。
Siamese编码器:这是一种旨在学习输入之间相似性的神经网络,通常通过对比学习举行训练。现有的最先辈的Siamese编码器包括DPR [79]、SimCSE [40]。
基于LLM的编码器:这种编码器得益于大模子(LLMs)的强大表示本领。典范的基于LLM的编码器有text-embedding-ada-002 [113]、bge-embedding [156]、mxbai-embedding [130]。
目前,这种编码广泛应用于大多数语义表示场景。
3.构建向量数据库(building the vector database)
(1)构建索引:索引是一个数据结构。向量数据库中的索引旨在加快与高维查询嵌入相似的数据的搜刮过程。向量数据库中的索引主要集中在支持高效的近似最近邻(ANN)搜刮[32, 47, 77],而不是像插入、删除和更新这样的事件操作。
索引的关键挑战:是如何在搜刮质量和搜刮服从之间找到一个良好的均衡。
解决这个挑战:有多种具体的优化可以探索:
相似性度量的选择:相似性度量是检索器中的基本组件,用于权衡查询嵌入与文本块嵌入之间的相关性。相似性度量会影响搜刮质量。典范的相似性度量包括余弦相似度、欧氏相似度、曼哈顿距离和杰卡德相似度。
嵌入的降维(DR):降低嵌入维度以提高搜刮服从的差别方法,但可能会损害语义表示。
主要的降维方法包括:
- 主身分分析(PCA):通过转换原始数据到新的坐标系,保留最紧张的特性,到达降维目的,是一种简朴有效的统计方法。
- 局部敏感哈希(LSH):通过将数据映射到桶中,淘汰维度,同时保留原始数据的相似性。LSH的直觉是将相似的数据点映射到相同的桶中。
- 乘积量化(PQ):将高维空间划分为独立的子空间,每个子空间有一个代码簿,天生紧凑的向量,用于高效的近似搜刮。
- AutoCompressor: 是一种新的技术,通过压缩原始上下文天生更短的语义嵌入,进一步淘汰维度。
先辈的ANN索引:ANN索引通常指用于组织和管理数据的方法或结构,以优化近似最近邻搜刮过程中的检索质量和检索服从。几种先辈的ANN索引技术:
- 带乘积量化的倒排文件系统(IVFPQ):通过先对数据举行粗粒度聚类(IVF)来淘汰搜刮空间,再通过细粒度量化(PQ)对每个聚类的数据举行压缩,确保高效且高性能的ANN搜刮。
- 分层可导航小天下(HNSW):使用分层图结构,将高维向量作为节点并毗连最近邻。通过概率性地确定图的条理结构,淘汰高条理节点,提高搜刮服从。
- 基于树的索引:将高维向量组织为树状结构(如KD树、Ball树、VP树等),通过树的结构举行高效搜刮。典范的基于树的索引如Annoy,它使用基于随机投影的树的森林来划分向量空间,从而加快ANN搜刮。
系统级优化
硬件感知优化
(2) 使用键值对构建数据存储库:在向量数据库中使用的数据存储库是一种专门的数据库,它以键值对的情势存储和管理数据,此中键是高维嵌入的唯一标识符,值是范畴特定的知识。(键是高维嵌入(编码),值是与嵌入对应的原文档或范畴知识)
- 数据存储库:向量数据库以键值对的情势存储数据,此中 键 是高维嵌入的唯一标识符,值 是与嵌入对应的范畴特定知识。由于存储的数据量可能非常大,数据存储引擎(如LMDB、RocksDB)需要高效地举行检索和数据持久化。
- 存储值的问题:在ANN搜刮中,存储值的选择是一个关键问题。比方,对于问答任务,常见的做法是将 问题嵌入 作为键,将 问题-答案对 作为值。这种方式有助于天生过程,因为检索到的结果可以作为模子的树模,指导天生更相关的答案。
- 先辈的向量数据库:近年来,提出了多种先辈的向量数据库,包括 Milvus、FAISS 和 LlamaIndex,这些数据库联合了高效的索引和数据存储机制,支持大规模数据存储和快速检索。
构造检索器的详细步调(代码):
[code]输入:一个自然语言语料库 |