前言
ChatGPT是一个强大的语言模型,利用大规模的自然语言处理和机器学习算法,可以进行自然而流畅的对话,理解自然语言问题和回答,相信在座各位,尤其是程序员的你,肯定不可能还没使用过ChatGPT。
ChatGPT能做的事包括但不限于:
- 学术论文
- 生成代码
- 创意写作
- 翻译
- 简历和求职信
它能够生成类似于人类写作的文本。您只需要给出提示或提出问题,它就可以生成你想要的东西。但其实你用过ChatGPT就会知道,在我们想要得到准确、具体的回答时,我们的prompt是十分重要的。
什么是 Prompt(提示)?
简单的理解它是给 AI 模型的指令。
它可以是一个问题、一段文字描述,甚至可以是带有一堆参数的文字描述。AI 模型会基于 prompt 所提供的信息,生成对应的文本,亦或者图片。
例如这里prompt就是指我的问题“什么是csv文件”
好的prompt能够更好地发挥 AI 的能力。例如如果你想要AI帮你生成一篇文章,那你不如试试这么跟他说:
我想让你做一个AI写作导师。我将为您提供一名需要帮助改进其写作的学生,您的任务是使用人工智能工具(例如自然语言处理)向学生提供有关如何改进其作文的反馈。您还应该利用您在有效写作技巧方面的修辞知识和经验来建议学生可以更好地以书面形式表达他们的想法和想法的方法。我的第一个请求是“我需要有人帮我修改我的硕士论文”。
当然在这里我不是来介绍prompt的,如果你对这个感兴趣可以参考github的一个高星项目。
在该项目上提供了很多的有用的Prompts
https://github.com/f/awesome-chatgpt-prompts
至于为什么要了解prompt,待会你们就知道了。
Context(上下文)
ChatGPT最核心的功能之一,就是可以结合你之前的内容来回答你的问题,也就是具有上下文关联的能力。这也是ChatGPT拥有和用户多轮对话能力的基础。
chatgpt是不联网的,也就是他的数据是一直持续在一段时间之前的。如果你问到了ChatGPT的知识盲区,它大多时候并不会坦率的跟你说它不知道,而是开始自己胡编乱造,导致了你不知道这个ChatGPT什么时候会开始胡说。
当然我接下来并不是要介绍怎么让ChatGPT去联网接入网络获取信息,而是如果我有一个这样的需求,需要ChatGPT回答他的数据库里面没有的内容,该怎么做?
很多人会第一时间想到,在问问题之前通过上下文告诉他,让chatGPT可以结合上下文来回答我们的问题。
例如:我问蔡徐坤是谁?
这是ChatGPT的回答,其他的内容我不清楚,但是我家哥哥的真正的出生地是 浙江省温州市,户籍湖南吉首。很明显GPT的回答是错误的。
但是如果在问蔡徐坤是谁之前,先提供给他蔡徐坤的百度百科资料,像这样:
可以看见有了上下文的支持,chatGPT可以从上文得知我家咯咯的具体信息,但是这个方法有一个很大的局限性。目前 ChatGPT 有个非常大的限制,它限制了最大的 token 数是 4096,注意这个是(请求+响应)<4096,就是你的问题加上ChatGPT的回答不能超过一定的字符。
具体的token计算比较复杂,这里可以简单的认为2 token约等于1个中文字符。
可想而知,随便一个长点的前置内容都会让tokens超过限制。
于是官网给出了2个相对的解决方案。
- 词嵌入(embedding)
- 微调模型(Fine-tuning)
1.微调模型(Fine-tuning)
官网的描述是这样的:
简单来说,微调模型更适合去处理一些分类相关的工作,根据你提供的大量的数据集,来对prompt进行一个分类。并不是能很好的满足我们的需求,并且微调模型需要提供大量数据集。
2.词嵌入(Embedding)
什么是词嵌入?其实我也不是很懂,简单来说就是可以把一段话抽象成为矢量数据。
那我们要做基于自定义知识库回答问题的ChatGPT应该要怎么做呢?
首先我们将我们要构建成自定义知识库的文本,先通过词嵌入转化为一大堆的矢量数据,然后同时再将我们问题通过一样的方法转化为矢量,通过计算每个文章的词向量与问题词向量之间的相关性,我们将相关性最高的 一部分自定义知识库的文本加上你的问题,构成的prompt来去提问ChatGPT获得回答。
这里是官网的一个demo
https://platform.openai.com/docs/tutorials/web-qa-embeddings
我们根据官网给出的代码来讲解。