RAG From Scratch: Part 2 (Indexing) by LangChain
索引(Indexing)
一、 视频核心内容
本视频是“RAG From Scratch”系列的第二个,聚焦RAG(检索增强生成)系统中的索引环节。
二、索引概述
-
索引与检索器:RAG系统中,需加载外部文档至检索器。检索器依据输入问题,找出相关文档 。
-
数字表示优势:建立文档与问题相关性,常借助文档的数字表示。相较自由格式文本,比较向量更简便。多年来,发展出多种将文档压缩为数字表示以便搜索的方法。
-
统计方法与嵌入方法
- 统计方法:如Google等采用统计手段,依据单词频率构建稀疏向量。向量位置对应庞大词汇表,值为单词出现次数,虽向量大且含大量零,但有良好搜索方式 。
- 嵌入方法:机器学习的嵌入方法,将文档构建为压缩的固定长度表示,并开发出强大搜索方法 。因嵌入模型上下文窗口有限(512 - 8000个token或更多 ),文档需拆分。拆分后的文档被压缩成捕获语义的向量并索引,问题也以同样方式嵌入,通过数值比较找出相关文档。
三、代码演示要点
- 准备工作:在笔记本安装相关环境,设置LangSmith API密钥用于跟踪。
- 计算token数量:计算问题中的token数,因嵌入模型和大语言模型(LLMs)常基于token操作,了解输入文本规模有必要。
- 嵌入模型使用:指定嵌入模型(如OpenAI嵌入 ),将问题和文档映射为固定长度向量(如长度1536 ),该向量对文本语义编码。
- 向量存储操作:加载文档并拆分,对每个拆分进行嵌入,将向量表示与原文档链接存储于向量存储。后续将利用向量存储进行实际检索。
四、视频原文
第一页 这是我们系列视频rack from scratch中的第二个视频重点介绍了索引
第二页 在上一个视频中,您看到了 rag pipline索引检索和生成的主要组成部分,在这里我们将深入研究索引,并对其进行简要概述。
第三页 索引的第一个方面是我们有一些外部文档,我们实际上想要加载这些文档,并将其放入我们所谓的检索器中,检索器的目标只是给出一个输入问题,我想找出与我的问题相关的文档
第四页 现在建立这种关系、相关性或相似性的方法通常是使用文档的某种数字表示,原因是比较向量(例如数字)相对于自由格式,文本非常容易,因此多年来,已经开发出了很多方法来获取文档并将其压缩为数字表示,然后可以非常轻松地进行搜素,
第五页 现在有几种方法可以做到这一点,因此Google和其它公司想出了许多有趣的统计方法,您可以获取文档看看单词的频率,然后构建所谓的稀疏向量,这样向量的位置就是一个包含大量可能单词的词汇表,每个值代表该特定单词出现的次数,而且它非常大,因为其中当然有很多零,相对于文档中现有的词汇量,这是一个非常大的词汇表,并且有非常好的搜索方法可以搜索这种类型的数字表示,现在,最近,机器学习的嵌入方法,所以你获取一个文档,然后构建一个压缩的固定Slank表示,该表示已经开发出非常强大的搜索方法,而不是嵌入
第六页:所以这里的直觉是,我们获取文档,然后我们通常会拆分它们,因为嵌入模型实际上具有有限的上下文窗口,所以你知道大概是512个token到8000个token或更多,但它们不是无限大的,所以文档被拆分。每个文档被压缩成一个向量,这个向量捕获了文档本身的Mantic含义,这些向量被索引,问题可以以完全相同的方式嵌入,然后,可以使用完全不同的方法对这些向量进行某种形式的数值比较,以找出与我的问题相关的文档,
第七页 :结束
第八页 让我们对其中一些点进行快速代码遍历,所以,我在这里安装了笔记本,现在我为Lsmith设置了一些API密钥,这些密钥对于跟踪非常有用。我们很快就会看到,之前我介绍了这种快速入门,只是展示了如何总体布置这些RAG pipline,这里我要做的是深入研究一下索引,我将提出一个问题和一个文档,首先,我将计算出问题中的token数量,这很有趣,因为嵌入模型和LMS通常对token进行操作,因此,了解我尝试输入的文档有多大是很好的,在这种情况下他显然是一个非常小的问题,现在我要指定开放式嵌入,我在这里指定一个嵌入模型,我只需要说嵌入查询,我就可以传递我的问题和文档你在这里看到的是,它运行起来,现在被映射到一个长度为1536的向量,这个固定长度的向量表示将针对两个文档和任何文档进行计算,所以你总是在计算这个固定长度的向量,它对你传递的文本的语义进行编码,现在我可以做一些事情,比如余弦相似度来比较他们,正如我们在这里看到的,我可以加载一些文档,就像我们之前看到的一样,我们可以将他们拆分,我可以像以前一样在这里对他们进行索引,但我们可以看到,在幕后,我们实际上在做的是,我们对每个拆分进行嵌入,使用开放式嵌入将其嵌入到这种向量表示中,并将其与rod文档本身的链接在一起存储在我们的向量存储中,接下来我们将看到如何使用这个向量存储来进行实际检索