目标
在上一篇文章中,我们已经尝试在本地部署了大模型以及利用langchain框架来构建起基于大模型的应用程序。在本章中,我们将更近一步,在现有的应用程序上尝试利用RAG来继续强化应用。
本章目标:利用langchain框架使用RAG构建对话应用。
RAG回顾
RAG全名检索增强生成,是一种利用外部知识库扩展模型知识的技术。基本的RAG由三部分构成:索引、检索和生成。他们的流程如下:
索引
构建索引的过程需要将外部的非结构化数据转换成向量表示并存储到向量数据库中。对于比较大的文件内容,我们首先还要对其进行分块,以适应LLM上下文的大小。转换之后的文本内容是一个高维的向量,具有相同语义的文本在高维空间中具有更高的相似度,通过这种方式来实现语义检索。
可以看出,在这个过程中,我们需要准备好以下几个组件:
-
加载器:负责结构化/非结构化数据的加载。
-
分割器:负责将数据分割成便于处理的块。
-
Embeding模型:负责将数据内容嵌入成高维向量
-
向量数据库:负责将高维向量进行存储,供后续使用。
检索和生成
检索过程中,需要根据用户的问题进行检索。在这个过程中,检索器会根据用户的输入找出符合用户意图(简单实现即语义相似)的内容,将这部分内容作为上下文和用户问题一起组成prompt,并输入LLM, 由LLM处理并给出最终回复。
在这个过程中,需要准备的组件:
-
embeding模型:用于将用户问题向量化,可以使用和索引部分相同的embeding模型。
-
检索器:用于根据用户问题召回最相关的内容。
-
LLM:用于生成回复
基于langchain搭建RAG
经过以上分析,我们得知利用RAG技术来实现一个基于大模型的应用需要以下几个部分:加载器、分割器、Embeding模型、向量数据库、检索器和LLM。接下来我们看在langchain中如何实现。
加载器
加载器的实现方式有很多。在这里为了方便