您现在的位置: 首页> 热点关注 > 正文
天天精选!基于最新 ChatGPT API 实现命令行版 ChatGPT
发布时间:2023-03-07 15:54:48 来源:程序员客栈
引子OpenAI 这两天发布了ChatGPT API,基于gpt-3.5-turbo模型,这是一个 GPT-3.5 的优化版本,用于支持开发者把 ChatGPT 集成到自己的产品中,同时把 API 调用价格降到 $0.002 每千 token,意味着处理 100万字符的文本只需要 2 美元,也就是差不多十几块钱人民币,效果更好、价格更低,这让 ChatGPT API 更具性价比,因此这两天基于 ChatGPT API 的各种套壳应用如雨后春笋般大量冒出。我也来凑个热闹,试一试水,正好在我今天新建的 ChatGPT 互助讨论群里有人问有没有命令行版 ChatGPT,那就拿它来开刀吧:
老规矩,还是面向 ChatGPT 编程来实现这个命令行版 ChatGPT 应用。
在《面向 ChatGPT 编程实现全栈开发的 18 种方法》这篇教程中,我在最后说到在面向 ChatGPT 编程的时候,需要牢记两个原则:第一,知道你在做什么,第二,不要相信 ChatGPT 的代码。
落地到实践的时候,就是在与 ChatGPT 合作形成的结对编程联盟中,作为开发者我们需要承担代码设计、架构、编排与审核(CodeReview)的职责,对方案和结果负责,而具体的代码片段编写这种纯体力活则交由 ChatGPT 完成。
接下来,我们将遵循这个思路实现命令行版 ChatGPT 应用。
代码设计
如我在微信群里所说,这个需求确实很简单 —— 通过编程在控制台应用代码中调用 ChatGPT API 接口,实现一个命令行版的 ChatGPT,几十行代码就能搞定。不过这里仍然需要做一些简单的设计:

调用 API 需要传递 API KEY,我们不希望这个 KEY 硬编码在代码中,而是从系统环境变量读取,从而让代码更安全可维护;

调用封装好的 Go OpenAI 库与 API 接口进行交互,避免通过 HTTP 协议与原生 API 交互编写大量重复代码,让代码更简洁优雅;

做一个给客户使用的产品,美观会带来更好的用户体验,所以我希望即便是命令行应用,也尽可能让交互和输出更美观一些。

对于第 2 点,可以使用 go-gpt3 库,这是一个通过 Go 封装的 OpenAI API 调用库。


(资料图片)

对于第3点,可以使用 glamour 库,这是一个 Go 语言实现的、能够在兼容 ANSI 终端基于样式渲染 Markdown 文本的第三方库,它是让命令行更美观的开源项目 Charm 的一部分。

因为项目很简单,又是在客户端本地使用,所以不需要做什么复杂的架构,下面直接进入编码部分。

代码编写

面向 ChatGPT 编程的核心就是把需求尽可能准确全面地转化为 Prompt 传递给 ChatGPT,这里有产品需求(来自业务和产品),也有代码设计和架构上的需求(来自开发者),然后让它生成代码,这是作为一个合格的 Prompt 工程师自我修养的必要组成部分。

在《ChatGPT 提示的艺术 —— 编写清晰有效提示指南(二)》这篇教程中,我已经给大家介绍了编写清晰有效 Prompt 的原则、做法和技巧,感兴趣的可以去看下,这里我先将我的需求转化为 Prompt 让 ChatGPT 替我编写对应的 Go 代码实现:

代码优化看起来不错,基本流程没问题,但是代码审核会发现,它现在把输入的 Prompt 写死了,并不能动态接收用输入,而且运行一次后就退出了,这不是 ChatGPT 的问题,而是我们的需求并没有明确这一点,作为一个完整的需求和程序,需要说明是什么,怎么样,什么时候开始,什么时候退出。不过细心的同学可能还留意到go-gpt3包引入的时候没有设置别名,会导致运行时出错,同时调用的 OpenAI API 接口也不对,最新的 ChatGPT API 接口方法应该是CreateChatCompletion,可能是太新的缘故,ChatGPT 还没有学习到这里,不过这都属于 ChatGPT 要优化的点了。以及使用了另一个同名的包,这个也需要明确告知它。细节上还是需要优化,现在我们基于这些要点先来完善我们的 Prompt:
这一次,我们更加细化了程序的行为,用户输入start启动,输入quit退出,在此期间则不断读取用户输入,返回 ChatGPT 处理结果并渲染到控制台输出,另外,我还在读取系统环境变量时嘱咐通过os.Getenv获取,因为有时候发现 ChatGPT 输出不稳定,会尝试从.env文件读取OPENAI_API_KEY,当然这不是 ChatGPT 的问题,是我们没有给出明确清晰的 Prompt。
现在再来看 ChatGPT 输出的代码,就更完善了:

