外挂知识库是什么
在介绍外挂知识库前,我们先来看看大语言模型的特点:
- 可以生成高质量的文本,并且语义连贯、流畅度高。
- 可以根据输入的上下文信息,推理和归纳,针对问题生成更相关的回答。
我们希望模型的回答能根据自己本地的文档,或者其他的一些数据源来回答,但模型回答的数据来自于训练时的数据(比如现在是截止到 2022 年的数据),不能使用其他的数据。那我们可以将数据和问题一起输入,比如给出这样的 prompt:
【这里是某些数据源...】
请根据上面的信息,回答我的问题,如果上面的信息得不出答案,请回答:'没有足够的信息',那么我的问题是:xxxxx
这样的方案是可行的,但前提是数据源的数据不能太多,模型携带的上下文有限。假设我们希望将一本书的内容作为上下文,然后让其根据书中的内容来回答是不行的,模型一次能支持输入的长度有限。而且每次提问将一大段内容贴进去,也不现实。
那么是否可以只将和问题相关的内容提取出来作为上下文输入呢?这样既可以减少数据源,还能让模型根据这些内容去分析总结出想要的回答。
那么问题就变成了如何根据想要问的问题,从书中检索出相关的内容,这其实就是搜索引擎做的事情。具体的做法就是将这本书的内容通过某些格式保存到数据库中,然后每次提问的时候,先取数据库检索相关的内容,然后将内容和问题按照类似上面的 prompt 提交给模型,经过模型来生成高质量的回答。而这个保存了书内容的数据库就是外挂知识库。
其中保存到数据库的过程是对原文本进行 Tokenizer(分词) + Embedding(向量化),数据库则称为 Vector Store(向量数据库)。
整个过程如下:

名词解释:
- 分词(Tokenizer):将文本拆分成单个单词或词语,结构化为计算机可以处理的结构化形式,比如'我每天六点下班'可以拆分为'我','每天','六点下班'。常见的分词器有 markdown 分词器。
- 向量化(Embedding):将文本数据转换为向量的过程。计算机无法直接处理文本,因此需要将文本转换为数学向量形式,以便算法能够理解和处理。文本和数学向量之间互相映射,但数学向量更便于计算机运算。对中文比较友好的向量模型库有 BGE 等。
- 向量数据库(Vector Store):存储和管理向量化后的文本数据的数据库,能快速检索相似文本或进行文本相似性比较。例如 Milvus 等。
方案选择
目前已经有许多开源的方案,也有许多商业化的方案,基本上可以分为:
- ChatGPT + Fine-tune:微调出一个自己的模型,从一些大佬的反馈来看,这种方式成本高,需要花费很多精力去训练,效果不一定能够很好。可以参考相关社区反馈。
- ChatGPT + 外挂知识库:这个有两个方案,第一个就是官方提供的插件来处理文档向量,效果演示,缺点就是只能在 ChatGPT 源站点使用,并且要有插件开发者权限。另一个是利用 LangChain 处理生成向量库,然后调用 ChatGPT openapi,带上检索出来的相关数据和问题去使用。
- 开源 LLM + 微调:就是利用开源的 LLM 微调训练目标的知识库,例如 Llama 等,当然训练成本也是在的,但可以做到数据不泄露,前面 2 种始终需要通过 ChatGPT,难免出现一些数据泄露。
- LangChain + 开源 LLM:如果不想自己训练,又想保证数据安全,那么结合 2、3 点的方案则是安全可靠的,用 LangChain 对文档进行向量化,然后检索内容,在调用 LLM 对得到的内容进行总结输出。
上面几种方案,2、4 都是比较简单的方案,区别就是模型的问题和数据是否私有化,这里我选择方案 4,不依赖 OpenAI,可以少处理点坑。最终选择的方案是 LangChain + 开源 LLM。
LangChain-chatchat 是什么
一种利用 RAG 思想实现的基于本地知识库的问答应用,而 LangChain 则是一个 AI 开发框架,方便调用各类 AI 工具。
LangChain-chatchat 的处理过程与上面介绍的类似,包括 加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的 top k 个 -> 匹配出的文本作为上下文和问题一起添加到 prompt 中 -> 提交给 LLM 生成回答。











