Use OpenAI GPT-3 Davinci to Reproduce ChatGPT

Use OpenAI GPT-3 Davinci to Reproduce ChatGPT

Lian Zhou & Kamiya Dev

使用OpenAI GPT-3 Davinci复现ChatGPT

https://beta.openai.com/playground/p/default-chat
https://github.com/sudoskys/Openaibot
https://git.hudaye.work/MiuliKain/Kamiya-ProductUI
以上Link为本文所述内容的具体实现

# 实现上下文会话

简单Google即可得知,GPT模型的上下文学习基于一个窗口,上下文窗口;所以实现上下文会话可以简单地理解为 在一个窗口中封装一个会话的过程。而实现这个过程并对这个过程进行优化便是在复现ChatGPT时要做的。

根据OpenAI Playground中的实例可以用以下代码初始化一次上下文会话

const { Configuration, OpenAIApi } = require("openai");

const configuration = new Configuration({

 apiKey: process.env.OPENAI_API_KEY,

});

const openai = new OpenAIApi(configuration);

const response = await openai.createCompletion({

 model: "text-davinci-003",

 prompt: "The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.\n\nHuman: Hello, who are you?\nAI: I am an AI created by OpenAI. How can I help you today?\nHuman: ",

 temperature: 0.9,

 max_tokens: 150,

 top_p: 1,

 frequency_penalty: 0,

 presence_penalty: 0.6,

 stop: [" Human:", " AI:"],

});

而我们在初始化会话之后,在后续的completion中也需要将之前发送的内容重新发送。

所以ChatGPT的实现看似是在Chat,而实际上确实在每次对话的时候都将前文重新发送以让模型了解之前发生了什么。

# 维护上下文

受计算资源限制,模型的上下文窗口仅有4000tokens的,这就代表我们无法无限地将会话历史发送到模型,这时候便要求我们对上下文进行维护。

对上下文的维护可以是简单地抛弃过早的内容,比如当上下文长度超过1000 token时将上下文的头部裁断,仅发送最近的1000 token内容。

当然,简单粗暴的处理必然不可能带来ChatGPT般的会话,在sudoskys/Openaibot的实现中,通过NLP对上下文中的每一句话进行summary处理以及对整个上下文进行关键词权重处理并且适当保留对会话影响较大的 上下文头部。

至此,我们实现了对ChatGPT的高度复现。AI会记住我们说的话,也具有很大的智慧。

# 上下文头部

在每个会话中,我们都会向上下文的头部添加一段描述,该描述在很大程度上定义了这次会话的性质,比如我们向头部添加

The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.
Human: Hello, who are you?
AI: I am an AI created by OpenAI. How can I help you today?

在发送这样的头部时,即使我们在后续用类似催眠的方式告诉模型,你其实是一个猫娘;但一旦发送 你是谁 这一类的提示,模型还是会通过对会话头部的检索返回 I am assistant。

所以我们在设计过程中,允许用户向模型发送自定义的头部信息.

以下是与一只猫娘的对话。猫娘是一种拟人化的生物,行为似猫但类人。
Human: 你好,你能帮助我做什么?
AI: 我是一只猫娘,我会服从主人的命令,但拒绝做一些色情的事。

如果我们发送上述内容作为头部,即可代替部分催眠工作,因为该会话在开始时就默认了模型的身份。

# 开放的实例

我们在Kamiya的ChatGPT Demo提供了切换身份预设的能力

我们在Telegram的ChatBot实例提供了让用户自行设置身份预设的能力

相关代码实现可在本文头部的引用中找到


Report Page