参考链接:https://github.com/wsyadc/generative-ai-for-beginners
# 一、什么是提示词工程
提示工程被定义为设计和优化文本输入(提示)以提供一致且高质量响应(完成)的过程,以实现特定的应用目标和模型。提示工程是创建将产生所需结果的提示的过程。 提示工程不仅仅是编写文本提示。提示工程不是一门工程学科,它更像是一组可以应用以获得所需结果的技术。我们可以将其视为一个两步过程:
- 为特定模型和目标设计初始提示
- 迭代地优化提示以提高响应质量
这必然是一个需要用户直觉和努力的试错过程,以获得最佳结果。那么,为什么这很重要?要回答这个问题,我们首先需要理解三个概念:
- Tokenization = 模型如何 “看到” 提示
- Base LLMs = 基础模型如何 “处理” 提示
- Instruction-Tuned LLMs = 模型现在如何看到 “任务”
# 二、为什么我们需要提示词工程
现在我们知道了 LLMs 如何处理提示,让我们谈谈为什么我们需要提示工程。 答案在于,当前的 LLMs 的算法也有许多挑战,如果不及时优化,就很难实现 “可靠且一致的补全”。 例如:
-
== 模型响应是随机的。== 相同的提示可能会针对不同的模型或模型版本产生不同的响应。 甚至可能在不同时间使用相同模型产生不同的结果。 提示工程技术可以通过提供更好帮助我们最大限度地减少这些变化所带来的影响。
-
== 模型可以产生幻觉响应。== 模型是使用大型但有限数据集进行预训练的,这意味着它们缺乏有关训练范围之外的概念的知识。 因此,它们可能会产生不准确、虚构或与已知事实直接矛盾的完成结果。 提示工程技术可以帮助用户识别和减轻幻觉,例如通过向人工智能询问出处或推理过程。
-
== 模型功能会有所不同。 == 较新的模型或模型迭代将具有更丰富的功能,但也会带来独特的怪癖以及成本和复杂性方面的平衡。 提示工程可以帮助我们开发最佳实践和工作流程,以可扩展和无缝的方式消除差异并适应特定于模型的要求。
# 三、提示工程的技巧
简单提示的局限性:简单提示可能无法得到你想要的结果,原因如下:(1)大话题;(2)没有限定输出格式。我们可以使用一些基本技巧来提示 LLM。
# 3.1 Zero-shot prompting (零样本提示)
这种提示风格非常简单,它只有一个提示。当你开始学习 LLM 时,可能就会用到这种方法。下面是一个例子:
- Prompt: “What is Algebra?”
- Answer: “Algebra is a branch of mathematics that studies mathematical symbols and the rules for manipulating these symbols.”
# 3.2 Few-shot prompting (少样本提示)
这种提示方式通过在提出请求的同时提供一些示例来帮助模型。它由单个提示和附加的特定任务数据组成。下面是一个例子:
- Prompt: "以莎士比亚的风格写一首诗。下面是一些莎士比亚十四行诗的例子:十四行诗第 18 首:" 我要把你比作夏日吗?你更可爱,更有节制…' 第 116 首十四行诗:" 让我不要为真正心灵的结合设置障碍。爱不是爱,当它发现改变时就会改变…' 十四行诗第 132 首:“我爱你的眼睛,它们怜悯我,知道你的心在折磨我,对我不屑一顾… 现在,请写一首关于月亮之美的十四行诗。”
- Answer:“在天空中,月亮闪烁着柔和的光芒,散发着温柔的光辉,…”
示例为 LLM 提供了所需输出的背景、格式或风格。它们有助于模型理解具体任务,并生成更准确、更相关的回复。
# 3.3 Chain-of-thought (CoT, 思维链)
链式思维是一种非常有趣的技术,因为它涉及让大型语言模型(LLM)经过一系列步骤。这个想法是以一种方式指导 LLM,使其理解如何完成某项任务。请考虑以下带有和不带链式思维的示例:
- Prompt: “Alice has 5 apples, throws 3 apples, gives 2 to Bob and Bob gives one back, how many apples does Alice have?”
- Answer: 5
LLM 给出的答案为 5,这是不正确的。 根据计算结果 (5 -3 -2 + 1 = 1),正确答案是 1 个苹果。
那么我们怎样才能教 LLM 正确地做到这一点呢?让我们尝试一下思维链。 应用思维链意味着:
给 LLM 一个类似的例子。展示计算结果,以及如何正确计算。提供原始提示。
- Prompt: “Lisa has 7 apples, throws 1 apple, gives 4 apples to Bart and Bart gives one back: 7 -1 = 6 6 -4 = 2 2 +1 = 3
Alice has 5 apples, throws 3 apples, gives 2 to Bob and Bob gives one back, how many apples does Alice have?” - Answer: 1
请注意我们如何用另一个示例、计算和原始提示编写更长的提示,然后得出正确答案 1。正如您所看到的,思维链是一种非常强大的技术。
其他更加丰富的 CoT,如零样本思维链,自洽性等可以参考 https://promptdev.ai/zh-Hans/docs/intermediate/self_consistency。
# 3.4 Generated knowledge (知识生成)
生成的知识方法(Generated Knowledge Approach)1 要求 LLM 在生成响应之前生成与问题相关的可能有用的信息。该方法由两个中间步骤组成,即知识生成和知识集成。
(1)知识生成
在知识生成步骤中,要求 LLM 生成有关问题的一组事实。大语言模型将以 few-shot 方式进行提示,如下所示。使用相同提示生成 M 个不同的完成。
(2)知识集成
接下来,我们生成 “知识增强” 问题,并用它们提示 LLM 获得最终答案。最好的理解方法是通过一个例子来说明。
假设我们正在尝试回答问题 “大多数袋鼠有
-
知识 1:“袋鼠是生活在澳大利亚的有袋动物。”
-
知识 2:“袋鼠是有 5 条肢体的有袋动物。”
现在,我们将每个知识与问题连接起来,生成知识增强的问题:
-
知识增强问题 1:“大多数袋鼠有
肢体。袋鼠是生活在澳大利亚的有袋动物。” -
知识增强问题 2:“大多数袋鼠有
肢体。袋鼠是有 5 条肢体的有袋动物。”
然后,我们用这些知识增强的问题提示 LLM,并获得最终答案的提案:
-
答案 1:“4”
-
答案 2:“5”
我们选择概率最高的答案作为最终答案。最高概率可能是答案令牌的 softmax 概率,或答案令牌的对数概率。
# 3.5 Least to Most (LtM, 从少到多)
从最少到最多提示 (LtM) 1 使 CoT 提示更进一步,首先将问题分解为子问题,然后解决每个问题。这是一种受现实世界儿童教育策略启发的技术。
与 CoT 提示一样,要解决的问题被分解为一组相互构建的子问题。第二步,将这些子问题一一解决。与思维链相反,先前子问题的解决方案被输入到尝试解决下一个问题的提示中。
# 3.6 Self-refine, critique the results (自我完善,质疑结果)
对于生成式人工智能和 LLMs,你不能相信其输出。 你需要验证一下。 毕竟, LLMs 只是向您展示下一个最有可能说的话,而不是正确的内容。 因此,一个好主意是要求 LLMs 自我批评,这引导我们自我完善技术。
其工作原理是按照以下步骤操作:
- 要求 LLM 解决问题的初始提示
- LLM 产生答案
- 质疑答案并要求人工智能改进
- LLM 再次回答,这次考虑了质疑并提出了解决方案
您可以根据需要多次重复此过程。
# 3.7 Maieutic prompting (多维度的提示)
多维度的提示是一种类似于自我完善的技术,但它更多的是要求 LLMs 解释自己。 目标是减少 LLMs 输出不一致,以确保得出正确的答案。 要遵循的工作流程是:
- 请 LLM 回答问题
- 对于答案的每一部分,请 LLM 更深入地解释。
- 如果存在不一致,则丢弃不一致的部分。
重复 2 和 3,直到您完成所有部分并对答案感到满意为止。
# 四、提示的关键要素
在之前的页面中,我们已经讨论了几种不同的提示策略。本页将提供一般建议,这些建议对于提示的实际编写很重要
(1)基本事实的重要性不大
令人惊讶的是,在提示中提供少量 exemplars 时,实际答案 (gold) 并不重要。即使在样本中提供随机标签,性能也几乎不受影响。
(2)标签空间很重要
尽管样本中的黄金标签并不重要,但 labelspace 很重要。即使从标签空间中提供随机标签,也有助于大语言模型更好地理解标签空间并提高结果。此外,正确地在示例中表示标签空间的分布很重要。与在示例中从标签空间中均匀采样不同,最好按照标签的真实分布进行采样。
(3)格式很重要
样本的格式或许是最重要的部分,因为它指示大语言格式如何正确地格式化其对提示的答案。
例如,请考虑以下样本。它们使用全大写的单词作为答案。尽管这些答案完全错误(2+2 不是 50),但 GPT-3 正确地回答了最后一个问题,并按照其他样本的格式进行回答。
2+2等于多少? | |
五十 | |
20+5等于多少? | |
四十三 | |
12+9等于多少? | |
二十一 |
以下是一些值得考虑的良好做法:
- 指定上下文。 上下文很重要,您可以指定的领域、主题等越多越好。
- 限制输出。 如果您想要特定数量的项目或特定长度,请指定。
- 指定内容和方式。 请记住提及您想要什么以及您想要如何实现,例如 “创建一个包含路由产品和客户的 Python Web API,将其分为 3 个文件”。
- 使用模板。 通常,您会希望使用公司的数据来丰富提示。 使用模板来执行此操作。 模板可以包含用实际数据替换的变量。
- 拼写正确。 LLMs 可能会为您提供正确的答案,但如果您拼写正确,您会得到更好的答案。
# 五、DIN-SQL 和 PET-SQL
用于参赛《中兴捧月大赛 - 精言妙喻》,主要参考论文有 DIN-SQL:《DIN-SQL: Decomposed In-Context Learning of Text-to-SQL with Self-Correction》,PET-SQL:《PET-SQL: A Prompt-Enhanced Two-Round Refinement of Text-to-SQL with Cross-consistency》。两篇论文的主要思路如下:
# 六、《中兴捧月大赛 - 精言妙喻》个人初赛代码及思路
具体文件可见 U 盘备份–> 科研文件–>9、第十四届中兴捧月全球精英挑战赛等。