package mainimport ("context""fmt""os""strings""github.com/charmbracelet/glamour""github.com/common-nighthawk/go-figure"gpt3 "github.com/sashabaranov/go-gpt3")func main() {// 获取 OpenAI API KeyapiKey := os.Getenv("OPENAI_API_KEY")if apiKey == "" {fmt.Println("请设置 OPENAI_API_KEY 环境变量")return}// 初始化 Glamour 渲染器renderStyle := glamour.WithEnvironmentConfig()mdRenderer, err := glamour.NewTermRenderer(renderStyle,)if err != nil {fmt.Println("初始化 Markdown 渲染器失败")return}// 输出欢迎语(命令行应用启动界面)myFigure := figure.NewFigure("ChatGPT", "", true)myFigure.Print()fmt.Println("输入 start 启动应用,输入 quit 退出应用")// 创建 ChatGPT 客户端client := gpt3.NewClient(apiKey)if err != nil {fmt.Printf("创建客户端失败: %s\n", err.Error())return}messages := []gpt3.ChatCompletionMessage{{Role:    "system",Content: "你是ChatGPT, OpenAI训练的大型语言模型, 请尽可能简洁地回答我的问题",},}// 读取用户输入并交互var userInput stringfor {fmt.Scanln(&userInput)if strings.ToLower(userInput) == "start" {fmt.Println("ChatGPT 启动成功,请输入您的问题:")} else if strings.ToLower(userInput) == "quit" {fmt.Println("ChatGPT 已退出")return} else if userInput != "" {messages = append(messages, gpt3.ChatCompletionMessage{Role:    "user",Content: userInput,},)// 调用 ChatGPT API 接口生成回答resp, err := client.CreateChatCompletion(context.Background(),gpt3.ChatCompletionRequest{Model:       gpt3.GPT3Dot5Turbo,Messages:    messages,MaxTokens:   1024,Temperature: 0,N:           1,},)if err != nil {fmt.Printf("ChatGPT 接口调用失败: %s\n", err.Error())continue}// 格式化输出结果output := resp.Choices[0].Message.ContentmdOutput, err := mdRenderer.Render(output)if err != nil {fmt.Printf("Markdown 渲染失败: %s\n", err.Error())continue}fmt.Println(mdOutput)messages = append(messages, gpt3.ChatCompletionMessage{Role:    "assistant",Content: output,},)}}}

gpt3 别名和 CreateChatCompletion 方法调用相关的代码还是需要手动调整,不过这也是我前面说的面向 ChatGPT 编程的原则之一,最后一定要审核 ChatGPT 的代码,它目前对于最新的知识还是有一定的迟滞性。

代码细节我就不展开解释了,有不明白的地方可以参考我在《面向 ChatGPT 编程实现全栈开发的 18 种方法》这篇教程中代码解释部分提供的方法自行去基于 ChatGPT 查看。

效果展示最后我们在终端体验一下这个命令行版 ChatGPT,我这里使用的是 Windows WSL 终端,Windows 终端本身体验其实不太好,尤其是中文输入的时候,删除字符特别费劲,且很容易造成消息变形,如果是 Mac 或者 Ubuntu 终端可能效果会更好一些。首先我们启动这个应用,如果没有设置OPENAI_API_KEY这个系统环境变量(运行export OPENAI_API_KEY={你的 OpenAI SECRET KEY}命令设置即可),会提示你设置:
如果已经设置,会进入下面这样的启动欢迎界面:
输入start即可启动应用,然后我们在命令行输入问题,回车,就会将问题提交给 ChatGPT,ChatGPT 处理的结果会返回并输出到控制台,这里的格式经过了 Glamour 库的美化:
因为是 for 循环,所以你可以持续提问、得到答案,直到输入quit退出应用。

终端需要能够访问 OpenAI API 才能调用成功,这意味着命令行也要支持科学上网。

好了,这就是我们基于最新 ChatGPT API 实现的命令行版 ChatGPT 应用,因为 ChatGPT API 是前两天才发布的,所以看起来 ChatGPT 并没有学习到这个最新的 API 如何调用,存在迟滞性,进而导致编写的代码并不能直接满足需求,需要人为介入去修改,希望未来 ChatGPT 能够在这一块上有所进化。

欢迎点赞、关注、分享,更多关于 ChatGPT 的学习实践探讨,请关注这个订阅号或者点击阅读原文了解极客书房最新动态。

标签: 系统环境 这是一个 可以使用

重庆:到2025年25个重点领域企业能效全部达到基准水平

3月18日,重庆日报记者从市发展改革委获悉,日前,市发展改革委、市经济信息委、市生态环境局、市市场监...

重磅!2021“发现重庆之美”获奖名单揭晓

3月19日,2021发现重庆之美颁奖典礼在线上举行,最美城市管理人、最美坡坎崖、最美街头绿地、垃圾分类时...

去年重庆回收废弃农膜1.4万吨 农膜回收率达89.31%

3月16日,市五届人大常委会第六十九次主任会议听取了市政府关于《重庆市人大常委会对市人民政府农业面源...

申报分两批!今年国家级博士后科研工作站新设站工作启动

3月19日,重庆日报记者从市人力社保局获悉,为推动产学研深度融合,加强博士后工作平台建设,我市将开展...

浙江鄞州:“水、电、气、数”通办专窗实现城乡公共服务均等化

近日,在宁波市鄞州区邱隘镇公共事务服务中心,66岁的邱隘镇沈家新村居民邱秀月在一个窗口相继办理了不...

打开“浙里办” 浙江1000家农贸市场农产品可线上比价

今天哪个菜场的五花肉最便宜?食品安全抽检结果怎么样?这些问题,浙江居民只需打开浙里办APP上的浙里市场...

浙江鉴湖国家湿地公园规划发布 打造乡村数字旅游

19日上午,鉴湖国家湿地公园规划发布暨东鉴湖农旅观光体验启动仪式在绍兴市越城区陶堰街道举行。当天,...

总投资超10亿元!6个石化装备运维项目在岱山签约

日前,总投资超10亿元的6个石化装备运维项目在岱山经济开发区集中签约。此次签约的项目占地106亩,规划...

如何避免成为“买而不做”的“装备党”祝 杰

自恋是人的天性,人们总是希望自己是更好的,那么自己拥有的事物,也就相应地被自我赋予了更高的价值,...

山西临汾:率先在全省建起农村集体经济开发区

3月17日,临汾市农村集体经济发展(集团)有限公司在临汾经济开发区揭牌。以此为标志,临汾率先在全省建起...

广东肇庆“毒驾连撞5车致1死”肇事司机被批捕

  1月5日14时30分许,广东肇庆市端州区一男子赵某毒驾连撞5车,致一人死亡。  1月10日,澎湃新闻(ww...

一线工作近22年的缉毒警:我知道坏的是毒品不是人性

  “影子”般的缉毒警:一线工作22年,我知道坏的是毒品不是人性  如果我不继续干,别人也要干,缉...

青海保障门源地震后生活必需品应急物资

  中新网西宁1月10日电 (记者 孙睿)记者10日从青海省商务厅获悉,青海海北州门源县6 9级地震灾害发...

江西最大文物倒卖案宣判:倒卖国家二级文物 9人获刑

  中新网南昌1月10日电 (冷峥嵘 张一怡)江西省共青城市人民法院10日发布消息称,近日,该院依法审结...

呼和浩特:寒假期间有条件的学校要开展校内托管服务

  中新网呼和浩特1月10日电 (记者 张林虎)10日,记者从呼和浩特市教育局获悉,在暑假校内托管试点的...

广西东兴口岸恢复通关 入境需网上预约

  中新社防城港1月10日电 (翟李强)自2022年1月10日零时起,广西东兴口岸和边民互市贸易区恢复人员、...

天津米面油存量由20天提高至30天 超市菜市场进货量翻倍

  天津米面油存量由20天提高至30天 蔬菜库存量、超市菜市场进货量翻倍  记者10日从天津市商务局获...

天津市委市政府致全市父老乡亲的慰问信:我们一定能够打赢

  中新网天津1月10日电 (记者 张道正)中共天津市委、天津市人民政府10日发布了“致全市父老乡亲的慰...

北京市十五届人大五次会议胜利闭幕

  北京市十五届人大五次会议胜利闭幕   蔡奇陈吉宁李伟魏小东张延昆出席   张延昆齐静当选市人...

“中国最后一个原始部落”翁丁老寨火灾原因公布

  “中国最后一个原始部落”翁丁老寨火灾原因公布:小孩玩火引起  中新网昆明1月10日电 (罗婕)近日...

天津:划定封控区 全市开展全员核酸检测

  央视网消息:在各地的最新疫情中,奥密克戎变异株引发天津新增多例本土感染引人关注。截至1月9日下...

重庆姐弟被生父扔下坠亡案上诉期结束 一审法院暂未收到两被告人上诉状

  重庆姐弟被生父扔下坠亡案上诉期结束,一审法院暂未收到两被告人上诉状  澎湃新闻记者 谢寅宗 ...

子夜直击,天津寒天战“疫”

  新华全媒+|子夜直击,天津寒天战“疫”  新华社天津1月10日电 题:子夜直击,天津寒天战“疫”...

兰州名师话“美育”:“尚乐立人”分层培优 以“美”润教

  中新网兰州1月10日电 (记者 刘玉桃 高莹)“实际上音乐课作为一门非高考科目,一直以来没有受到足...

中国边疆“北方第一所”:9名民警守护“生命禁区”

  中新网呼伦贝尔1月10日电 题:中国边疆“北方第一所”:9名民警守护“生命禁区”  作者 张玮 ...

江歌母亲江秋莲:尊重法院判决,法律认定在我意料之中

河南安阳9日12时至24时新增11例本土确诊病例

辟谣!网传“封控区管控区相继解封”通知并非西安

铁路公安以110幅优秀书画作品庆祝人民警察节

老人5折环卫工8折生活困难免费 这家面馆背后有个暖心事

河南新增本土确诊病例60例

本周中东部冷空气频繁 东北等地有降雪

迎腊八北京晴天上线 阵风6至7级体感冻人

“打拐”民警眼里的百态人生:见证一份份不愿放弃的爱

江歌母亲江秋莲诉刘鑫案一审将于今日宣判

15年照顾170多个新生儿 金牌月嫂“漂”到海外去看娃

伪造国家机关证件典型案例发布 有力打击制假贩假行为

多省份倡议春节“非必要不离开”,这地补贴1000元

员工迟到一次罚一千引争议 单位惩戒员工法律边界何在?

河南省安阳市两地划为高风险地区 一地划为中风险地区

保安、厨师曾被竞业限制 企业滥用竞业限制让员工很苦恼

以体育人 秀出“青年范儿”

一所中职学校的育人实践

反诈老陈破圈:人民群众在哪 就把反诈宣传开展到哪

中学生成剧本杀行业潜在消费人群 多方助推行业“净化”

各地严惩恶意欠薪 保障农民工及时拿到工资

对餐饮浪费说“不”(百姓关注)

“这就是我最好的选择”

琉璃河遗址 两段铭文共证北京三千年建城史

校园“直通车” 服务“零距离”

琉璃河遗址 两段铭文共证北京三千年建城史

千元修复个人征信报告?银行:“征信修复”都是骗局

《传奇2》网游著作权纠纷案峰回路转 最高法五份裁决四份改判一份发回重审

“共享法庭”让金融消费者畅享“智慧司法”便利

河南郑州调整五地为中风险区域 公路入郑需核酸检测阴性证明

北京公交将开展无人驾驶道路测试

“胡叔叔”的寻亲工作室

三代警察:从未放弃的28年

“团圆”行动刑侦专家吕游 每一个案例都有单独的技术方案

天津津南本轮本土疫情第3—20例阳性感染者活动轨迹公布

“不得以任何借口拒收患者”彰显生命至上

冬奥开幕在即 “双减”催热冰雪课堂

开考古书店日均两三个顾客 流量时代她决心仍是只卖书

河南“战疫”直面五重考验

冷空气来袭广州气温骤降 广东多地发布寒冷预警

天津多站进京车票暂停发售

天津津南区再增20例阳性感染者,详情公布

“电话发我”——“霸气回应”疫情求助背后的城市温度

南宁铁路警方春运期间将免费提供被拐儿童父母DNA检测服务

电影《农民院士》昆明首映 为观众呈现“把论文写在大地上”

天津全面加强离津管理 实施离津审批报备制度

天津津南调整区域风险等级:1个高风险6个中风险!

青海门源地震“震出”潜逃8年犯罪嫌疑人

口述|“郑州人张嘴做核酸采样的样子,熟练得让人心疼”

天津全面加强离津管理:广大市民群众非必要不离津

x 广告
x 广告

Copyright ©  2015-2022 东方自然网版权所有  备案号:沪ICP备2020036824号-8   联系邮箱:562 66 29@qq.com