背景
自从上一次写完可以从ChatGPT学到什么(一),简单对ChatGPT有一定了解后,其背后的技术原理是基于OpenAI GPT-3协议去实现的智能对话的。
再加上我看到国外有很多相关基于GPT开发的开源应用,因此萌生了自己动手搞一个,加上之前自己翻译了一篇文章有了GPT-3,再也不用手写commit message,他是基于Rust语言写,想着直接对着他照搬一个到Node.js版本,通过这种小项目实践,我们可以学习到:
- OpenAI提供了哪些模型算法
- 不同模型算法分别可以应用到哪些场景
- 真正调用OpenAI需要注意哪些事项
接下来我们开始动手吧!这里基本前提是你得拥有OpenAI API keys,可以到[OpenAI]。
首先我们先来看看node-gptcommit是做什么的。
node-gptcommit
node-gptcommit是基于gptcommit实现思路去开发的node版本工具命令,可以根据项目中git的diff文件列表去生成git commit信息。
具体效果可以参考以下步骤:
1.安装
npm install node-gptcommit -g
2.设置openai的apikey
ngptcommit config --set openai.apiKey=sk-xxxxx
3.开始使用
请到某个git仓库的根目录使用,具体如下:
cd xxx ngptcommit preview
就可以看到具体返回的信息,具体下文所示:
"🤖 GPT-3 返回的总结内容如下:" feat: - 更新项目配置,加强 TypeScript 的选项。 - 添加了包含了推荐和 Prettier 的扩展,设置特定规则和排除的 `tslint.json` 文件。 - 包含了文档配置的 `typedoc.js` 文件。 - 在新的 `tsconfig.json` 中添加严格的 TypeScript 选项。 - 在新的 `tslint.json` 文件中添加了推荐和 Prettier 的扩展。 - 配置了特定规则的排除和 false 选项。 - 添加了文档配置的 `typedoc.js` 文件。
OpenAI使用说明
OpenAI API说明文档,地址:openai docs。
首先,我们需要了解几个概念:
Model
模型,是AI算法模型,根据不同模型可以推算出不同的结果Completion
任务结果,指的调用模型后返回的结果apiKey
api秘钥,openai对调用api方的鉴权token
Model模型
OpenAI提供了几个模型,主要分别以下几种:
基于GPT-3
模型开发的模型:
GPT-3.5-turbo
,最新的GPT-3.5模型,主要针对对话聊天的自然语言和代码处理,也能处理传统的任务,成本只有text-davinci-003
十分之一text-davinci-003
,对各类型语言都友好支持,比其他模型更加擅长输出更多更长更高质量的文案,而且还会在文案补全相关逻辑
除了GPT-3
模型,openAI还提供了几个其他模型(包括:beta版本),如下:
DALL·E
,根据自然语言生成图片。Whisper
,语音识别模型,已经开源的模型Embeddings
,检测词语的关联关系,能实现搜索、分类、推荐、异常检测、多样性测试、标签等Codex
,基于GPT-3生成专门针对代码优化的模型,最擅长的是Python语言,精通十几种语言,包括JavaScript、Go、Perl、PHP、Ruby、SWIFT、TypeScrip、SQL,甚至是Shell等。Moderation
,按照OpenAI内容安全使用策略,识别内容是否非法。
使用
1.安装依赖
npm install openai
2.初始化
import { Configuration, OpenAIApi } from 'openai'; const config = new Configuration({ apiKey, }); this.openai = new OpenAIApi(config);
3.根据不同模型调用
// gpt-3.5-turbo const prompt = '请问你是谁?'; const response = await this.openai.createChatCompletion({ model: "gpt-3.5-turbo", messages: [{ role: "user", // system: 机器人, user: 用户, assistant: 助手 content: prompt }] }); // debug('调用openai接口返回内容:', response.data) return response.data.choices[0]?.message?.content ?? ""; // 生成一张黑色暹罗猫的图片 const response = await openai.createImage({ prompt: "a black cat", n: 1, size: "1024x1024", }); image_url = response.data.data[0].url; //
生成猫的图片:
了解到OpenAI提供了如此多的API,是否可以利用他们来开发一些辅助工具来提升我们开发幸福感呢?
目前已经有很多这种开源小工具了,比如:gptcommit, BibiGPT,roomGPT等。
接下来我们以gptcommit为参考,尝试自己去实现。
开发ngptcommit的背后
gptcommit实现原理
gptcommit是基于Rust开发,但是从看代码的过程中发现Rust其实和Typescript差不多类似的语法,所以很容易上手。
下面有张图,大概就是gptcommit实现的过程:
Node命令行工具
既然知道了gptcommit实现原理,那么要开发一个node的命令行工具,具体有哪些步骤呢?
1.在package.json
里配置命令行名称bin:xxx
:
{ ... "bin": { "ngptcommit": "bin/ngptcommit.js" } ... }
2.针对命令行工具,node.js要求在文件开头必须表明#!/usr/bin/env node
:
#!/usr/bin/env node import run from '../dist/cli.js'; run();
到了这里,我们基本就开始动手撸代码了,这里我还推荐一些npm包,能帮你快速开发命令行工具,有以下这些:
- rollup,比webpack更加适合开发js库的构建工具
- debug,更好打印debug日志,而不是所有都console.log
- cac,非常轻量的库,能帮你更快开发一个命令行工具
- picocolors,可以将在命令行输出的带颜色文字
- progress,可以在命令行显示进度条
遇到的问题
1.国内openAI无法连接上? 需要在代码预先判断连接,设置一个10秒超时,避免已经失败了,还要再继续去请求。
2.openAI访问频率有限制,如何解决? 需要加上每次请求后等待缓冲时间,避免因为多次请求导致失败。利用p_limit
库,加上每次请求利用setTimeout设置缓冲等待时间,避免多次高并发请求,后续可以优化模板内容,避免多次重复请求。
3.失败重试如何实现? 通过失败次数,加上递归自己,实现通过失败次数实现失败重试。
总结
经过开发这个工具,对OpenAI的有了更深入的了解,也明白为什么会有人说以后会出现一个岗位,叫AI驯服师或者AI提问者。
目前我个人对OpenAI类似的AI,可以认知到点如下:
- 要学习如何向AI提问,更高效的向AI提问,可能会成为未来的一种趋势
- AI更多是一种辅助工具,而不是会替换现有的岗位上的人,能帮忙人更高效的完成当前的工作
- 会有越来越多AI平台出现,甚至可能会出现一种大语言模型,或者面向AI编程语言,只需要写少量代码实现功能