大模型搭建知识库的逻辑主要包括以下几个方面:
因为利用大模型的能力搭建知识库本身就是一个RAG技术的应用。所以在进行本地知识库的搭建实操之前,我们需要先对RAG有一个大概的了解。以下内容会有些干,我会尽量用通俗易懂的描述进行讲解。我们都知道大模型的训练数据是有截止日期的,那当我们需要依靠不包含在大模型训练集中的数据时,我们该怎么做呢?实现这一点的主要方法就是通过检索增强生成RAG(Retrieval Augmented Generation)。在这个过程中,首先检索外部数据,然后在生成步骤中将这些数据传递给LLM。我们可以将一个RAG的应用抽象为下图的5个过程:文档加载(Document Loading):从多种不同来源加载文档。LangChain提供了100多种不同的文档加载器,包括PDF在内的非结构化的数据、SQL在内的结构化的数据,以及Python、Java之类的代码等文本分割(Splitting):文本分割器把Documents切分为指定大小的块,我把它们称为“文档块”或者“文档片”存储(Storage):存储涉及到两个环节,分别是:将切分好的文档块进行嵌入(Embedding)转换成向量的形式将Embedding后的向量数据存储到向量数据库检索(Retrieval):一旦数据进入向量数据库,我们仍然需要将数据检索出来,我们会通过某种检索算法找到与输入问题相似的嵌入片Output(输出):把问题以及检索出来的嵌入片一起提交给LLM,LLM会通过问题和检索出来的提示一起来生成更加合理的答案[heading2]文本加载器(Document Loaders)[content]文本加载器就是将用户提供的文本加载到内存中,便于进行后续的处理
从用户提出问题开始:我们经历了用户问题的理解根据用户问题进行路由进行初步的检索对初步检索的结果进行重排序现在终于要到了生成结果的时候了,这个环节的流程可以简化如下:将重排序后的结果和用户的查询意图组合成上下文输入给大模型大模型通过指定的提示词生成输出结果这个环节理解起来很简单,但是同样有几个需要注意的点重排序的结果通常不会都被用作大模型的上下文,因为大模型的上下文有限制可以设置一个阈值进行截断,比如只使用前3-5个文档可以设置一个相关性分数的阈值,只取相关性分数大于某个值的文档一些先进的RAG系统会对选中的文档进行摘要或压缩,以在有限的空间内包含更多相关信息。[heading3]后置处理[heading3][content]在大模型输出结果后就是一些后置的处理了,这可能包括敏感内容检测和移除格式化输出.....这些不是本文的重点,我们就不再这里展开了至此,关于普通的RAG的原理基本就全部讲完了,非常感谢你能耐心看到这里!这里我再引用智谱清言的一张图给大家复习,看完上述流程,我理解这张图理解起来更容易
大模型并不是100%准确的,它会产生幻觉,主要是因为以下两点训练大模型的数据是有日期限制的,如果你询问大模型超出日期限制的问题,则大模型无法准确回答大模型的数据来源于互联网,如果是公司内部的私有数据,则大模型无法感知因此知识库的出现就是为了解决大模型的数据准确性的问题。大模型可以额外学习外接知识库中的知识,从而来精准回复用户。知识库中最典型的一个应用就是客服系统:公司可以将用户所有问题以及答案记录在文档中,然后以知识库的形式投喂给大模型。这样当用户通过自然语言询问问题时,大模型就可以根据知识库中的内容给出更加准确的回答。