通过ChatGPT做一个终端对话玩具(xx再也不怕我xx了)
引导篇
从去年12月初了解到 ChatGPT ,也注册了账号,但是一直没去使用(真是太懒了)。
相信大家就算没使用过,也听闻过它的传说,简单来说就是一个解答性聊天机器人。
最近呢,有几位朋友也一直在向我咨询一些 ChatGPT 的问题,想了想还是做个小应用,带各位来了解并使用上ChatGPT 。
声明一下,此篇文章真不是用 ChatGPT 生成的。注册篇
已经有很多大佬来介绍这个注册方式了,我简单的说一下步骤吧。 准备好科学上网的节点(香港、越南的不行); 在 https://sms-activate.org/ 验证码平台上充值个1$; 去 https://chat.openai.com/auth/login 通过邮箱注册(推荐谷歌直接注册); 在验证码平台上找一个 openai 的验证码服务(最便宜的是印尼的,有效期20分钟);输入验证码平台上的手机号进行验证; 等待验证码出现,粘贴之后即可完成注册; 可以直接在 https://platform.openai.com/account/api-keys 生成 apiKey ;实战篇
本次做的小工具,是一个终端对话助手。通过用户的输入内容,让 ChatGPT 进行识别回答并输出。
效果图
准备工作
初始化 yarn init -y
安装插件 openai (对话功能)inquirer (处理命令行输入等操作)cli-spinner (Loading效果)
准备 openai 的 apiKey 对接 OpenAI
引入 openai,并且写一个调用入口函数。 const { Configuration, OpenAIApi } = require("openai"); async function main() { // 创建 openai 配置 const configuration = new Configuration({ apiKey: "apiKey" }); // 初始化 openai const openai = new OpenAIApi(configuration); const { data: { choices } } = await openai.createCompletion({ model: "text-davinci-003", // 对话机器人模型 prompt: "js 是什么?", // 问题 temperature: 0.5, // 准确性的概率,0是最精准的 max_tokens: 150, // 输出内容长度 top_p: 1.0, // 避免重复和不相关的内容 frequency_penalty: 0.0, // 控制语言模型中出现的词语频率,惩罚 presence_penalty: 0.0, // 控制语言模型中出现的词语频率,惩罚 }) console.log(choices[0].text); // 输出的内容 } main()
输出的结果如下图
这一步已经将 openai 对接完了。
让用户配置和提问
我们需要让用户提问,不应该直接将问题写在文件里,缺少与用户之间的交互。
这时候 inquirer 出现了,它是一个命令行交互工具,可以做很多事情,比如各种 cli 的一些问题及选择配置的方式,如 VueCli 的创建的这种多选、单选它都可以做到。
使用方式也很简单 const { prompt } = await inquirer.prompt({ type: "input", // 可以是 password|list 等 name: "prompt", // 定义的字段名 message: "请输入问题", // 提示信息 }); console.log("输入的内容 =>>>", prompt)
现在可以拿到用户的输入内容了,我们就可以做很多事情了。 获取用户输入的 apiKey ;获取用户选择的对话机器人模型; 获取用户提问内容; 引入&定义配置const inquirer = require("inquirer"); // 定义一个配置 config const config = Object.create(null); const fs = require("fs"); 写入 Key 到文件
让用户输入密钥,为了持久化存储,我选择直接创建文件来进行存 key ,以免每次都需要重新输入。// 判断文件是否存在 const keysIsExist = fs.existsSync("openai_keys"); // 如果不存在 if (!keysIsExist) { const { apiKey } = await inquirer.prompt({ type: "password", name: "apiKey", message: "请输入 Open AI 的 Key", }) // 覆盖写入 fs.writeFile("openai_keys", apiKey.trim(), { flag: "w" }, (err) => { if (err) console.error(err) else main() // 重新执行 }) } else { // 存在此文件直接读取赋值给 config.apiKey fs.readFile("openai_keys", (err, data) => { if (err) { console.error(err) return } config.apiKey = data.toString(); }) }
WX20230301-005129@2x.png 让用户选择机器人const { model } = await inquirer.prompt({ type: "list", name: "model", message: "请选择对话机器人", choices: [ { name: "text-ada-001", value: "text-ada-001" }, { name: "text-curie-001", value: "text-curie-001" }, { name: "text-babbage-001", value: "text-babbage-001" }, { name: "text-davinci-003", value: "text-davinci-003" }, ], default: "text-davinci-003" }) config.model = model;
WX20230301-005157@2x.png 让用户提问const { prompt } = await inquirer.prompt({ type: "input", name: "prompt", message: "请输入问题", });
WX20230301-005214@2x.png 加个 Loading 效果
因为 openai 响应有点慢,所以为了减少蕉绿,引入了 cli-spinner const Spinner = require("cli-spinner").Spinner; // %s 会被下面的 ▂ ▃ ▄ ▅ ▆ ▇ █ 替代,是个占位符 const spinner = new Spinner("Loading.. %s"); // 这里是loading字符,按照这个顺序去渲染 spinner.setSpinnerString("▂ ▃ ▄ ▅ ▆ ▇ █");
在请求 openai 之前调用// 请求开始 spinner.start(); // 请求完成之后暂停 spinner.stop(true); // 参数 bool ,是否需要清除输出内容 全部代码
终于完结撒花了,现在已经是凌晨一点半了。 const { Configuration, OpenAIApi } = require("openai"); const inquirer = require("inquirer"); const fs = require("fs"); const config = Object.create(null); const Spinner = require("cli-spinner").Spinner; const spinner = new Spinner("Loading.. %s"); spinner.setSpinnerString("▂ ▃ ▄ ▅ ▆ ▇ █"); async function main() { // 判断文件是否存在 const keysIsExist = fs.existsSync("openai_keys"); if(!keysIsExist) { const { apiKey } = await inquirer.prompt({ type: "password", name: "apiKey", message: "请输入 Open AI 的 Key", }) // 覆盖写入 fs.writeFile("openai_keys", apiKey.trim(), { flag: "w" }, (err) => { if (err) console.error(err) else main() }) } else { fs.readFile("openai_keys", (err, data) => { if (err) { console.error(err) return } config.apiKey = data.toString(); }) } const { model } = await inquirer.prompt({ type: "list", name: "model", message: "请选择对话机器人", choices: [ { name: "text-ada-001", value: "text-ada-001" }, { name: "text-curie-001", value: "text-curie-001" }, { name: "text-babbage-001", value: "text-babbage-001" }, { name: "text-davinci-003", value: "text-davinci-003" }, ], default: "text-davinci-003" }) config.model = model; const { apiKey } = config; console.log(" 33[42;30m LGOIN 33[40;32m 登录成功 33[0m"); const configuration = new Configuration({ apiKey }); config.openai = new OpenAIApi(configuration); start() } async function start() { const { model } = config; const { prompt } = await inquirer.prompt({ type: "input", name: "prompt", message: "请输入问题", }); if(!prompt.trim()) { start() return false } try { spinner.start(); const { data: { choices } } = await config.openai.createCompletion({ model, prompt, temperature: 0.5, max_tokens: 150, top_p: 1.0, frequency_penalty: 0.0, presence_penalty: 0.0, }) const answer = choices[0]?.text?.replace(/ +/g, ""); spinner.stop(true); console.log(" 33[32mOpen AI:" + answer?.trim() + " 33[0m"); start() } catch (error) { spinner.stop(true); console.log(error); } } main();
改稿之乐好文章是改出来的。这是材料口一个公认的说法。所谓诗文不厌改,佳作出苦心,说的也是这个道理。文学巨匠曹雪芹写红楼梦时,是在悼红轩中对原稿披阅十载增删五次后才定稿的。托尔斯泰写战争与和
广东入选内外贸一体化试点地区!将打造一批内外贸融合发展平台培育一批内外贸一体化经营企业,打造一批内外贸融合发展平台,形成一批具有国际竞争力融合发展的产业集群,建立健全促进内外贸一体化发展体制机制1月11日,商务部官网发布商务部等14部门关
美国误食大麻甜品幼儿5年激增14倍!医生不吃惊那天,小奥利弗困得有点反常,于是我抱他上床睡觉。突然间他开始浑身发抖和大哭,紧盯着我,眼神中充满恐惧。妈妈伊丽莎白佩里回忆说。她们一家住在美国马里兰州。两岁的小奥利弗立刻被送到附近
联盟MS22飞船冷却剂泄露,俄罗斯下月再发飞船接回3名宇航员(观察者网讯)据俄罗斯塔斯社1月11日报道,俄罗斯计划在下个月提前发射联盟MS23号飞船,将国际空间站内的3名宇航员接回地球。此前仪表设备舱外壳受损冷却系统发生泄漏的联盟MS22号
苹果VR要卖3000美元,库克能成为下一个乔布斯?你好,我是王煜全,这里是王煜全要闻评论。今年的CES展上VRAR厂商有了明显增加,越来越多的新尝试新应用也正在出现,让我更加确信2023年VRAR产业爆发在即的预判。CES之外,我
美国消费者浏览和购买习惯调查!35的人在亚马逊上发现新品牌!视频号关注AMZ123跨境导航AMZ123获悉,根据Emplicit的调查,几乎所有(86)的美国消费者都在亚马逊上购买过之前从未尝试过的产品。超过三分之一(35)的消费者表示亚马
神秘美国公司狙击中国光伏,却折射美国制造的悲剧文观察者网李泽西周毅编辑张广凯美国又对中国光伏企业下手了。在发起针对东南亚光伏电池组件的反规避调查后,2022年12月,美国商务部发布声明,宣布包括比亚迪在内的4家中国企业,被初步
机械九院将创业板IPO上会,被问询是否损害国有资产文观察者网邹煦晨编辑张广凯业绩仰仗关联方一汽集团的机械九院将于1月17日创业板IPO上会。值得一提的是,此次创业板IPO,机械九院拟募投项目的拟投入募集资金为13。49亿元,发行不
苔丝探测到系外新热木星最近,一个国际天文学家团队利用美国国家航空航天局的凌日系外行星勘探卫星(TESS),探测到一颗新的热木星系外行星,其质量可能是木星的3倍左右,围绕一颗名为TOI778的恒星运行。相
能源危机阴影减弱华尔街开始唱多欧元能源危机阴影减弱华尔街开始唱多欧元财联社1月12日电,华尔街正在为欧元反弹摇旗呐喊,能源危机的阴影减弱加上经济衰退前景趋向乐观,投资者正在押注低廉的欧洲资产。德意志银行和摩根士丹利
2023年军队文职人员公开招考岗位计划来源军队人才网2023年军队文职人员公开招考岗位计划(不含先面试后笔试岗位)详情请登录军队人才网下载查看2023年军队文职人员公开招考岗位计划(先面试后笔试岗位)详情请登录军队人才