AI时代来了,还在自己写代码?Prompt Programming你会了吗?
作者: binxiong,腾讯CSIG云产一研发工作室Tech Lead
背景
尤记得每个月“本月全球最流行变成语言”发布的时候, 都会在程序员届掀起腥风血雨, “Java下降了一名, 怎么可能”, “Java又占据榜首, 门槛太低, 写个脚本就算用了吗?”, “C#这种单平台语言也就是闭环生态内的产物了” 言论层出不穷, 大家也都乐此不疲, 已然是以前的流量密码.
然而这一切现在似乎已经悄悄变化了, 现在twitter和reddit上大家开玩笑说现在使用的最多的编程语言, 已经是英语(自然语言)了.
现在GPT已经开启了人工智能狂潮, 在社交圈里, 不聊上两句ChatGPT, 感觉不只是要和时代脱节, 更是已经被开除IT籍了.
我是在2022年12月初的时候开始体验ChatGPT, 一开始向它提一些有趣的问题, 比如“知不知道腾讯云”, “告诉我TCS相关的知识”, 等等. 我相信绝大多数人一开始使用的时候都是如此, 那时候互联网上认为它的功效应该是代替知乎, 让ChatGPT作为问答知识类的平台. 知乎已死的声音甚嚣尘上.
后来大家又发现, 它的很多回答都是胡编乱造的, 比如你问它一些新上映的电影, 它即使不知道也会胡编乱造一通. 大家又开始贬低它, 觉得只不过就是一个普通的聊天机器人, 还是尬聊型选手.
那时候真的读过相关的论文, 介绍的人比较少, 分析的角度还停留在, “中文互联网的内容相对较少”, “英文的内容主题较多, 训练比较庞大, 效果更好” 等等. 认为ChatGPT只能针对已有知识进行总结, 或者是平移.
但是随着使用的人数越来越多, 大家才知道, ChatGPT与语言无关, 你用任何语言去提问, 它都可以很好的理解你的意思. 因为它使用的是语言模型, 而不是具体的某个语言库. 如果还用搜索引擎的“关键词匹配”, “关键词命中”思路去思考人工智能, 就已经显得有些落后了.
这篇文章我想和大家交流一下这4个月以来我的使用感受, 以及它在我的工作中起到的作用.
简介
我现在手头上常用的AI工具大概有3种, 分别是Bing Copilot, ChatGPT, Google Bard.
最广泛使用的ChatGPT(GPT3-5). 我们先来看看它的自我介绍是什么.
ChatGPT(GPT-3.5)
使用频率最高的AI, 有强大的上下文, 还可以拆分成为不同的conversation,便于它处理不同的对话.
比如一个控制台的项目, 可以单独做一个对话, 这样它聊的上下文都是围绕这个主题进行, 每次新的问答也无需补充上下文信息
Bing Copilot (GPT-4)
虽然Bing在很早就使用了GPT-4, 可是因为对话数实在是太少了(从5次扩充到了15次), 每一次对话的内容长度也很有限(截止目前仍只有2000字) 而且不能保存对话上下文, 导致使用起来实在很不方便. 好处就是, 它是实时联网的, 所以我主要用于搜索最新的资讯以及总结一些文章和文档的摘要, 以及辅助ChatGPT使用, 对比一下两遍生成的逻辑是否一致. 优点就是, 搜索结果会给出详细的出处以及引用地址.
Google Bard (LaMDA)
Google近期发布的, 目前只支持英文. 使用起来没有什么特别的用处, 特点算是能够给出多个回答, 而且响应速度很快, 集成了Google it, 点击之后会帮你生成一个最适合你的问题的google搜索关键词, 算是和Bing Copilot反其道而行之, 一个是将chat集成到搜索里, 一个是将搜索集成到了chat中.
基础应用 总结篇:
一门技术我们刚开始接触学习的时候, 难免需要去查看文档. 但是现在的手册非常丰富, 往往对于一个初学者来说, 需要接触的名次实在太多, 而且排版五花八门. 让人学起来云里雾里的.
这时候我们就可以借助ChatGPT的总结能力, 例如我想学习一下K8S得相关知识, 我发给它一个文档的地址, 让它帮我总结. prompt: https://kubernetes.io/zh-cn/docs/concepts/overview/ 总结这篇文档
可以看到它很好的总结了这篇中文文档, 并且对每一个关键点进行的概括, 用最少的语言让你能够搞懂你想要的知识点.
因为ChatGPT是有上下文的, 它知道你需要的内容是中文的总结, 所以在这里你继续发一篇英文的文档给它, 它也会用中文帮你总结. prompt: 总结这篇文档https://kubernetes.io/docs/concepts/overview/components/
大家也都知道, 目前chatgpt的免费版本数据库的截止时间是2021年, 那么也就是说我如果问它比较新的内容, 它都是无法总结的, 甚至是会随意编撰. 比如这里我询问一个关于电影 浏览地球2 的问题, 让它总结一下wikipedia里的介绍. prompt: 总结 https://zh.wikipedia.org/zh/%E6%B5%81%E6%B5%AA%E5%9C%B0%E7%90%832
因为这时候电影还没有上映, 所以之前的内容还都是错误的, 它的总结是不准确的.
这时候我们还可以将整个网站的内容复制进来, 让chatgpt进行总结. 但是这时候我们会发现, 文章太长了, 会收到报错.
这时候, 我们就要运用自己的想象力, 使用prompt来进行突破了. 我们需要把文章进行段落拆分, 每一段都符合它的标准.
我们将内容拆分成7段, 发送完成之后, 它就会自动总结了
这样, 我们就得到了一篇文档的正确总结.
Prompt
看到我这里频繁使用了一个词, 叫做 prompt, 这个在AI时代是一个非常重要的内容.
想要用好这三种效率工具, 我们最好的方法就是不断的提升自己的prompt能力, prompt就是提示词, 表达语言的能力.
在以前的开发生涯中, 我们是“Google工程师”, “StackOverflow工程师”, 被戏称为“面向搜索引擎开发”, 每次遇到未解之谜, 我们通常会去不断的更换搜索关键词, 鄙视链大概是这样的:
使用Google的看不起使用百度的
使用StackOverflow的看不起使用CSDN的
使用英文关键字的看不起使用中文的
但是在AI时代, 我们就需要转换自己的思维了, 我们可以用自然语言(英文/中文/…)进行大量的描述, 比如bing提供了2000字的描述机会, chatgpt提供了上万字的描述机会.
这时候比拼的就是我们的语言表达能力了, 我们需要转换自己的思维, 从工程师到产品经理, 或者是一个Business Analysis的角色, 需要将接到手的任务, 进行拆解, 一步步的变为提示词, 当你拆解到足够细的时候, 任务就自然而然可以依靠AI自动完成了. 这个, 我们会在项目应用的章节进行具体讲解.
项目应用
上文所描述的内容, 可以算是在日常生活中对我们的效率提升, 或者帮助.
那么在我们每天的工作当作, AI如何帮助我们提效?
拆解任务
我们从需求端获取一个需求以后, 很多情况下我们的任务并不能够非常准确的估时, 原因就是我们并没有将任务拆分清楚, 所以并不能够对每一项任务进行估计, 导致风险的发生.
这时候我们可以简要描述一下我们这次的需求点, 让ChatGPT帮我们进行任务拆解.
可以看到我们的任务被拆成了一个个细小的任务, 可以很快的让我们将任务转换为task, 或者是需求跟踪单, 既方便和产品经理进行沟通, 也便于我们自身排期. 转换成KANBAN模式也便于了解当前进度.
如果对方案有疑问的, 我们可以继续询问拆解. 比如我们想要询问第三步应该如何进一步实现. 可以看到它甚至给了我们具体的UI交互. 我们可以利用这样的提示对我们的交互, 以及实现提供一定的参考.
阅读代码/优化代码
我们会经常接手别人的代码, 质量参差不齐, 还会夹在很多奇怪的命名. 这时候如果我们去阅读整个逻辑, 或者去修改这个逻辑, 可能会因为自身阅读的问题造成没有准确的理解这个方法的意思造成bug.
这时候如果我们将这个方法交给AI去阅读, 我们可以看看效果. 这里我使用prompt: 逐行解释下面的代码 + 代码内容, (在这里我使用了一段我在github上面的开源代码进行展示, 这段代码是一段定时器相关的内容)
可以看到ChatGPT正确的理解了我们的代码, 对代码进行了解释和说明.
但是这时候我们只是生成了一个整体的说明, 并没有对每一行分别进行解释. 这时候我们继续和它对话, 使用 prompt: 可以在每一行代码上面加上注释, 便于我理解吗.
这时候它会逐行的进行代码标注, 便于你对每一行进行理解.
如果你接着对它提出一个粗浅的优化需求, 它也会照做.
你可以对某一个部分提出更细节的要求, 才能为它提出更好的优化方向. 在这里我们提出了关于参数顺序耦合的问题, 可以看到GPT也理解到了我们的需求, 并且做出了对应的优化.
代码生成
我们在工作中还有一种场景, 工作量比较大, 需要复杂的逻辑思考, 但是最终的代码可能只需要几行就可以搞定. 你在思考过程中觉得很痛苦, 想和身边的同事去沟通, 你给他解释完这个逻辑以后, 他非但不能帮你思考, 反而将一人份痛苦变成两人份.
比如, 我们要进行数据转换.
我们发送给GPT这样的prompt, 将数据结构进行转换
数据源为:[ { "candidates": null, "candidatesX": null, "deion": "role---用户角色", "label": "角色", "name": "role", "optional": true, "schema": null, "type": "String" },{ "candidates": null, "candidatesX": null, "deion": "Topics of the pulsar server to create---需要创建的主题", "items": { "schema": [ { "candidates": null, "candidatesX": null, "deion": "topic name---主题名称", "label": "主题名称", "name": "name", "schema": null, "type": "String" }, { "candidates": null, "candidatesX": null, "default": 1, "deion": "partition number---分区数", "label": "分区数", "name": "partitions", "schema": null, "type": "Integer", "validator": ">0" } ], "type": "Object" }, "label": "主题列表", "name": "topics", "optional": true, "schema": null, "type": "List" }]我想要得到的数据 是type为List的数据, 并且数据结构为:[{type:List, name:"topics", needValidates:[{ name:"name", type:"String"},{name:"partitions", type:"Integer"}] }]
GPT会为我们得到正确的结果:
我们只需要输入目标数据结构, 转换后的数据结构, 无需指定语言. 因为它会从你的上下文里面理解到你是想要问什么实现方式.
还有执行脚本, 我们只需要描述清楚我们的需求, 它也会帮助我们进行完善.
还会进行解释说明
可以看到, 我们在这里使用了一次“自然语言编程”的操作流程. 不论你是否会使用python, bash, 你都可以正常的描述你的需求. 进行生成.
我们还可以进行代码转换, 比如你写了一段js代码, 你希望将这段代码转化为python, 以前我们会通过Google搜索看看有没有对应的转换器, 现在就只需要交给gpt来执行. 提出你的诉求, 它会在10s内为你生成一段没有bug, 包含异常处理的代码.
生成单测
我们刚刚那段数据转化的代码, 如果我们想要进行测试. 以前我们可能会苦思冥想很多场景进行补充.
现在只需要告诉gpt, 帮我生成单测即可, prompt: (代码内容) 为这段代码生成unit test
如果你觉得测试条件不够, 那就再问它, 让它再生成.
它还会给你解释这里都做了什么操作
*这些测试用例覆盖了不同的场景,包括:当数据源中没有类型为 List 的字段时,应该返回空数组。当数据源中有类型为 List 的字段时,应该返回正确的字段数组,包括需要的验证* 拓展应用
我们刚刚说过了, 这种AI的强大之处有几点
在这里, 我们可以利用它的上下文能力进行一个帮助自己纠正语法, 以及提供更好的prompt的训练.
虽然AI是不挑语言的, 即你用中文/英文, 任何一种语言, 它都是利用数据模型进行分析, 并不是用单一的语言进行思考, 也就是说结果的生成质量不会差异很大.
但是我们通过官网的介绍发现, 它对语言的理解是有差异的, 目前理解力最强的当然是英文了. 我们使用英文进行prompt, 既能锻炼自己的英文能力, 也能更好的表述自己的问题. 可是受限于自身英文水平, 我们并不一定每一次都能清晰表达自己的观点, 这时候我们可以利用chagpt帮我们提高这一点.
使用这样的prmpt:
you need answer my question obey the format, format should be like thiscorrect grammar is :"insert correct grammar here" ________________________________ (keep the diver line)you can also ask it like this:"insert better prompt here"________________________________then tell the answer about what i ask below the divier also keep the diver line.Correct grammar is should correct my question's grammar
我们故意(为自己挽尊)打错一段话, 来测试一下.
因为AI的每一次训练得到的返回结果都是不一样的, 我们有可能会得到自己想要的, 但它也有可能没有完全理解我们的意思. 这时可以看到, 它没有完全理解我们的意思. 我们可以对它进行进一步的训练.
在它做对了以后, 我们对它进行表彰. 然后再去尝试一下我们其它的问题. 可以看到一切正常.
如果有时候它忘记了, 你只需要再提醒它一次, format. 它就会重新输出.
插件系统 AIPRM
它就是一个ChatGPT3.5时代的应用商店, 大家通过不同的prompt, 对它进行训练, 达到自己的目的.
比如我们在文章最开始介绍的“长文总结”能力, 如果我们普通的和它进行交流, 那么字数限制就会成为瓶颈, 但是如果我们转化了沟通技巧, 那么就可以突破这一限制.
AIPRM就是一个充满了奇思妙想的插件系统, 你可以在里面查找/发布各种你想要的prompt.
Voice Control for ChatGPT
因为有了这样的系统, 我们可以使用它锻炼英文(伪需求). 或者是直接用语音和它进行对话, 让它替自己写代码, 比如我们刚刚所有的脚本说明 都可以让它直接语音转文字发出去.
其实这个插件也很好的服务了一些视障人士, 因为它还会读出每一次GPT生成的内容. 让每个人都拥有平等接触AI的机会.
ChatGPT Sidebar
受限于ChatGPT目前还没有在中国大陆提供服务, 那么大家如果想要使用的话就需要一些海外的朋友或者自行留学处理了. 但是并不是人人都拥有这样的条件和机会. 并且ChatGPT的响应速度随着使用的人越来越多, 你的GPT是不是也经常出现session过期的情况?
有时候只不过想问一个简单的问题, 却要等上很久.
这时候, 就可以使用ChatGPT Sidebar插件.
它内置了ChatGPT的API, 可以直接集成在你的搜索引擎里, 你的每一次搜索都会触发(也可以设置为手动), 免注册, 使用方便. 还可以让它提示你如何搜索相关的关键词.
在它的侧边栏里, 我们还可以进行其它的操作
总结
使用ChatGPT这一类的AI工具已经4个来月了. 一开始只是进行简单的尝试, 并没有觉得有什么特别的. 直到我在浏览金融视频的时候, 发现那些以前分享金融知识的人已经开始利用GPT进行代码创作, 来丰富自己的武器库, 进行图标分析, 软件制作 等等. 这一点震撼了我, 让我明白, AI并不是简单的问答而已, 它具有解决问题以及创造知识的能力.
当然我在使用的过程当中, 周围也有很多声音在质疑AI的能力. 认为它并不能如想象的优秀, 比如你直接跟它讲, 给我做个需求, 给我写篇论文, 它都是无法完成的.
因为其实我们在错误的使用AI, 合理的使用, 应该是我们做我们该做的事情, AI做AI该做的事情. 以前有搜索引擎的时代, 我们也并不是直接在搜索框里输入 “给我答案” 吧? 我们也是要尽量描述清楚自己的问题才可以.
现在对程序员的要求, 就不是简单的书写代码了, 因为AI能做, 甚至比你的代码质量还要高(不信可以去试试Github Copilot X).
对我们的要求就变成了, 我们需要将自己的思维进行转换, 从程序员, 变成拥有产品思维的程序员, 拥有BA思维的程序员. 要对自己手里的任务, 方法, 逻辑, 有更清晰的认知. 让人类做人类该做的事情, 让AI做它擅长的事情.
当你把你想要的内容清晰的描述出来以后, 你会发现, AI不是来替代你的, 是来帮助你更好的工作的.