用自己的数据打造个性化的chatgpt

869 阅读4分钟

随着像ChatGPT和GPT-4这样的大型语言模型(LLM)的兴起,许多人都在问是否有可能用他们的公司数据训练一个私有的ChatGPT。但这可行吗?这样的语言模型能提供这些功能吗?

接下来我将会教你怎么用自己的数据打造属于自己的chatgpt。

用自己的数据微调LLM模型

如下图,左边大脑代表着知识,我们自己的数据,右边代表着gpt,把模型和数据分开,通过数据让模型“学会”一些东西,而不是改造模型。举个例子:把gpt比喻成一个智商超高的人,到了大学期末考试,不是改造他逻辑能力,写作能力,数学能力,而且给他喂足够多的数据,给他大量的辅导材料,喂给他跟考试相关的材料,让他去学习。

大脑(代表知识)和人工智能(计算机)彼此分离——(图片来源:DALL·E 2)

主要方法

第一个方法是prompt提示语

例如让chatgpt充当Linux终端

我:

我希望你充当Linux终端。我将键入命令,您将回复终端应显示的内容。我希望你只回复一个唯一代码块中的终端输出,没有别的。不要写解释。除非我指示你这样做,否则不要键入命令。当我需要用英语告诉你一些事情时,我会通过将文本放在大括号内{像这样}来做到这一点。我的第一个命令是 PWD

chatgpt:

命令:pwd

输出:

/home/user

我相信大家都很熟悉prompt,各种各种的prompt花样都上天了,prompt确实很强大,甚至出现了大量的prompt工程师,月入几万,非常离谱,但是确实也是非常强大。但是gpt支持的上下文非常有限。例如:GPT-3 最多支持 4K 个token,GPT-4 最多支持 8K 或 32K 个token。

如果我们要把私有的数据都扔给chatgpt作为上下文,很明显不可行,因为有字数的限制。例如我们要训练一个公司内部知识的问答系统,内部的知识可能几百万字,很明显不能每次都作为上下文。

prompt原理

prompt的缺点在:

  1. 是chatgpt数据在2019年之前
  2. 上下文数量有限,prompt不可能太长,这样会导致chatgpt学习不了太多知识

第二种方法

在官方那里有介绍过一种方法,就是让chatgpt分段,不停的总结。例如让chatgpt对红楼梦做总结,那应该怎么做?直接灌输进去肯定不行,有token限制,会超出限制。正确的做法是:

  1. 先给它一段文章,先让它做个总结,得到总结A
  2. 再输入下一段红楼梦文章,基于总结A,一起做一个总结,得到B
  3. 再输入下一段红楼梦文章,基于总结A,一起做一个总结,得到C

就是这样不停的总结,不停的分段输入,最后读完了整个红楼梦!

第三个方法embedding使用嵌入构建自己的语义搜索(强推)

我们可以把自己的知识库,例如把2022年冬季奥林匹克运动会的相关内容,存到向量数据库,可以根据关键字搜索,以及向量搜索,例如搜索乒乓球,那么就会查到跟乒乓球相关性最高的top n 文档。

那么整个过程就是这样的:

  1. 首先用户发出一个问题,例如是“乒乓球冠军”
  2. 第二步,从向量数据库查询跟“乒乓球冠军”相关性最高的top n document文档,例如:1.xxx获得单打冠军 2.xxx获得双打冠军
  3. 然后就会把查出来的文档和问题一并发给chatgpt,文档作为了上下文
  4. 此时chatgpt就可以突破了2019年知识的限制,可以知道谁是冠军了,并且是针对2022年奥运会的chatgpt

此时chatgpt接收到的prompt是这样的

系统消息(prompt):请你根据以下知识进行回答:

  1. xxx获得单打冠军
  2. xxx获得了双打冠军
  3. xxx跟冠军错失
  4. 。。。

用户消息:乒乓球冠军

总结

关于如何打造属于自己的chatgpt有三种方式:

  1. 直接使用prompt,开头给它一个提示,但是缺点是数据停留在2019年之前,并且有token数量限制
  2. 分段输入,让chatgpt总结再总结,这样也有明显的缺点,作用比较有限,没办法做关联,相关性比较差。但是可以突破token的限制
  3. 第三种是embedding嵌入数据库,把数据存入向量数据库,得到数据之间的相关性,在执行时候,从数据库查询相关性,并且一起发给chatgpt,这种方法可以突破token限制,而且可以得到相关性。比较推荐这种方式

关于最佳实践:应该是使用嵌入embedding,并且结合第一和第二种方法。