跳到主要内容

5.1.2. Prompt 技巧

接下来我们来看看目前 ChatGPT 使用上的一些常见的技巧,如果你想在看具体技巧前就理解这些技巧的原理,可以先阅读后面的内容,读完所有进阶知识后你会对这些技巧有更深的理解。

技巧一:角色扮演

有的时候,我们想要让 ChatGPT 在一个更聚焦的语境下回答问题,那么这就是一个使用「角色扮演」技巧的好时候。

例如,如果我们直接问 ChatGPT:人活着的意义是什么?

它会告诉我们:

这是一个非常基本和重要的问题,但也是一个没有标准答案的问题,因为人们对于生命意义的理解会随着文化、宗教、哲学等因素的不同而有所不同。以下是一些可能的观点:
- 宗教观点:很多宗教都认为人的存在是出于神的意愿,我们的存在是为了履行神赋予我们的任务、遵守神的教义和追求精神上的满足。例如,基督教认为人的存在是为了爱上帝和爱邻舍;伊斯兰教认为人的存在是为了崇拜真主和完成真主赋予的任务;佛教认为人的存在是为了消除痛苦和追求解脱。
- 哲学观点:一些哲学家认为人的存在是为了追求真理、美和善良,实现自我实现和自我超越。例如,亚里士多德认为人的意义在于追求幸福和实现自己的潜能;尼采认为人的意义在于自我超越和创造。
- 科学观点:从科学角度来看,人的存在可以被看作是自然进化的结果,我们的存在是为了适应环境和生存。同时,人类也有责任维护和保护我们所居住的星球和生态环境。
总的来说,人类存在的意义是一个非常复杂和多维的问题,不同的人有不同的看法。重要的是,每个人都应该寻找自己的生命意义并努力去实现它。

但当我们加入了「角色扮演」后提出问题:请扮演一个哲学老师,告诉我,人活着的意义是什么?

它说:

好的,作为一个哲学老师,我会给你一些思考人活着意义的启示,但我也会让你自己思考并形成自己的看法。

首先,我想强调的是,人的存在本身并没有固定的意义,生命的意义是一个主观的问题,每个人都需要在自己的经验和思考中找到答案。因此,人类存在的意义不是一个确定的答案,而是我们在生活中不断探索和建构的一个过程。
其次,一些哲学家提出过各种对于生命意义的看法。例如,苏格拉底认为人的存在意义在于不断地追寻真理和智慧,康德则认为人的存在意义在于理性和自由的追求。尼采则认为人的存在意义在于超越自己,达到更高的境界。
另外,还有一些哲学家认为,人类存在的意义可能是没有固定的答案,而是需要不断地创造。例如,马克思主义认为人的存在意义是为了创造更好的社会和人类命运的解放。
最后,我想说的是,寻找生命意义并不是一件容易的事情,我们需要不断地思考、探索和实践。我们可以从我们的价值观、兴趣爱好、人际关系、个人成就等方面寻找意义,也可以从信仰、哲学、文化、社会等多个层面进行思考。

在这个过程中,重要的是保持开放、好奇和包容的心态,接受自己的不确定性和矛盾,以及对于生命中的不同体验进行反思和思考。最终,我们可以通过探索和实践,逐渐找到自己生命的意义,并尽力去实现它。

可以看到,ChatGPT 的答案会更多地从「哲学老师」的角色出发来回答我们的问题。

