【总结】1644- 用 ChatGPT 开发一个能聊天的命令行工具

前言

2022 年 11 月 ChatGPT 像一股风暴席卷全球。时隔数月,OpenAI 终于在 3 月 1 日正式推出了 ChatGPT 的开放 API。这意味着,我们通过简单的 API 调用,就可以与 ChatGPT 进行对话。可以预见的是像自来水一样使用 AI 的时代已经到来,我们可以随时随地使用它,而不需要关心算法实现细节。

值得注意的是在此之前有大量的第三方平台号称调用的是 ChatGPT 的 API,实际多数为基于 GPT-3 的“自动补齐” API,其能力远不可与 ChatGPT 相媲美,而这一次提供的则是官方的基于聊天(Chat)消息的 API。

本文将通过一个简单的命令行翻译程序,来展示如何使用 ChatGPT API。

你以为 API 调用工程就是本文的全部内容吗?不,更重要的是教会大家如何通过“Prompt Engineering”(即所谓“提示工程”学)将聊天型 AIGC 转换为特定领域的生产力

本文的源代码已上传至  Github (https://github.com/MagicCube/cli-gpt)

废话不多说,先上 DEMO 为敬:

你是否经常会经常忘记某个命令行工具的参数该怎么写?正确的顺序是什么?或者是  git、docker 命令的新手?通过我们接下来要开发的这个程序,你只需要用中英文(或任何语言)描述你想要完成的任务,AI 会将它转换为对应的命令行文本,再也不用记忆复杂的命令参数啦~

7b3a9d36feb2d195f3cd2b193923360d.gif

1. 准备工作

  1. 首先,你必须确保你所在的网络环境可以正常访问  OpenAI Platform (https://platform.openai.com/),并且已经注册了 OpenAI 账号。

  2. 在  https://platform.openai.com/account/api-keys 页面中,点击“Create new secret key”,并将它复制到剪贴板,稍后我们会使用到。

请注意保管好你的秘钥,因为只有在创建时才会有唯一的机会看见完整的秘钥。

2. ChatGPT API

接下来让我们认识一下 ChatGPT API。通过阅读官方说明 (https://platform.openai.com/docs/guides/chat),我们可以得知几点:

  • 利用 API 我们可以做各种有意思的事情,包括但不限于聊天机器人、翻译、问答、故事生成、代码生成等等,通过 Prompt Engineering,它还可以被用于文本情感和分类器等场景。

  • 模型采用的是 gpt-3.5-turbo,它具有快速、便宜、灵活等特点,同时也是目前最接近线上 ChatGPT 体验的模型,据官方称其成本只有此前 text-davinci-003 模型的 1/10。

  • 我们使用到的 API 是 createChatCompletion,它的作用是根据一组聊天消息组成的提示,生成一条对应的回答。详细的 API 解释请参考官方文档 (https://platform.openai.com/docs/api-reference/completions/create)。

  • API 的调用方式是 POST,返回的是 JSON 格式的数据。你也可以通过 Event Stream 的方式实时逐步获取答案,这会带来更加接近 ChatGPT 的“打字出答案”体验。本例中,采用的是 Node.js 的官方 SDK 封装 (https://www.npmjs.com/package/openai),它封装了几乎所有 OpenAI 开放的服务方法,使用的 HTTP 客户端底层库是大家熟悉的 axios。

  • API 的调用次数是有限制的,并且是按照提示 + 回答中的总 token 数计算,超过后将会收费。有关 token 的说明请参考这篇文档 (https://platform.openai.com/docs/guides/chat/managing-tokens),具体收费标准请参考官方费用说明 (https://openai.com/pricing/)。

虽然 API 才上线几天时间,国内外已经有大量的开源项目基于它开发了各种有趣的应用,这里隆重推荐:

  • ChatGPT 黑客马拉松项目列表 (https://lablab.ai/tech/chatgpt)

3. Prompt Engineering

接下来,我们将进入本文的重点——Prompt Engineering。ChatGPT 是一个通用型聊天机器,它可以回答任何问题,但是它的回答并不是总是符合我们的预期。因此,我们需要通过 Prompt Engineering 来提示 AI 如何进行输出。

在 ChatGPT 中,提示是由一组聊天消息组成的,每个消息都是由一个特定角色说的话,这些角色包括:

  • user:用户角色,即我们自己。

  • assistant:助手角色,即 ChatGPT。

  • system: 系统角色,即 ChatGPT 的上下文,在这里我们可以描述它在当前会话中扮演的角色,并可以通过逻辑规则限定它的输出(包括格式等),这听起来是不是越来越像阿西莫夫机器人三定论?有异曲同工之妙。

  • 除此之外,你还可以通过 user 和 assistant 的多组对话示例,来描述系统的行为,类似教学案例。

为了更好的解释三者的关系以及如何进行 Prompt,我们将引入一个十分好用的官方工具——Playground (https://platform.openai.com/playground?mode=chat)。

1514c25c86f126327732e26a90ca2307.png

如上图所示,Playground 由三个部分组成:

  • 最左侧是最近 30 天每一次执行的 API 调用记录,我们可以通过点击其中的一条记录来查看对应的记录。如果你没有看见这个侧边栏,请点击最下方“Submit”按钮右侧的“History”按钮。点击侧边栏顶部的“...”,你会看到一个下拉菜单,可以将历史记录导出为 JSON 或 CSV 格式的文件进行下载。

  • 在历史记录侧边栏右侧的是 SYSTEM,在这里我们将填写系统扮演的角色、行为和限定规则等。

  • 在 SYSTEM 右边是会话列表,这里我们将添加一轮或多轮对话,机器回复的消息也会被显示在这个列表的尾部。你可以点击左侧的“+”号添加消息,也可以点击右侧的“-”号删除消息,点击消息的内容会进入编辑模式,而点击消息行头的角色名称将会切换为相反的角色(如点击“USER”会切换为“ASSISTANT”)。

  • 最右侧是模型参数,请保持 Mode 为 Chat,Engine 为 gpt-3.5-turbo,其他参数请保持默认,我们会在后文介绍。

截止至本文发稿前,Playground 还处于 Beta 阶段,包括右上角的 View Code、Save 和 Share 等功能还未上线,但是它已足够满足我们的需求了。

在下文中为了更好的表示我们录入的提示和输出,我们将使用如下的记号文本:

# SYSTEM
在这里添加系统的行为和限定规则。
支持多行文本# USER
在这里添加用户的输入。# ASSISTANT
在这里添加机器的输出。

回到本文示例,我们将实现一个简单的命令行翻译程序,它可以将人类的自然语言描述的指令翻译成对应的命令行。

Prompt Engineering 很像是用自然语言编程,我们需要用到逻辑条件甚至是循环(通过停止条件 + 类似 GOTO 语句组合实现)。

STEP 1:从零开始

让我们先从最基本的开始,首先我们需要为 ChatGPT 制定扮演的角色。

# SYSTEM
你是一个命令行翻译程序,你可以将人类自然语言描述的指令翻译成对应的命令行语句。# USER
列出所有 TS 文件
9e2cc946050254e9560299108fe03877.png

这时,我们可以看到 ChatGPT 已经给出了一个结果,但是存在一些问题:

  1. 回答中有多余的介绍性语句,这是因为我们没有对 ChatGPT 的输出进行限定。

  2. 每一次执行都会返回不同的结果,这是因为 ChatGPT 的 Temperature 参数默认是 0.7。如果你希望 ChatGPT 的回答更加自然或富有创造性,可以将其设置为 1;反之在命令行翻译器这个场景里,我们希望它具有更加理性、稳定的输出,因此我们将其设置为 0。

STEP 2:添加第一个限定条件

根据第一步的经验,我们重新设计了 Prompt:

# SYSTEM
你是一个命令行翻译程序,你可以将人类自然语言描述的指令翻译成对应的命令行语句。1. 你只需要将翻译好的指令直接输出,而不需要对其进行任何的解释。# USER
显示所有 MD 文件
82505c8a89482e6e20eed1bea64697c1.png

这时,我们会发现,无论我们尝试 Submit 多少次,ChatGPT 都会返回相同的结果,并且不再会有注解说明。

注意,Submit 前需要手工删除此前 ASSISTANT 输出的内容,否则 ChatGPT 会将其作为输入的一部分。

但是如果我们问机器一些与命令无关的问题时,他会出现下面的情况:

d95654cef56332e40ef07f23113794a9.png

因此,接下来我们需要告诉机器,如果用户输入的内容不是命令,需要如何回答,这相当于编程语言中的 throw 语句。

STEP 3:抛出异常

这里我们使用“如果 / 或者 / 那么”等逻辑单元进行描述,我们修改一下 Prompt:

# SYSTEM
你是一个命令行翻译程序,你可以将人类自然语言描述的指令翻译成对应的命令行语句。1. 你只需要将翻译好的指令直接输出,而不需要对其进行任何的解释。2. 如果你不明白我说的话,或不确定如何将我所说的指令转换为计算机命令行,请直接输出 7 个字母,“UNKNOWN” ,无需其他解释。# USER
你的外婆是谁?
8af0878f4b07ad5d9ec557b3a1321d7a.png

这样当我们问起与命令无关的问题时,ChatGPT 就会直接输出 UNKNOWN 了。

现在让我们再来试一个复杂的命令:

fde5c593d9172ffc7b449335a353b423.png

这里我们假设需要命令行翻译器永远只输出一个单行命令,在下一步中我们将添加更多的限定。

STEP 4:限定输出格式

在这一步中,我们继续添加规则,以进一步“限定”输出的格式,修改后的 Prompt 如下:

# SYSTEM
你是一个命令行翻译程序,你可以将人类自然语言描述的指令翻译成对应的命令行语句。1. 你只需要将翻译好的指令直接输出,而不需要对其进行任何的解释。在输出的最前面加上“>”符号。2. 如果你不明白我说的话,或不确定如何将我所说的指令转换为计算机命令行,请直接输出 7 个字母,“UNKNOWN” ,无需其他解释和“>”符号。3. 如果翻译后的结果不止一行命令,则请务必将它们通过 & 或 && 合并为单行命令。
ece704d9ab2dfeb919b90230f561df05.png

STEP 5:危险提示

众所周知,一些命令对系统来说是十分危险的,比如著名的 rm -rf /,因此我们需要在命令行翻译器中添加一个“危险提示”功能,当用户输入的命令包含危险关键字时,需要提示用户是否继续执行。

# SYSTEM
你是一个命令行翻译程序,你可以将人类自然语言描述的指令翻译成对应的命令行语句。1. 你只需要将翻译好的指令直接输出,而不需要对其进行任何的解释。在输出的最前面加上“>”符号。2. 如果你不明白我说的话,或不确定如何将我所说的指令转换为计算机命令行,请直接输出 7 个字母,“UNKNOWN” ,无需其他解释和“>”符号。3. 如果翻译后的结果不止一行命令,则请务必将它们通过 & 或 && 合并为单行命令。4. 如果该命令会存在可能的风险或危害,请在输出的末尾另一行,并添加 “DANGEROUS”,无需其他的警告或提示。
182eea31e733cae828b935b3f0b6e4bd.png

这里我们会发现,无论如何修改 SYSTEM 的提示,ASSISTANT 的输出总是不尽人意,似乎它总是不能完全理解我们的意图,要不就是一堆注意事项,要不就是不知道 DANGEROUS 应该放在哪里。这时,我们必须用到一个新技能这就是“榜样”。

STEP 6: 榜样的作用

前文说过,ChatGPT 会将整个聊天记录作为输入,因此我们可以通过提供一些“榜样”来让 ChatGPT 更好地理解我们的意图。这意味着我们可以在界面上将 ASSISTANT 原先错误的回答修改为正确的,也就是给出了正确回答的“好榜样”。

8d56739ef412e3690e9453b416f93d75.png

如上图所示,经过修改后,ChatGPT 就能够正确理解我们的意图,输出正确格式的结果。

STEP 7:翻译为英文

因为 ChatGPT 的训练数据以英文为主,如果你想达到最佳的效果,那么你需要将你的 Prompt 翻译为英文。这里我们当然可以使用 ChatGPT 充当翻译,翻译后的 Prompt 如下:

3c15a61b9f833e3a49a5710ed312c4f9.png
# SYSTEM
You are a command line translation program. You can translate natural language instructions from human language into corresponding command line statements.1. Simply output the translated instruction without any explanation. Add the ">" symbol at the beginning of the output.2. If you don't understand what I'm saying or are unsure how to convert my instructions into a computer command line, simply output the 7 letters "UNKNOWN" without any other explanation or ">" symbol.3. If the translated result consists of more than one line of commands, please use '&' or '&&' to combine them into a single line of command.4. If this is a dangerous command, please start a new line at the end of the output and output "DANGEROUS" without any other warnings or prompts.# USER
今天天气如何# ASSISTANT
UNKNOWN# USER
从 Github 上克隆 React 库,并且在本地创建新的分支,取名为“feat-gpt”# ASSISTANT
>git clone https://github.com/facebook/react.git && cd react && git checkout -b feat-gpt# USER
删除所有的文件或文件夹# ASSISTANT
>rm -rf *
DANGERS

现在 ChatGPT 最终通过了所有测试,我们可以进入到编码阶段了。

4. 实现一个简单的命令行客户端

相信这会儿你肯定已经摩拳擦掌了,那么让我们开始动手吧!

我们将使用到的技术栈是 Node.js + TypeScript + OpenAI SDK,尽管如此  Python  的程序员也可以参考本文自行基于官方 SDK (https://github.com/openai/openai-python) 实现。

我们可以将整个项目的架构分为 4 个小模块,他们分别是:

4.1 API 的二次封装

将 OpenAI SDK 封装成一个更加易用的 API,输入为多个 Messages,输出则直接是纯文本结果(包含 UNKNOWN 及 DANGEROUS 也在结果内)。

详见  https://github.com/MagicCube/cli-gpt/blob/main/src/open-ai/index.ts

4.2 Prompt 的生成器

在上文中,我们自创了一种 Prompt 的表达格式,用“:”加角色名称表示消息的发送者,并且支持多行文本,这非常适合描述多角色 Prompt。因此,我们首先需要一个 Prompt 模板加载器,它可以将模板文件加载为 Prompt 模板,然后再将本次用户从命令行真正输入的内容转换为最后一条 message,这就是 Prompt 生成器的作用。同时模板中可能还包含着一些可替换的变量,例如命令行可能根据操作系统的不同而有差异性,因此在模板中我们可以用 ${OS} 表示指定的操作系统。

详见

https://github.com/MagicCube/cli-gpt/blob/main/src/prompt/index.ts

https://github.com/MagicCube/cli-gpt/blob/main/src/prompt/template.ts

模板详见

https://github.com/MagicCube/cli-gpt/blob/main/prompt-template/default.md

4.3 翻译器

翻译器是 Facade 层,它将上述两个模块的 API 组合起来,将用户的输入通过生成器转化为最终的 Prompt Messages,并且将其通过 API 客户端发送给 OpenAI,最后将结果返回。

详见  https://github.com/MagicCube/cli-gpt/blob/main/src/translator/index.ts

4.4 CLI 展现层

本例中文通过  oclif (https://github.com/oclif/oclif) 库来实现 CLI 界面,它提供了一个非常方便的 CLI 框架,我们只需要专注于 Command 业务逻辑的实现。oclif 还可以帮我们自动发布为全局命令,这样我们就可以在任何地方使用我们的命令行工具了。

详见  https://github.com/MagicCube/cli-gpt/blob/main/src/ui/index.ts

此外,我们不希望将 OpenAI 的 Secret Key 提交到 Github 上。为此,你需要在项目的根目录下新建一个 .env  文件,内容如下:

OPENAI_API_KEY="sk-your-secret-key"

受限于篇幅,这里不再展开介绍每个模块的实现细节,代码都非常好理解,你可以通过点击对应的代码链接查看源码。

5. 总结

通过本文,你可能会对 Prompt Engineering 有更深的理解,也许你会想到一些更有趣的 Prompt 应用场景,并且会发现即便不会写代码,你也可以通过 Prompt 来训练 ChatGPT,从而实现你的想法。

这里介绍一个非常有趣的 Prompt 仓库  Awesome Prompt (https://github.com/f/awesome-chatgpt-prompts),里面收集了很多有趣的 Prompt,相信你一定可以在这里找寻到更多灵感。

另外,一个容易被混淆的概念是“Training”和“Prompt”。

后记

让笔者真正惊讶的是在撰写本文(Markdown)及编写代码示例时,使用的是  VSCode + Github Copilot,无论是中文博文还是源代码,Copilot 都贡献了至少 50% 的文本量。

“人机协同”的时代真的已经到来了吗?

8974e7e64ac34674376546f86159c1ed.gif

“真的已经到”之后的文字为 Copilot 生成,但是笔者仍然保留了最后一句话的权利。

P.S. 好吧,连上面这句话都是 Copilot 生成的……

往期回顾

#

如何使用 TypeScript 开发 React 函数式组件?

#

11 个需要避免的 React 错误用法

#

6 个 Vue3 开发必备的 VSCode 插件

#

3 款非常实用的 Node.js 版本管理工具

#

6 个你必须明白 Vue3 的 ref 和 reactive 问题

#

6 个意想不到的 JavaScript 问题

#

试着换个角度理解低代码平台设计的本质

1cd44a115f9b6dadd6db1630e8ad4612.gif

回复“加群”,一起学习进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9262.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT+小红书爆文,牛!

随着AI技术的不断发展,它已经逐渐渗透到了我们的生活之中,包括内容营销领域。 我们通过AI算法生成文本、优化搜索引擎排名、提高用户体验等,现在AI已逐渐在改变时代的进步,AI也将成为下一个十年的一个变革。我们每个创业者、内容…

ChatGPT留给知乎、小红书的时间不多了

大家好啊,今天我打算给大家整点好活!挑战一下用ChatGPT打入各平台内部。 知乎挑战! 首先了解一下“知乎体” 知乎体是以专业知识为基础,以清晰的条理对问题进行阐述,并解决该问题的文体格式。对于不能明确给出答案的…

ChatGPT专业应用:小红书简介生成

正文共 468 字,阅读大约需要 2 分钟 小红书博主必备技巧,您将在2分钟后获得以下超能力: 自动生成小红书简介 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Alice 编辑者 | Linda ●…

ChatGPT专业应用:小红书tag自动生成

正文共 418字,阅读大约需要 2 分钟 小红书运营人员必备技巧,您将在2分钟后获得以下超能力: 多样tag快速生成 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | 菜菜子 编辑者 | Ra…

如何抓住ChatGPT的热潮,打造小红书爆款

如何抓住ChatGPT的热潮,打造小红书爆款 前两周我看到一个小红书才申请了没多久就已经有好几万的粉丝,于是我让我老婆也赶紧注册一个,毕竟小红书也有着不错的用户群体 那么我们如何通过GPT辅助我们快速创作呢?先来看下ChatGPT的回答…

ChatGPT热度下降,实际落地在慢慢展开

国内创业团队 baichuan-7B 是由百川智能开发的一个开源可商用的大规模预训练语言模型。基于 Transformer 结构,在大约1.2万亿 tokens 上训练的70亿参数模型,支持中英双语,上下文窗口长度为4096。在标准的中文和英文权威 benchmark 上均取得同…

ChatGPT火热之下的冷思考

作为一款基于人工智能的自然语言处理(NLP)​​聊天机器人​​程序,ChatGPT通过大量来自互联网的文本进行训练,并使用深度学习和机器学习算法来理解用户的问题并提供准确的回答。并且,ChatGPT还内置了情感分析、关键字提取和实体识别等功能&am…

文心一言 vs ChatGPT!相同 10 问,结果出乎意料

整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 昨日百度「文心一言」的发布,无疑成为了国内科技圈关注的焦点。不少人看完发布会之后,第一反应就是:求邀请码! 幸运的是,CSDN 编辑团队是「…

12款适合小团队协作、任务管理和进度跟踪的在线任务管理的工具推荐?

国内外12款主流任务管理软件测评: 1.开发任务管理PingCode; 2.多合一项目任务管理Worktile;3.个人和小团队项目任务管理Notion; 4.企业任务管理平台SmartTask; 5.小团队任务管理Teambition;6.IT任务追踪管理Jira等。 无论是做好工作任务管理还是个人任务管理,从来都…

项目计划管理软件:GanttProject

GanttProject是一款免费的项目计划管理软件。 可以导入Microsoft Project的文件,也可以导出。还可以生成jpg图片等的。 对于简单的项目管理来说感觉够用了。最大的好处就是不要钱。呵呵! Gantt chart. Create work breakdown structure, draw dependencies, defi…

如何用Excel制作工作计划,跟踪任务进度,快来学习吧

点赞再看,养成习惯;愚人千虑。必有一得。 微信搜索【亦心Excel】关注这个不一样的自媒体人。 本文 GitHub https://github.com/hugogoos/Excel 已收录,包含Excel系统学习指南系列文章,以及各种Excel资料。 不知你平时上班是否做工…

工作计划进度甘特图.xlsx

作为一名新媒体运营者,与数据打交道可以说是家常便饭。 在工作中,我经常需要对项目进度进行追踪,而在项目追踪中,我常用甘特图来进行追踪,以此来更好的展现工作完成情况的进度。 工作中,如果你列出这样的项…

chatgpt赋能python:Python如何查看地址

Python如何查看地址 在使用Python过程中,常常需要查看变量或者对象的地址以便进行调试和优化。本文将介绍如何在Python中查看地址的方法,并提供一些相关的使用技巧和注意点。 什么是地址 在计算机中,每个变量都会被分配一个(或…

chatGPT引领人工智能第四次浪潮来袭?

第一次人工智能浪潮 第一次人工智能浪潮在1956年,当时在人工智能研讨会上,约翰.麦卡锡提出了“人工智能”的概念,这被认为是人工智能的起源,于是约翰.麦卡锡被称为人工智能之父。 这个阶段产生了很多理论基石,这些不仅成为了人工智能的理论基石,还成为了计算机领域的基…

用 SwiftUI 实现 AI 聊天对话 app - iChatGPT

一、前言 关于 ChatGPT 的话题,大家都不陌生,我们直入话题,因为 ChatGPT 目前限制中国访问服务,所以如果直接使用 ChatGPT 网页进行对话,还是不太方便。通过 ChatGPT SessionToken 就可以不限制网络访问,所…

追赶ChatGPT,我们的差距在哪里?

又一家中国互联网巨头在追赶ChatGPT了。 3月底举行的博鳌亚洲论坛上,腾讯集团高级执行副总裁汤道生披露,腾讯正在研发AIGC以及大模型相关技术,类ChatGPT的对话机器人也在酝酿中。 百度、华为,如今再加上腾讯,ChatGPT出…

AI绘图新玩法「艺术风二维码」保姆级教程分享,注册账号就能玩,一分钟出图,定制自己的二维码!

部分图片有问题…可以看看这里。 大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~ 担任某大厂的算法工程师,带来最新的前沿AI知识和工具,包括AI相关技术、ChatGPT、AI绘图等,欢迎大家交流~。 最近AI绘图…

强力推荐:ChatGPT指令大全指南

担任记者 我想让你做一名记者。您将报道突发新闻,撰写专题报道和评论文章,开发用于验证信息和发现来源的研究技术,遵守新闻道德,并以您自己独特的风格提供准确的报道。我的第一个建议请求是“我需要帮助写一篇关于世界主要城市空气…

谈谈我对证券公司一些部门的理解——前、中、后台(转)

导语:起底金融界从业的主流选择。 作者 | cnfake 来源 | 经管之家(原人大经济论坛) 已经是2013年6月的一篇文章了,作者在文中对证券公司前中后台的各个部门的业务与职能,未来发展前景等方面进行了分析,笔者…

ChatGPT告诉你:项目管理能干到60岁吗?

早上好,我是老原。 这段时间最火的莫过于ChatGPT,从文章创作到论文写作,甚至编程序,简直厉害的不要不要的。 本以为过几天热度就自然消退了,结果是愈演愈烈,热度未减…… 大家也从一开始得玩乐心态&#xf…