Prompt Engineering Guide
文章目录
- Prompt Engineering Guide
- 提示工程简介
- 基本概念
- 包含要素
- 要避免不明确的prompt技术
- 关注做了什么,不要关注不做什么
- 角色提示Role Prompting
- 提示技术
- CoT
- 生成的知识作为预测的知识库判断的一部分
- Prompting Chaining
- ToT思维链
- 检索增强RAG
- Prompt策略分析
- 提示应用
- 所有Prompt性能策略对性能的影响
- 提示函数
- 其它内容
Prompt Engineering Guide
这是对于提示工程的学习笔记,所有的代码以及图片均来自https://www.promptingguide.ai/zh。这里仅记录自己暂时能用到的知识,强烈建议更多内容去该网站学习。
所有内容均不涉及商业活动,如有侵权,请联系我进行删除。
提示工程简介
基本概念
格式并非必须的,大抵有以下几种:
做法1:
<问题>?
<答案>
<问题>?
<答案>
<问题>?
<答案>
<问题>?
----------------------
做法2:
Q: <问题>?
A: <答案>
Q: <问题>?
A: <答案>
Q: <问题>?
A: <答案>
Q: <问题>?
A:
----------------------
做法3:
This is awesome! // Positive
This is bad! // Negative
Wow that movie was rad! // Positive
What a horrible show! //
当然指令没有包含,这只是说输入指令和输出指令的格式。一个prompt最好包含下面说的4种要素,尤其是我们要涉及的数据与内容时。
包含要素
指令、上下文、输入数据、输出指令。但是并不要求所有都必须的。
不存在什么特定的词元(tokens)或关键词(tokens)能确定带来更好的结果。更重要的是要有一个具有良好格式和描述性的提示词。事实上,在提示中提供示例对于获得特定格式的期望输出非常有效。
提示:
提取以下文本中的地名。
所需格式:
地点:<逗号分隔的公司名称列表>
输入:“虽然这些发展对研究人员来说是令人鼓舞的,但仍有许多谜团。里斯本未知的香帕利莫德中心的神经免疫学家 Henrique Veiga-Fernandes 说:“我们经常在大脑和我们在周围看到的效果之间有一个黑匣子。”“如果我们想在治疗背景下使用它,我们实际上需要了解机制。””
输出:
地点:里斯本,香帕利莫德中心
要避免不明确的prompt技术
不好的举例:
解释提示工程的概念。保持解释简短,只有几句话,不要过于描述。
好的举例:
使用 2-3 句话向高中学生解释提示工程的概念。
关注做了什么,不要关注不做什么
设计提示时的另一个常见技巧是避免说不要做什么,而应该说要做什么。这样(说要做什么)更加的具体,并且聚焦于(有利于模型生成良好回复的)细节上。
提示:
以下是向客户推荐电影的代理程序。不要询问兴趣。不要询问个人信息。
客户:请根据我的兴趣推荐电影。
代理:
输出:
当然,我可以根据你的兴趣推荐电影。你想看什么类型的电影?你喜欢动作片、喜剧片、爱情片还是其他类型的电影?
这种输入其实不算一个好的输出,更好的方式是关注输出什么,并对特殊的情况进行预先设定。例如:
提示:
以下是向客户推荐电影的代理程序。代理负责从全球热门电影中推荐电影。它应该避免询问用户的偏好并避免询问个人信息。如果代理没有电影推荐,它应该回答“抱歉,今天找不到电影推荐。”。
```顾客:请根据我的兴趣推荐一部电影。
客服:
输出:
抱歉,我没有关于你兴趣的任何信息。不过,这是目前全球热门的电影列表:[电影列表]。希望你能找到喜欢的电影!
角色提示Role Prompting
可以假定身份,假定答案的专业性等等。
提问:
The following is a conversation with an AI research assistant. The assistant answers should be easy to understand even by primary school students.
Human: Hello, who are you?
AI: Greeting! I am an AI research assistant. How can I help you today?
Human: Can you tell me about the creation of black holes?
AI:
提示技术
零样本、少样本都不适合我们的模型。
CoT
在实例中,使用CoT。在回答中,加入零样本CoT,效果会更好?
生成的知识作为预测的知识库判断的一部分
Prompting Chaining
之前的输出作为下一个输入的一部分:
提示1:
你是一个很有帮助的助手。你的任务是根据文档回答问题。第一步是从文档中提取与问题相关的引文,由####分隔。请使用<quotes></quotes>输出引文列表。如果没有找到相关引文,请回应“未找到相关引文!”。
####
{{文档}}
####
输出1:
<quotes>
- Chain-of-thought (CoT) prompting[27]
- Generated knowledge prompting[37]
- Least-to-most prompting[38]
- Self-consistency decoding[39]
- Complexity-based prompting[41]
- Self-refine[42]
- Tree-of-thought prompting[43]
- Maieutic prompting[45]
- Directional-stimulus prompting[46]
- Textual inversion and embeddings[59]
- Using gradient descent to search for prompts[61][62][63][64]
- Prompt injection[65][66][67]
</quotes>
提示2:
根据从文档中提取的相关引文(由<quotes></quotes>分隔)和原始文档(由####分隔),请构建对问题的回答。请确保答案准确、语气友好且有帮助。
####
{{文档}}
####
<quotes>
- Chain-of-thought (CoT) prompting[27]
- Generated knowledge prompting[37]
- Least-to-most prompting[38]
- Self-consistency decoding[39]
- Complexity-based prompting[41]
- Self-refine[42]
- Tree-of-thought prompting[43]
- Maieutic prompting[45]
- Directional-stimulus prompting[46]
- Textual inversion and embeddings[59]
- Using gradient descent to search for prompts[61][62][63][64]
- Prompt injection[65][66][67]
</quotes>
输出2:
文档中提到的提示技术包括:
1. Chain-of-thought (CoT) prompting[27]
2. Generated knowledge prompting[37]
3. Least-to-most prompting[38]
4. Self-consistency decoding[39]
5. Complexity-based prompting[41]
6. Self-refine[42]
7. Tree-of-thought prompting[43]
8. Maieutic prompting[45]
9. Directional-stimulus prompting[46]
10. Textual inversion and embeddings[59]
11. Using gradient descent to search for prompts[61][62][63][64]
12. Prompt injection[65][66][67]
每一种技术都采用独特的策略来增强或明确与大型语言模型的互动,以产生期望的结果。
ToT思维链
ToT 完成算 24 的游戏任务要执行广度优先搜索(BFS),每步思维的候选项都要求 LM 给出能否得到 24 的评估:“sure/maybe/impossible”(一定能/可能/不可能) 。作者讲到:“目的是得到经过少量向前尝试就可以验证正确(sure)的局部解,基于‘太大/太小’的常识消除那些不可能(impossible)的局部解,其余的局部解作为‘maybe’保留。”每步思维都要抽样得到 3 个评估结果。整个过程如下图所示:
现在有思维树的提示方式,有论文支持
检索增强RAG
最初的RAG不太行了。现在长文本越来越长了。微软出了一个新的叫做GraphRAG,如果用的上可以再去查一查。
Prompt策略分析
不同的策略影响是非常大的。有进行的测试。
Short name | Description |
---|---|
Baseline | 提供一个职位招聘信息并询问它是否适合毕业生。 |
CoT | 在查询之前给出几个准确分类的示例。 |
Zero-CoT | 要求模型一步步推理后再给出答案。 |
rawinst | 通过添加到用户消息中, 来给出有关其角色和任务的说明。 |
sysinst | 作为系统消息给出有关其角色和任务的说明。 |
bothinst | 将角色作为系统消息和任务作为用户消息拆分说明。 |
mock | 通过模拟讨论来给出任务说明,其中模型确认了它们。 |
reit | 通过重复强调关键要素来加强说明。 |
strict | 要求模型严格按照给定模板回答。 |
loose | 要求仅根据给定模板给出最终答案。 |
right | 要求模型得出正确的结论。 |
info | 提供额外的信息以解决常见的推理失败。 |
name | 为模型取一个我们在对话中称呼它的名称。 |
pos | 在查询之前向模型提供正面反馈。 |
提示应用
所有Prompt性能策略对性能的影响
Precision | Recall | F1 | Template Stickiness | |
---|---|---|---|---|
Baseline | 61.2 | 70.6 | 65.6 | 79% |
CoT | 72.6 | 85.1 | 78.4 | 87% |
Zero-CoT | 75.5 | 88.3 | 81.4 | 65% |
+rawinst | 80 | 92.4 | 85.8 | 68% |
+sysinst | 77.7 | 90.9 | 83.8 | 69% |
+bothinst | 81.9 | 93.9 | 87.5 | 71% |
+bothinst+mock | 83.3 | 95.1 | 88.8 | 74% |
+bothinst+mock+reit | 83.8 | 95.5 | 89.3 | 75% |
+bothinst+mock+reit+strict | 79.9 | 93.7 | 86.3 | 98% |
+bothinst+mock+reit+loose | 80.5 | 94.8 | 87.1 | 95% |
+bothinst+mock+reit+right | 84 | 95.9 | 89.6 | 77% |
+bothinst+mock+reit+right+info | 84.9 | 96.5 | 90.3 | 77% |
+bothinst+mock+reit+right+info+name | 85.7 | 96.8 | 90.9 | 79% |
+bothinst+mock+reit+right+info+name+pos | 86.9 | 97 | 91.7 | 81% |
“Template stickiness” 指的是模型多频繁地按照所期望的格式作答。
提示函数
这个函数有一个独特的名称,当我们用输入文本调用这个名称时,它根据内部设定的规则产生结果。简而言之,我们构建了一个可重用的提示,它有一个易于与 GPT 交互的名称。这就像有一个方便的工具,让 GPT 代表我们执行特定的任务 - 我们只需提供输入,就可以得到所需的输出。
通过将提示封装成函数,您可以创建一系列函数来建立工作流程。每个函数代表一个特定的步骤或任务,当按特定顺序组合时,它们可以自动化复杂的流程或更高效地解决问题。这种方法使得与 GPT 的交互更加结构化和高效,最终增强了其功能,使其成为完成各种任务的强大工具。
效果:
你好,ChatGPT!希望你一切都好。我正在寻求你的帮助,想要解决一个特定的功能。我知道你有处理信息和执行各种任务的能力,这是基于提供的指示。为了帮助你更容易地理解我的请求,我将使用一个模板来描述函数、输入和对输入的处理方法。请在下面找到详细信息:
function_name:[函数名称]
input:[输入]
rule:[关于如何处理输入的说明]
我恳请你根据我提供的细节为这个函数提供输出。非常感谢你的帮助。谢谢!
我将使用方括号内的相关信息替换函数所需执行的内容。这个详细的介绍应该能够帮助你更高效地理解我的请求并提供所需的输出。格式是function_name(input)。如果你理解了,请用一个词回答"好的"
然后在输入:
function_name: [trans_word]
input: ["文本"]
rule: [我希望你能扮演英文翻译员、拼写纠正员和改进员的角色。我将提供包含任何语言中"文本"的输入形式,你将检测语言,翻译并用英文纠正我的文本,并给出答案。]
function_name: [expand_word]
input: ["文本"]
rule: [请充当一个聊天机器人、拼写纠正员和语言增强员。我将提供包含任何语言中的"文本"的输入形式,并输出原始语言。我希望你保持意思不变,但使其更具文学性。]
function_name: [fix_english]
input: ["文本"]
rule: [请充当英文专家、拼写纠正员和语言增强员的角色。我将提供包含"文本"的输入形式,我希望你能改进文本的词汇和句子,使其更自然、更优雅。保持意思不变。]
除非你不理解该函数,否则请不要说其他事情
接下来进行提问:
trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')
fix_english('Finally, you can run the function independently or chain them together.')
fix_english(expand_word(trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')))
输出的结果:
trans_word Output: Mount Bromo is located in Indonesia, known as the “Land of a Thousand Islands”. Indonesia, with its numerous islands, boasts over 4,500 volcanoes, including three of the world’s ten most famous active volcanoes.
fix_english Output for ‘Finally, you can run the function independently or chain them together.’: Ultimately, you have the option to execute the function on its own or link multiple functions together in a sequence.
fix_english Output for the expanded and translated input: Ultimately, you can choose to execute the function independently or combine them sequentially.
其它内容
还有挺多的内容的,但是暂时用不上了。如果想去的话,可以去https://www.promptingguide.ai/zh学习