大模型外挂知识库

引言

我们知道,ChatGPT回答的数据来自于训练的数据(如现在是截止到2022年的数据),不能使用其他数据,但需要大模型根据特定的数据源来回答时问题时,该怎么办呢?

根据“大模型可以根据输入的上下文信息,针对问题生成相应的回答”,这个特性,可以将数据和问题一起输入,如下面形式:

image-20231130202018913

但存在问题:

  • 但数据量大时就不行了,因为大模型所支持的上下文长度有限,即所支持的token长度有限。

只将和问题相关的数据内容提取出来作为上下文输入,这样可以减少数据源,但有2个问题:

  • 需要提前将与问题相关的内容筛选出来
  • 这就变成了检索/搜索问题

针对第2个问题,就是给定一个数据源,在里面检索数据,这里就可以用到了外挂知识库

外挂知识库的核心思想是:

图片

  • 将数据源的内容通过某种格式保存在数据库中
  • 每次提问题时,先去数据库检索相关内容
  • 将内容和问题组成prompt提交给大模型
  • 大模型返回对应的问题答案

名次解释:

  • 分词(Tokenizer):将文本拆分成单个单词或词语,结构化为计算机可以处理的结构化形式,,比如 我每天六点下班 可以拆分为 “我”,“每天”,“六点下班”,常见的分词器有 markdown 分词MarkdownTextSplitter
  • 向量化(Embedding):将文本数据转换为向量的过程。计算机无法直接处理文本,因此需要将文本转换为数学向量形式,以便算法能够理解和处理。文本和数学向量之间互相映射,但数学向量更便于计算机运算。对中文比较友好的向量模型库有 shibing624/text2vec-base-chinese
  • 向量数据库(Vector Store): 存储和管理向量化后的文本数据的数据库,能快速检索相似文本或进行文本相似性比较。比如 FAISS 这个库

方案选择

目前已经有许多开源的方案,也有许多商业化的方案,基本上可以分为:

  1. ChatGPT + Fine-tune:微调出一个自己的模型,从一些大佬的反馈来看,这种方式成本高,需要花费很多精力去训练,效果不一定能够很好。可以看看 如何使用OpenAI fine-tuning(微调)训练属于自己的专有模型?- 知乎 和 大模型外挂(向量)知识库 - 知乎
  2. ChatGPT + 外挂知识库: 这个有两个方案,第一个就是官方提供的插件 chatgpt-retrieval-plugin 来处理文档向量,视频 效果演示,缺点就是只能在 ChatGPT 源站点使用,并且要有插件开发者权限。另一个是利用 LangChain 处理生成向量库,然后调用 ChatGPT openapi , 带上检索出来的相关数据和问题去使用。
  3. 开源 LLM + 微调: 就是利用开源的 LLM 微调训练目标的知识库,比如 ChatGLM3,当然训练成本也是在的,但可以做到数据不泄露,前面 2 种始终需要通过 ChatGPT,难免出现一些数据泄露。
  4. LangChain + 开源 LLM: 如果不想自己训练,又想保证数据安全,那么结合 2,3 点的方案则是安全可靠的,用 LangChain 对文档进行向量化,然后检索内容,在调用 LLM 对得到的内容进行总结输出。

上面几种方案,2,4 都是比较简单的方案,区别就是模型的问题和数据是否私有化。

LangChain + 开源 LLM

LangChain-chatchat

是一种利用LangChain思想实现基于本地知识库的问答应用,而 LangChain 则是一个 AI 开发框架,方便调用各类 AI 工具。

LangChain-chatchat 具体处理过程如下:

图片

加载数据源文件 -》读取文本 -》文本分割 -〉文本向量化 -》问题向量化 -〉 在向量库中匹配与出问题向量最相似的top k 个-》匹配出的数据内容和问题一起添加到prompt中 -〉 提交给大模型生成回答。

安装过程

参考:https://mp.weixin.qq.com/s/tXs0g3j6sEo3xO03l5LlkQ

  1. 安装模型
  2. 安装向量模型
  3. 安装Langchain-Chatchat
  4. 修改配置文件
  5. 运行测试
posted @ 2023-11-30 22:04  PamShao  阅读(2530)  评论(0编辑  收藏  举报