草庐IT

ChatGPT 最佳实践,成为驾驭AI的人

文大侠666 2023-09-27 原文

最近一段时间,互联网最火的莫过于ChatGPT,比尔盖茨更是盛赞ChatGPT的出现堪比当年PC和互联网的诞生。不少人在讨论ChatGPT是否可能淘汰程序员,笔者认为就像历史上马车-汽车/线下店-线上淘宝的转变一样,新技术出现会淘汰很多职业和人,同时也会孕育更多的新职业和机会,对于咱们来说,最重要的是——提升认知,拥抱变化,抓住变革带来的机会,驾驭AI为我所用!

笔者最近一直在研究ChatGPT,作为一个资深开发,尝试把ChatGPT用在开发的各个环节,不得不说,尽管部分场景表现不佳,整体效果是惊人的,这里抛转引玉,让我们一同驾驭AI走进程序开发新时代。

基本认知

本质上ChatGPT包含两方面功能

  • 大量知识的存储,这是大语言模型(LLM)支撑的
  • 基于特定查询的推理,这是监督学习和强化学习赋予的选择能力,返回精确的答案

是不是很像搜索引擎?看看搜索引擎怎么干活

  • 大量知识的查询,基于倒排索引技术将所有页面管理存储
  • 基于特定查询的SQL/NoSQL检索,一般涉及到多个排序流程,返回是按照PageRank排序好的一系列页面

相比搜索引擎的机械存储和排序,ChatGPT的最大优势在于知识的整理和自然语言理解,仿佛整体就是像人一样的神经网络存储和计算。看看Google和微软Bing最近的斗争有多激烈,现在能理解为什么ChatGPT的诞生对搜索引擎是最大挑战了吗?

具体的原理不在这里赘述,顺着上述思路,我们应该看到相比使用Google/Baidu时的查询/高级查询,对于ChatGPT的使用来说,最重要的是设计Prompt(对话前提/上下文提示)。ChatGPT仿佛一个拥有无穷知识的小孩,想要他给出符合我们需求的答案,我们需要按照它能够理解的方式给出提示和结构,指引他向正确的方向推理出结果

Prompt最佳实践

虽然,ChatGPT会尽可能理解你的任意引导(问题),但是一些场景遵循以下实践相对会得出更好的结果,理论上英文Prompt效果更好(语料多),这些考虑国内使用都是中文,效果也不错。

1.简单指令

动作+对象
任务详情

动作+对象和任务详情顺序可以互换,任务详情和指令间换行或者使用括号引号等包裹,指令前可以附加别的辅助词,比如常见的如何/请/怎么等等

2.简单指令+附加条件

动作+对象
任务详情
遵循如下原则/问题背景如下/附加说明:
1.
2.
3.

3.前提/场景/模式设置

得益于大量对话基础数据和in-context learning,ChatGPT支持上下文模式,也就是ChatGPT输出和之前的所有对话内容相关。因此可以在问答前统一设置前提/背景/模式,这也是我们可以教会ChatGPT他不了解的知识和表达方式的原因。

接下来的对话…

统一回答语言

指定回答模式

4.知识训练

ChatGPT当前不是万能的,一方面依赖的基础知识只到2021,另外一些专业领域或者场景并没有学习到足够的知识,回答不能令人满意,但是好在通过上下文对话方式我们可以教会它新的知识

知识训练有两种方式

  1. 直接把知识以对话方式给ChatGPT,ChatGPT自行抽取学习,适合无结构的数据
  2. 按照一定的规则给ChatGPT,比如

接下来的对话,
如果我发送的内容是 {简写} ,我的意思是 {内容}
如果我提到{对象},我指的是{具体描述}
如果…,…

无结构的通用知识训练

继续问,模型会结合已经基础知识和新学习的知识给出回答

专业知识训练

5.交互角色训练

这个知乎上有不少例子,最出名的是

这些都是交互角色训练,一般遵循如下问答模式

我希望你充当/扮演/担任{角色}。
我将{做什么/职责是},你将{做什么/职责是},
当我{做什么},你会{做什么}。

这种方式,很容易伪造一个角色来配合程序开发和测试,比如下面伪造linux命令行

更多的角色扮演请参考

未来展望

当前ChatGPT并不是完美的,就像一个小孩,随着更多的基础知识投喂和更多标注数据的监督/强化学习,只会越来越强,就像一个小孩学会越来越多的知识和技能(套路),目前OpenAPI拿到微软的追加投资,更是锦上添花。
大胆猜想一下:

  • 未来程序员的工作会不会变成AI训练师?
  • 会不会到时候的编程语言变成和AI更好理解的自然语言DSL?

对于程序员来说,赶上这趟时代新列车是有先发优势的,可以做的是

  • 尽快学习ChatGPT构建的相关技术,国内各个大厂都在跟进ChatGPT的开发,可能开启新一轮技术军备竞赛
  • 可以不从事相关工作,但是尽可能理解,就像不是人人都会写个操作系统,但是需要尽可能理解操作系统,开发工作调API即可,学习怎么更好的使用ChatGPT

下一篇文章,笔者带领你探索ChatGPT在软件开发全周期的应用!

参考

ChatGPT提问工程师 – 开发指南
https://github.com/dalinvip/Awesome-ChatGPT
https://github.com/chenweiphd/ChatGPT-Hub

有关ChatGPT 最佳实践,成为驾驭AI的人的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. 亚特兰蒂斯的回声(中文版): chatGPT 的杰作 - 2

    英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古

  4. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  5. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  6. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  7. ruby - 最佳原则中的原则 - 2

    我似乎经常遇到一些设计问题,但我不知道是什么是真的很合适。一方面我经常听到我应该限制耦合和坚持单一职责,但当我这样做时,我常常发现它很困难到在需要时将信息获取到程序的一部分。为了例如,classSingerdefinitialize(name)@name=nameendattr:nameend那么Song应该是:classSongdefnew(singer)@singer=singerendend或classSongdefnew(singer_name)@singer_name=singer_nameendend后者耦合性小,按道理应该用。但如果我以后发现宋有什么需要了解更多歌手,我的

  8. ruby-on-rails - 与 ActiveMerchant 一起使用的最佳支付网关是什么? - 2

    我需要使用ActiveMerchant库在我们的一个Rails应用程序中设置支付解决方案。尽管这个问题非常主观,但人们对主要网关(BrainTree、Authorize.net等)的体验如何?它必须:处理定期付款。有能力记入个人帐户。能够取消付款。有办法存储用户的付款详细信息(例如Authotize.netsCIM)。干杯 最佳答案 ActiveMerchant很棒,但在过去一年左右的时间里,我在使用它时发现了一些问题。首先,虽然某些网关可能会得到“支持”——但并非所有功能都包含在内。查看功能矩阵以确保完全支持您选择的网关-http

  9. ruby - 将 ruby​​ 哈希转换为数组的最佳方法是什么 - 2

    我有一个像这样的ruby​​散列{"stuff_attributes"=>{"1"=>{"foo"=>"bar","baz"=>"quux"},"2"=>{"foo"=>"bar","baz"=>"quux"}}}我想把它变成一个看起来像这样的散列{"stuff_attributes"=>[{"foo"=>"bar","baz"=>"quux"},{"foo"=>"bar","baz"=>"quux"}]}我还需要保留键的数字顺序,并且键的数量是可变的。上面是super简化的,但我在底部包含了一个真实的例子。执行此操作的最佳方法是什么?附言还需要递归就递归而言,这是我们可以假设的:1)

  10. Ruby 最佳实践 : working with classes - 2

    参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin

随机推荐