Prompt Engineering 提示词工程开发指南:九、应用实战(下)
四、应届毕业生职位分类案例研究
Clavié等人(2023)在一个生产系统中提供了一个关于使用prompt工程的中等规模文本分类案例研究。他们使用了一个任务,即对职位进行分类,判断一个工作是否适合最近的毕业生,他们评估了一系列的prompt工程技术,并使用了GPT-3.5(gpt-3.5-turbo)来报告他们的结果。
该研究显示,语言模型优于所有其他测试过的模型,包括DeBERTa-V3中的一个非常强大的基准模型。gpt-3.5-turbo在所有关键指标上也明显优于旧版的GPT3变体,但由于它在遵循模板方面的能力似乎不如其他变体,因此需要进行额外的输出解析。
他们的prompt工程方法的关键发现有:
- 对于像这样不需要专业知识的任务,Few-shot CoT提示在所有实验中都表现不如Zero-shot提示。
- prompt对于引发正确推理的影响是巨大的。仅仅要求模型对给定的工作进行分类的F1分数为65.6,而进行prompt工程的模型可以达到91.7的F1分数。
- 试图强迫模型遵循一个模板会降低所有情况下的准确性表现(这种行为在GPT-4早期的测试中消失,在该论文的后期进行了测试)。
- 许多小的修改对结果有巨大的影响。
下面的表格展示了进行的全部修改。正确地给出指令并重复关键要点似乎是性能最重要的驱动因素。即使是简单地给模型一个(人类的)名字并以此称呼它,也能将F1分数提高0.6个百分点。
请注意,前面的信息是基于引用的内容,我并没有实际的数据库或详细的领域知识。
1、提示词修改术语列表
简称 | 描述 |
---|---|
Baseline | 提供一个工作职位并询问它是否适合毕业生。 |
CoT | 在查询之前,给出几个准确分类的例子。 |
Zero-CoT | 在提供答案之前,请模型逐步地进行推理。 |
rawinst | 通过添加到用户消息中来说明它的角色和任务的指导说明。 |
sysinst | 将关于其角色和任务的指示作为系统消息提供。 |
bothinst | 将角色作为系统消息并将任务作为用户消息的指示进行分割。 |
mock | 通过模拟一个承认任务指示的讨论来给出任务指示。 |
reit | 通过重复关键要素来强调指示中的重要内容。 |
strict | 请要求模型按照给定的模板严格回答。 |
loose | 请要求只根据给定的模板提供最终答案。 |
right | 要求模型得出正确的结论。 |
info | 提供额外的信息以解决常见的推理失误。 |
name | 给模型一个名字,在对话中我们可以用这个名字来指代它。 |
pos | 在向模型提问之前,先给予积极的反馈。 |
2、提示词修改表现评分
精确度 | 召回率 | F1 | 模板粘性 |
---|---|---|---|
Baseline | 61.2 | 70.6 | 65.6 |
CoT | 72.6 | 85.1 | 78.4 |
Zero-CoT | 75.5 | 88.3 | 81.4 |
+rawinst | 80 | 92.4 | 85.8 |
+sysinst | 77.7 | 90.9 | 83.8 |
+bothinst | 81.9 | 93.9 | 87.5 |
+bothinst+mock | 83.3 | 95.1 | 88.8 |
+bothinst+mock+reit | 83.8 | 95.5 | 89.3 |
+bothinst+mock+reit+strict | 79.9 | 93.7 | 86.3 |
+bothinst+mock+reit+loose | 80.5 | 94.8 | 87.1 |
+bothinst+mock+reit+right | 84 | 95.9 | 89.6 |
+bothinst+mock+reit+right+info | 84.9 | 96.5 | 90.3 |
+bothinst+mock+reit+right+info+name | 85.7 | 96.8 | 90.9 |
+bothinst+mock+reit+right+info+name+pos | 86.9 | 97 | 91.7 |
模板粘性指的是模型以期望的格式回答的频率。
五、提示词函数
在将GPT的对话界面与编程语言的Shell进行比较时,封装的提示可以看作是形成一个函数的方式。这个函数有一个唯一的名称,当我们使用输入文本调用这个名称时,它根据内部预设的规则产生结果。简而言之,我们通过一个具有名称的可重复使用的提示来与GPT进行互动变得更加简单。这就像有一个方便的工具,让GPT代表我们执行特定的任务-我们只需要提供输入,就能得到期望的输出。
通过将提示封装成函数,可以创建一系列函数来建立工作流程。每个函数代表一个特定的步骤或任务,当按特定顺序组合在一起时,它们可以自动化复杂的流程或更高效地解决问题。这种方法可以更结构化和流畅地与GPT进行交互,最终提升其能力,使其成为一个强大的工具,可以完成各种任务。
因此,在使用函数之前,我们需要让GPT知道它。下面是定义函数的提示语。
让我们将这个提示称为元提示词。这个提示在GPT3.5上经过了测试,并且在GPT4上表现得更好。
提示词:
你好,ChatGPT!希望你一切都好。我来向你寻求关于一个特定函数的帮助。我了解你有处理信息并根据提供的指令执行各种
任务的能力。为了帮助你更容易地理解我的请求,我将使用一个模板来描述函数、输入和对输入的处理指令。请查看以下详细
信息:
函数名称:[函数名称]
输入:[输入]
规则:[对输入进行处理的指令]
我恳请你根据我提供的详细信息为这个函数提供输出。非常感谢你的帮助。谢谢!
我将用相关信息替换方括号内的文本,以描述我要你执行的函数。这个详细的介绍应该能帮助你更高效地理解我的请求并提供
期望的输出。格式为函数名称(输入)。如果你理解了,请用一个词回答“好”。
1、样例
1)英语学习助手
例如,假设我们想要使用GPT来辅助我们的英语学习。我们可以通过创建一系列函数来简化这个过程。
这个例子已经在GPT3.5上进行了测试,并且在GPT4上表现得更好。
函数说明
我们需要将上述部分中定义的元提示粘贴到GPT的相应部分。
然后,我们将创建一个名为trans_word的函数。这个函数会提示GPT将中文翻译成英语。
提示词:
function_name: [trans_word]
input: ["text"]
rule: [我希望你能担任英语翻译员、拼写纠正和改进者的角色。我将为你提供包括任何语言中的"text"在内的输入
形式,你将检测语言、将其翻译,并用我文本的更正版本用英语回答。]
编写一个函数来扩展文本。
提示词:
function_name: [expand_word]
input: ["text"]
rule: [请担任闲聊助手、拼写纠正器和语言提升者的角色。我会为你提供包括任何语言中的"text"在内的输入形式,
并输出原始语言。我希望你保持意义不变,但使其更加文学化。]
编写一个纠正文本的函数。
提示词:
function_name: [fix_english]
input: ["text"]
rule: [请担任英语大师、拼写纠正器和语言提升者的角色。我会为你提供包括 "text" 在内的输入形式,
我希望你能用更自然和优雅的方式来改进文本的词汇和句子。保持意义不变。]
最后,你可以独立运行这个函数,也可以将它们链式地组合在一起运行。
提示词:
trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山,
世界著名的十大活火山有三座在这里.')
fix_english('Finally, you can run the function independently or chain them together.')
fix_english(expand_word(trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之
国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')))
通过以这种格式表示函数,你可以清楚地看到每个函数的名称、输入和处理输入的规则。这提供了一种有组织的方式来理解工作流程中每个步骤的功能和目的。
提示: 如果你不想让ChatGPT输出过多的信息,你可以在定义函数规则之后简单地添加一句话。
DO NOT SAY THINGS ELSE OK, UNLESS YOU DONT UNDERSTAND THE FUNCTION
2)多参数函数
让我们创建一个函数,通过接受五个输入参数来生成一个密码,并输出生成的密码。
提示词:
function_name: [pg]
input: ["length", "capitalized", "lowercase", "numbers", "special"]
rule: [我希望你扮演一个为需要安全密码的个人生成密码的角色。我会为你提供包括"长度"、
"大写字母"、"小写字母"、"数字"和"特殊字符"在内的输入表单。你的任务是使用这些输入形式
生成一个复杂的密码并提供给我。在你的回答中不要包含任何解释或额外的信息,只需提供生成
的密码即可。例如,如果输入表单为长度=8、大写字母=1、小写字母=5、数字=2、特殊字符=1,
那么你的回答应该是一个像"D5%t9Bgf"这样的密码。]
pg(length = 10, capitalized = 1, lowercase = 5, numbers = 2, special = 1)
pg(10,1,5,2,1)
3)总结
现在已经有很多项目正在开发GPT编程,例如:
GitHub Copilot(https://github.com/features/copilot)
Microsoft AI(https://www.microsoft.com/en-us/ai)
chatgpt-plugins(https://openai.com/blog/chatgpt-plugins)
LangChain(https://github.com/hwchase17/langchain)
marvin(https://github.com/PrefectHQ/marvin)
但是这些项目要么是为产品用户设计的,要么是为能够使用Python或其他编程语言编写代码的用户设计的。对于普通用户来说,可以使用这个简单的模板进行日常工作,并进行多次迭代。使用一个笔记应用程序来记录这个函数的功能,甚至可以将其更新为一个库。另外,还可以使用一些开源的ChatGPT工具,比如ChatGPT-Next-Web(opens in a new tab)、chatbox(opens in a new tab)、PromptAppGPT(opens in a new tab)和ChatGPT-Desktop(opens in a new tab)。目前,ChatGPT-Next-Web允许在初始化新聊天之前添加一些对话。而PromptAppGPT支持基于提示模板进行低代码开发的Web应用程序,并使任何人都能够使用几行提示来开发类似于AutoGPT的应用程序。我们可以利用这个功能来添加我们自己的函数,然后再使用它。
标题:Prompt Engineering 提示词工程开发指南:九、应用实战(下)
作者:michael
地址:https://blog.junxworks.cn/articles/2023/07/25/1690279298260.html