OpenAI GPT-3模型详解
针对文本生成和代码生成这两大类场景,OpenAPI分别提供了GPT-3和Codex模型,
模型 | 描述 |
---|---|
GPT-3 | 一组能够理解和生成自然语言的模型 |
Codex | 一组可以理解和生成代码的模型,包括将自然语言转换为代码 |
本文将为大家详细介绍这两个模型。
模型概述
GPT-3
GPT-3模型可以理解并生成自然语言。OpenAI根据任务场景和功能强度提供了四种可选子模型。其中Davinci
g功能最强大,而Ada
响应速度最快。
模型名称 | 描述 | 最大tokens | 训练数据 |
---|---|---|---|
text-davinci-003 | 最强大的GPT-3模型。 具有更高的输出质量、 更长的输出内容 和更好的语言理解能力。 还支持文本插入功能。 |
4,000 tokens | 截至2021年6月 |
text-curie-001 | 功能强大, 但比 Davinci 速度更快,价格也更便宜。 |
2,048 tokens | 截至2019年10月 |
text-babbage-001 | 能够完成简单任务,速度快,成本低。 | 2,048 tokens | 截至2019年10月 |
text-ada-001 | 能够完成非常简单的任务, 通常是GPT-3系列中速度最快的,成本最低的。 |
2,048 tokens | 截至2019年10月 |
尽管通常来讲Davinci
最强大,但其他型号的模型在某些特定场景和任务下,具有明显的速度或成本优势。例如,Curie
可以执行许多与Davinci
相同的任务,但速度更快,成本仅为Davinci
的1/10。
建议在实验时使用Davinci
,因为它产生的结果最好。一旦实验完成,建议尝试一下其他模型的效果,看看是否能以更低的延迟或成本获得同样或近似的效果。同时还可以通过在特定任务上对其他模型进行微调来提高它们的性能。
Davinci
Davinci
是GPT-3系列中最强大的模型,可以在很少指引的情况下完成其他模型能完成的任何任务。对于需要大量理解内容的应用,如针对特定受众的摘要生成和创造性内容生成,Davinci
的产生效果最佳好。当然,这些优势需要更多的计算资源,因此Davinci
每次API调用的成本更高,而且速度也不如其他模型。
Davinci
的另一个亮点是理解文本的意图。Davinci
非常擅长解决各种逻辑问题,并解释其中角色的动机。Davinci
已经能够解决一些涉及因果关系的最具挑战性的人工智能问题。
擅长领域:复杂意图理解、因果关系发现及理解、针对性摘要总结
Curie
Curie
也非常强大,同时速度也非常快。虽然Davinci
在分析复杂文本时更具优势,但Curie
在情感分类和总结摘要等许多细致任务上表现出色。Curie
还非常擅长回答问题,因此非常适合作通用服务聊天机器人。
擅长领域:翻译、摘要、复杂分类、文本情感
Babbage
Babbage
可以执行分类等简单任务。当涉及到语义搜索时,它也可以很好地对文档与搜索查询的匹配程度进行排序。
擅长领域:文本分类、语义搜索分类
Ada
Ada
通常是速度最快的模型,可以执行解析文本、地址更正和粗放的分类任务。可以通过提供更多上下文来提升Ada
的表现。
擅长:文本解析、简单分类、地址更正、关键字提取
⚠注意:高级模型都能完成低级模型能完成的任务,例如Ada能完成的工作,Curie和Davinci都能完成。
OpenAI模型是非确定性的,这意味着相同的输入可以产生不同的输出。将
temperature
设置为0将使输出大部分具有确定性,但仍可能存在少量可变性。
Codex
Codex模型是GPT-3模型的派生模型,可以理解和生成代码。训练数据包含自然语言和来自GitHub的数十亿行公共代码。
Codex最擅长Python,并精通十几种语言,包括JavaScript、Go、Perl、PHP、Ruby、Swift、TypeScript、SQL,甚至Shell。
Open AI目前提供2种子模型:
模型名称 | 描述 | 最大请求 | 训练数据 |
---|---|---|---|
code-davinci-002 | 最强大的Codex模型。 特别擅长将自然语言转译成代码。 除了完成代码外,还支持在代码补全。 |
8,000 tokens | 截至2021年6月 |
code-cushman-001 | 几乎与Davinci Codex 一样强大,但速度稍快。这种速度优势可使其更适合于实时应用。 |
2,048 tokens |
Codex目前尚处在公测阶段。公测期间免费调用,但是速度会受限制。推荐直接用最强的code-davinci-002
。
API调用
OpenAI API调用非常简单,官方提供Python和Node.js库。
Python库
Python库可以通过下面命令安装:
$ pip install openai
安装后即可在代码中通过导入openai
库来调用各功能接口
import openai
openai.api_key = "YOUR_API_KEY"
response = openai.Completion.create(
model="text-davinci-003",
prompt="Hello",
temperature=0,
max_tokens=16
)
这里需要注意的是:调用接口需要先绑定OpenAI API Key。该API Key可以在OpenAI后台申请,点击右上角头像,在弹出菜单中点击”View API keys“。在API Keys管理界面可以创建或删除API Keys。
Node.js库
Node.js库的安装和使用步骤与Python库类似,在项目中运行
$ npm install openai
即可向项目中安装并添加openai库。安装完成后,即可在代码中调用
const {
Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
apiKey: 'YOUR_API_KEY',
});
const openai = new OpenAIApi(configuration);
const response = await openai.createCompletion({
model: "text-davinci-003",
prompt: "Hello",
temperature: 0,
max_tokens: 16,
});
社区提供了其他所有主流编程语言的库,大家可以根据自己使用的语言,在这里查找。
参数说明
用API的一大好处是,API提供了众多参数,可以让我们控制输出效果。下面是GPT-3和Codex模型支持的参数:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
model |
string | 模型名称(详见模型综述) | |
prompt |
string | 输入的提示 | |
suffix |
string | null |
文本生成后在文末插入的后缀 |
max_tokens |
int | 16 |
文本生成时要生成的最大token数。 提示的token数加上 max_tokens 不能超过模型的上下文长度。大多数模型的上下文长度为2048个token(最新模型支持4096 tokens) |
temperature |
float | 1 |
采样温度。值越高意味着模型承担的风险越大。 对于需要创意的场景,可以尝试0.9, 对于答案明确的场景,建议用0(argmax采样) 建议不要与 top_p 同时改变。详见《ChatGPT模型采样算法详解》 |
top_p |
float | 1 |
核采样(温度采样的另一种方式),其中模型考虑具有top_p 概率质量的token的结果。因此,0.1意味着只考虑包含最高10%概率质量的token建议不要与 temperature 同时改变。详见《ChatGPT模型采样算法详解》 |
n |
int | 1 |
每个提示要生成多少个答案 |
stream |
boolean | false |
是否返回流传输进度。如果设置,token将在可用时以纯数据服务器端推送事件发送,流以data:[DONE] 消息终止。 |
logprobs |
int | nul |
如果传值(最大值5)则表示包括logprobs 个最可能的token以及所选令牌的对数概率。例如,如果logprobs 为5,则API将返回包含5个最可能Token的列表。 |
echo |
boolean | false |
是否回传提示 |
stop |
string | null |
最多4个序列,遇到stop API将停止生成。返回的文本不包含停止序列。 |
presence_penalty |
float | 0 |
数值介于-2.0和2.0之间。正值将根据到目前为止新token是否出现在文本中来惩罚新token,从而增加模型谈论新主题的可能性。 详见 《ChatGPT模型中的惩罚机制》 |
frequency_penalty |
float | 0 |
数值介于-2.0和2.0之间。正值根据文本中新token已经出现的频率惩罚新token,从而降低模型逐字重复同一行的可能性。 详见 《ChatGPT模型中的惩罚机制》 |
best_of |
int | 1 |
在服务端生成best_of 个完成,并返回“最佳”(每个token的log概率最高的一条)。结果无法流式传输。与 n 一起使用时,best_of 控制候选回应的数量,n 指定要返回的数量–best_of 必须大于等于n 。⚠注意:由于此参数生成许多回应,因此会快速消耗token配额。小心使用并确保对 max_tokens 和stop 进行了合理的设置。 |
logit_bias |
map | null |
修改回应种出现指定token的可能性。 接受一个json对象,该对象将token(由GPT tokenizer的token ID指定)映射到-100到100之间的相关偏差值。可以用 tokenizer tool 将文本转换成token ID。 在数学上,在采样之前,将偏差添加到模型生成的逻辑中。每个模型的确切效果会有所不同,但介于-1和1之间的值应该会降低或增加选择的可能性;像-100或100这样的值应该会导致相关token的禁用或必现。 例如,可以传递 {"50256": -100} 以防止生成 <endoftext> 标记 |
user |
string | null |
代表终端用户的唯一标识符,OpenAI用来监控和检测滥用。 |
理解上述参数对文本生成任务的影响至关重要。其中最重要的一组参数是temperature
、top_p
、presence_penalty
、frequency_penalty
,详见《ChatGPT模型采样算法详解》 和 《ChatGPT模型中的惩罚机制》
总结
虽然GPT-3模型没有ChatGPT强大,但使用API有如下好处:
优点
- 无需注册、直接使用
- 有参数可以控制输出
- 比ChatGPT稳定
- 速度比ChatGPT快一点
- 可以整合到其他系统中
缺点
- 生成质量不如ChatGPT
- 有限的上下文支持
- 会产生费用