用OpeAI API打造ChatGPT桌面端应用
自从《如何用ChatGPT高效完成工作》这篇文章火了之后,我在公司内部分享了一下”摸鱼“的先进经验,激发起广大同事一起”摸鱼“的热情。但是注册ChatGPT账号非常麻烦,既要Science上网,又要海外手机收验证码,每个人都注册一个ChatGPT账号不现实。于是就用OpenAI开放出来的GPT模型API,手撸了一个桌面端应用,来满足广大人民群众日益增长的”摸鱼“需求。
文章目录
-
- 成果展示
- 模型概述
-
- GPT-3
-
- Davinci
- Curie
- Babbage
- Ada
- Codex
- API调用
-
- Python库
- Node.js库
- 参数说明
- 总结
成果展示
先来看一下最终成果:【申请试用请关注留言或评论留言】
图1. 文本生成
图2. 代码生成
图3. 图片生成
目前包含文本生成,代码生成,图片生成三大项功能。其中以文本生成和代码生成日常使用最多。针对文本生成和代码生成这两大类场景,OpenAPI分别提供了GPT-3和Codex模型,
模型 | 描述 |
---|---|
GPT-3 | 一组能够理解和生成自然语言的模型 |
Codex | 一组可以理解和生成代码的模型,包括将自然语言转换为代码 |
虽然GPT-3模型没有ChatGPT背后的GPT-3.5强大,但是用API有如下好处:
优点
- 无需注册、无需Science上网
- 有参数可以控制输出
- 比ChatGPT稳定
- 速度比ChatGPT快一点
- 可以整合到其他系统中
缺点
- 生成质量不如ChatGPT
- 优先的上下文支持
- 会产生费用
模型概述
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_OPENAI_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_OPENAI_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 同时改变。 |
top_p |
float | 1 |
核采样(温度采样的另一种方式),其中模型考虑具有top_p 概率质量的token的结果。因此,0.1意味着只考虑包含最高10%概率质量的token建议不要与 temperature 同时改变。 |
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,从而增加模型谈论新主题的可能性。 |
frequency_penalty |
float | 0 |
数值介于-2.0和2.0之间。正值根据文本中新token已经出现的频率惩罚新token,从而降低模型逐字重复同一行的可能性。 |
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} 以防止生成`
|
user |
string | null |
代表终端用户的唯一标识符,OpenAI用来监控和检测滥用。 |
理解上述参数对文本生成任务的影响至关重要。其中最重要的一组参数是temperature
、top_p
、presence_penalty
、frequency_penalty
,后面我会专门整理相关文章来介绍这些参数背后的原理和对模型输出的影响。
总结
经过一周测试,我们发现虽然GPT-3和Codex的生成质量没有ChatGPT那么好,且对上下文的支持也不如ChatGPT,但在一些简单工作上使用还是够用的。关键是用API比用网页可以带来更多优势:
- 无需注册、无需Science上网
- 有参数可以控制输出
- 相对稳定、快速
- 可以整合到其他系统中
不过,这里不得不吐槽一下,OpenAI开发出来的图像生成接口真的是不行。生成的图像非常粗糙,明显是将多张图片中的元素剪切拼在一起,完全无法满足工作需要的精度。各位读者如果知道哪些更强大的AI图像接口,欢迎大家留言告知我。
最后希望我的ChatGPT API申请能尽快审核下来,届时我将带给大家真正的ChatGPT-3.5的桌面端工具。