「扮演某个角色」这个句子也是我们更便捷地给到 ChatGPT 背景信息元素(元素部分内容详见 5.1.1

以及,我们在网上看到的那些 ChatGPT 模仿某个名人的产品或者对话,有的也是使用了这个技巧:请扮演 Steve Jobs(另一种方法是使用 LangChain 等工具,详见 5.2)

技巧二:增加示例

有的时候,我们难以用语言清晰地表达我们的指令,或者希望更快更准确地 Prompt,这时候可能就是「增加示例」的好时机。

例如,我们想要提取某一段话里的所有地名并以特定格式输出:

请提取文本中的所有省市,并以【省份】:【市】的格式输出。
文本:黄河流域十大城市,平均GDP5570亿元,仅有郑州市过万亿,5000亿以上只有4个城市,洛阳市刚刚超过5000亿的水平,共有新一线城市2座,郑州市和西安市,二线城市3座,济南市、太原市、兰州市,其余5座城市均为三四线城市。 而长江流域拥有内河航运优势,长江黄金水道的加持,使长江沿岸诞生了数个超大城市。

ChatGPT 输出:

河南省:郑州市、洛阳市
陕西省:西安市
山东省:济南市
山西省:太原市
甘肃省:兰州市

但如果我们不想要「省」、「市」这样的字眼,也不想要同一行内出现多个市,那么加入一个例子可以方便很多:

请提取任务文本中的所有省市

文本:长江沿江包含了上海市、南京市、武汉市等特大城市,而如果算上支流,还有荆州市等一众二线城市。
输出:
上海:上海;
江苏:南京;
湖北:武汉;
湖北:荆州;

任务文本:黄河流域十大城市,平均GDP5570亿元,仅有郑州市过万亿,5000亿以上只有4个城市,洛阳市刚刚超过5000亿的水平,共有新一线城市2座,郑州市和西安市,二线城市3座,济南市、太原市、兰州市,其余5座城市均为三四线城市。 而长江流域拥有内河航运优势,长江黄金水道的加持,使长江沿岸诞生了数个超大城市。
输出:

并不需要额外的格式说明,ChatGPT 很好地完成了我们的任务:

河南:郑州;
河南:洛阳
陕西:西安;
山东:济南;
山西:太原;
甘肃:兰州;

值得注意的是,如果你不是在使用 Playground 而是直接使用对话框,请注意 ChatGPT 会有上下文记忆,如果需要重试当前任务,请编辑原先的 Prompt 再次运行,而不是再给它发一条新的。

这里有点像你在跟一个朋友阐述一个概念,抽象的解释可能并不能很好地传达你的意思,那么你只需要给他举一个例子,他也许就能很快理解。

技巧二的具体原理请见 5.1.3 Zero/Few-shot-prompting

技巧三:明确格式

如果我们更关注格式,也可以直接在文本中明确格式,ChatGPT 使用的是 MarkDown 格式。(如果有不熟悉的读者可以参考本文末的 MarkDown 相关教程链接)

例如:

Extract the important entities mentioned in the text below. First extract all company names, then extract all people names, then extract specific topics which fit the content and finally extract general overarching themes

Desired format:
Company names: <comma_separated_list_of_company_names>
People names: -||-
Specific topics: -||-
General themes: -||-

Text: {text}

技巧四:使用分割符号

如果我们的输入中包含了较多的元素和文本,我们可以将指令放在提示的开头,用##或""来分隔指令和上下文:

请提取任务文本中的所有省市

文本:'''长江沿江包含了上海市、南京市、武汉市等特大城市,而如果算上支流,还有荆州市等一众二线城市。'''
输出:
上海:上海;
江苏:南京;
湖北:武汉;
湖北:荆州;

任务文本:'''黄河流域十大城市,平均GDP5570亿元,仅有郑州市过万亿,5000亿以上只有4个城市,洛阳市刚刚超过5000亿的水平,共有新一线城市2座,郑州市和西安市,二线城市3座,济南市、太原市、兰州市,其余5座城市均为三四线城市。 而长江流域拥有内河航运优势,长江黄金水道的加持,使长江沿岸诞生了数个超大城市。'''
输出:

技巧五:Let's think step by step

当我们需要 ChatGPT 进行相对较复杂的推理任务时,就是使用这个技巧的时候。

这里应用了 Zero-shot chain-of-thought Prompting,详情请见5.1.4 Chain-of-Thought Prompting

经过作者的测试,即使我们使用的是中文,也可以直接在文末加上这句Let's think step by step,ChatGPT 的表现明显会更好。

例如

假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。
Let's think step by step。

可以让 ChatGPT 正确地推理并得出正确答案,而:

假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。

不行。

更多阅读:

Best practices for prompt engineering with OpenAI API

Markdown指南中文版