在进行本地知识库的搭建实操之前,我们需要先对 RAG 有一个大概的了解。实现这一点的主要方法就是通过检索增强生成 RAG。
我们都知道大模型的训练数据是有截止日期的,那当我们需要依靠不包含在大模型训练集中的数据时,我们该怎么做呢?在这个过程中,首先检索外部数据,然后在生成步骤中将这些数据传递给 LLM。我们可以将一个 RAG 的应用抽象为以下 5 个过程:
- 文档加载(Document Loading):从多种不同来源加载文档。LangChain 提供了 100 多种不同的文档加载器,包括 PDF 在内的非结构化的数据、SQL 在内的结构化的数据,以及 Python、Java 之类的代码等。
- 文本分割(Splitting):文本分割器把 Documents 切分为指定大小的块,我把它们称为“文档块”或者“文档片”。
- 存储(Storage):存储涉及到两个环节,分别是:
(1) 将切分好的文档块进行嵌入(Embedding)转换成向量的形式;
(2) 将 Embedding 后的向量数据存储到向量数据库。
- 检索(Retrieval):一旦数据进入向量数据库,我们仍然需要将数据检索出来,我们会通过某种检索算法找到与输入问题相似的嵌入片。
- 生成(Generation):在生成步骤中,LLM 会根据检索到的嵌入片生成回答。