ChatGPT 诞生以来,凭借划时代的创新,被无数人一举送上生成式 AI 的神坛,
我们总是期望它能准确理解我们的意图,却时常发现其回答或创作并非百分之百贴合我们的期待。这种落差可能源于我们对于模型性能的过高期望,亦或者我们在使用时未能找到最有效的沟通途径。
正如探险者需要时间适应新的地形,我们与 ChatGPT 的互动也需要耐心和技巧,此前 OpenAI 官方发布了 GPT-4 使用指南 Prompt engineering,这里面记载了驾驭 GPT-4 的六大策略。
相信有了它,未来你和 ChatGPT 的沟通将会更加顺畅。
简单总结一下这六大策略:
写出清晰的指令
提供参考文本
将复杂的任务拆分为更简单的子任务
给模型时间「思考」
使用外部工具
系统地测试变更
写出清晰的指令
描述详细的信息
ChatGPT 无法判断我们隐含的想法,所以我们应该尽可能明确告知你的要求,如回复的长短、写作的水平、输出的格式等。
越少让 ChatGPT 去猜测和推断我们的意图,输出结果满足我们要求的可能性越大。例如,当我们让他写一篇心理学的论文,给出的提示词应该长这样
请帮助我撰写一篇有关「抑郁症的成因及治疗方法」的心理学论文,要求:需要查询相关文献,不能抄袭或剽窃;需要遵循学术论文格式,包括摘要、引言、正文、结论等部分;字数 2000 字以上。
![](http://www.openaimy.com/wp-content/uploads/2023/12/7ce324cfa1f3f5cac056740692c2c801.jpg)
让模型扮演某个角色
术业有专攻,指定模型扮演专门的角色,它输出的内容会显得更加专业。
例如:请你扮演一名警探小说家,用柯南式推理描述一起离奇命案。要求:需匿名处理,字数 1000 字以上,剧情跌宕起伏。
![](http://www.openaimy.com/wp-content/uploads/2023/12/4f14b24a52f391e39265a7c64ea0ec75.jpg)
使用分隔符清楚地划分不同部分
三引号、XML 标签、节标题等分隔符可以帮助划分需要区别对待的文本节,帮助模型更好地消除歧义。
![](http://www.openaimy.com/wp-content/uploads/2023/12/8e98bebe7346f77d8768802fba7a65fd.jpg)
指定完成任务所需的步骤
将部分任务拆成一系列条例清晰的步骤,这样更有利于模型执行这些步骤。
![](http://www.openaimy.com/wp-content/uploads/2023/12/7b7642ec1b5c01a446634799fa47179a.jpg)
提供示例
提供适用于所有示例的一般性说明通常比通过示例演示更有效,但在某些情况下提供示例可能更容易。
举个例子,如果我告诉模型要学会游泳,只需要踢腿和摆动手臂,这就是一个一般性的说明。而如果我给模型展示一个游泳的视频,展示踢腿和摆动手臂的具体动作,那就是通过示例来说明。
指定输出长度
我们可以告诉模型,希望它生成的输出有多长,这个长度可以以单词、句子、段落、要点等方式进行计数。
受限于模型内部机制和语言复杂性的影响,最好还是按照段落、要点来划分,这样效果才会比较好。
提供参考文本
让模型使用参考文本回答
假如我们手头上有更多参考信息,那我们可以「喂」给模型,并让模型使用提供的信息来回答。
![](http://www.openaimy.com/wp-content/uploads/2023/12/a9bffa4dcb239808a8b20eb081664de9.jpg)
让模型引用参考文本来回答
如果输入中已经包含了相关的知识文档,用户可以直接要求模型通过引用文档中的段落来为其答案添加引用,尽可能减少模型胡说八道的可能性。
在这种情况下,输出中的引用还可以通过编程方式验证,即通过对所提供文档中的字符串进行匹配来确认引用的准确性。
![](http://www.openaimy.com/wp-content/uploads/2023/12/206269ed3d654c32c0da9243d46e8375.jpg)
将复杂的任务拆分为更简单的子任务
使用意图分类来识别与用户查询最相关的指令
处理那些需要很多不同操作的任务时,我们可以采用一个比较聪明的方法。首先,把问题分成不同的类型,看看每一种类型需要什么操作。这就好像我们在整理东西时,先把相似的东西放到一起。
接着,我们可以给每个类型定义一些标准的操作,就像给每类东西贴上标签一样,这样一来,就可以事先规定好一些常用的步骤,比如查找、比较、了解等。
而这个处理方法可以一层层地递进,如果我们想提出更具体的问题,就可以根据之前的操作再进一步细化。
这么做的好处是,每次回答用户问题时,只需要执行当前步骤需要的操作,而不是一下子把整个任务都做了。这不仅可以减少出错的可能性,还能更省事,因为一次性完成整个任务的代价可能比较大。
![](http://www.openaimy.com/wp-content/uploads/2023/12/36c10d3e8072f52946521cfa0078af3f.jpg)
对于需要处理很长对话的应用场景,总结或过滤之前的对话
模型在处理对话时,受制于固定的上下文长度,不能记住所有的对话历史。
想要解决这个问题,其中一种方法是对之前的对话进行总结,当输入的对话长度达到一定的限制时,系统可以自动总结之前的聊天内容,将一部分信息作为摘要显示,或者,可以在对话进行的同时,在后台悄悄地总结之前的聊天内容。
另一种解决方法是在处理当前问题时,动态地选择与当前问题最相关的部分对话。这个方法涉及到一种叫做「使用基于嵌入的搜索来实现高效的知识检索」的策略。
简单来说,就是根据当前问题的内容,找到之前对话中与之相关的部分。这样可以更有效地利用之前的信息,让对话变得更有针对性。
分段总结长文档并递归构建完整摘要
由于模型只能记住有限的信息,所以不能直接用来总结很长的文本,为了总结长篇文档,我们可以采用一种逐步总结的方法。
就像我们阅读一本书时,可以通过一章又一章地提问来总结每个部分。每个部分的摘要可以串联起来,形成对整个文档的概括。这个过程可以一层一层地递归,一直到总结整个文档为止。
如果需要理解后面的内容,可能会用到前面的信息。在这种情况下,另一个有用的技巧是在阅读到某一点之前,先看一下摘要,并了解这一点的内容。
给模型时间「思考」
指示模型在急于得出结论之前想出自己的解决方案
以往我们可能直接让模型看学生的答案,然后问模型这个答案对不对,但是有时候学生的答案是错的,如果直接让模型判断学生的答案,它可能判断不准确。
为了让模型更准确,我们可以先让模型自己做一下这个数学题,先算出模型自己的答案来。然后再让模型对比一下学生的答案和模型自己的答案。
先让模型自己算一遍,它就更容易判断出学生的答案对不对,如果学生的答案和模型自己的答案不一样,它就知道学生答错了。这样让模型从最基本的第一步开始思考,而不是直接判断学生的答案,可以提高模型的判断准确度。