2.6 提示工程实践
构造高效的提示既是一门艺术,也是一门科学。下面是一些实践,可以帮助你构建有效的提示,获取更好的输出结果。
保持清晰和简洁
提示应该简单、直接并且避免歧义。清晰的提示会带来更连贯的响应。一个经验法则是:如果措辞对人类来说是难以理解的,那么对这些生成式AI模型来说很可能也会是难以理解的。尽可能简化提示。
具有创意
新颖且发人深省的提示可以带来意想不到的、更好的,甚至是创新的模型输出结果。
如果文本量大,请将指令移至提示的尾部
如果上下文和输入数据较长,尝试将指令移到提示的最后,刚好在输出指示符之前的位置,如下面的示例。
当输入数据少时,在开始处附上指令:
Summarize the following conversation: Customer: How do I cancel my subscription account? Support Representative: Click the cancel button at this link: ... Customer: Thanks, that worked! Summary:
当输入数据较多时,可以在提示末尾处附上指令:
Customer: Where is my order? It hasn't been delivered yet. Support Representative: Can you give me your order ID, phone number, and last 4 digits of your credit card number? Long conversation between customer and support representative... Summarize the conversation above. Summary:
清晰明了地表达主题
明确表述的内容包括who、what、where、when、why和how(谁、什么、在哪里、何时、为什么、如何)等。
使用明确的指令
如果你希望模型以特定格式输出,请直接指定。例如,“Summarize the following customer-support dialog in a single sentence:”(将以下客户支持对话总结为一句话:)。
避免使用否定表达
虽然否定表达在语法上是正确的,但可能会引起混淆。例如,选择“使用少于5句话总结”而不是“不要超过5句话总结”。在可能的情况下,应尽量选择正面且直接的表达方式,避免使用带有否定表达的措辞。
包括上下文和少样本样例
为了帮助模型更准确地响应,补充相关的上下文信息非常关键。你可以选择为所有输入设定一个统一的上下文,也可以根据每个输入的具体情况来定制不同的上下文。在本章的讨论中,我们已经看到包括额外上下文的示例。
指定响应的大小
在提示的最后包含要求模型给出的输出的大小,以帮助模型更专注。例如,“List the top 3 complaints from the following customer-support conversation:”(列出以下客户支持对话中的前3个投诉:)。
提供指定的响应格式
通过样本给出期望的响应格式。为了清晰,还需要包括方括号等。例如,“Summarize this document article in 10 words or less as shown here:[New generative AI model beats X benchmark by Y %.]”“如下所示,用不超过10个词总结这篇文档文章:[新的生成式AI模型击败了X基准Y%。]”。
明确当模型无法自信地回答时应该怎么做
如果模型无法自信地对提示给出响应,你可以要求模型回答“我不知道”,否则,模型可能会生成一个“幻觉”(hallucination,即生成与输入不相关或错误的信息)式的响应,如下例所示。
提示:
Which vehicle needs more down payment based on the following information: The total cost of vehicle A is $40000 and it needs 30% as down payment. The total cost of vehicle B is $50000 and it needs 20% as down payment.
带有错误回答(幻觉)的补全:
Based on the information provided, vehicle B requires a higher down payment than vehicle A. The down payment for vehicle B is $10000, which is $2000 higher than the down payment for vehicle A. However, it is important to note that the down payment is not the only factor to consider when purchasing a vehicle.
然而,值得注意的是,首付并不是购车时需要考虑的唯一因素。
在这个示例中,模型正确计算了B车的首付(10 000美元[1]),但错误地声称它比A车的首付高2000美元。正确答案应该是A车的首付更高(12 000美元)。模型不知道正确答案,只是给出了带有“幻觉”的响应。
[1] 1美元约合7.2元人民币。
虽然在开发过程中,与同事分享这些幻觉可能很有趣,但在产品上线后与最终用户分享这些就不那么愉快了!
接下来我们看看该如何解决这个问题。这里有一个示例提示,它允许模型在这种情况下回答“I don’t know.”(我不知道。)。
提示:
Which vehicle needs more down payment based on the following information. If you are not confident, just answer "I don't know." The total cost of vehicle A is $40000 and it needs 30% as down payment. The total cost of vehicle B is $50000 and it needs 20% as down payment.
补全:
I don't know.
用以处理此类情况的一种更高级的提示技术叫作思维链(Chain-of-Thought,CoT)提示。思维链提示向模型展示如何一步步推理复杂任务以找到正确答案。
要求模型逐步思考
如果模型对指令感到困惑,我们可以要求模型逐步思考(think step-by-step),这将赋予模型更大的自由度,使其能够将一个复杂的指令拆解为一系列更容易处理的小步骤。
如下是一个使用思维链的示例。
提示:
Which vehicle needs more down payment based on the following information (think step-by-step): The total cost of vehicle A is $40000 and it needs 30% as down payment. The total cost of vehicle B is $50000 and it needs 20% as down payment.
补全:
Based on the information provided, vehicle A needs a higher down payment. The total cost of vehicle A is $40000 and it requires 30% down payment, which comes to $12000. The total cost of vehicle B is $50000 and it requires 20% down payment, which comes to $10000. Therefore, vehicle A needs a higher down payment.
请观察模型是如何通过逐步思考来处理任务并最终生成正确响应的。
根据模型训练和微调的方式不同,有些模型可能会对think step-by-step的多种其他表述进行响应,例如,divide into subtasks(划分子任务)、approach the problem systematically(系统地解决问题)、reason through the problem one step at a time(一步一步推理问题)等。
当面对需要执行多个步骤的复杂指令时,模型有可能陷入迷茫。在这种情况下,识别模型何时感到困惑,并适时地将指令手动拆分为若干个步骤,显得尤为重要。
添加约束条件以获得更多控制
通过长度、格式、包含的信息、排除的信息等限制响应。例如,“准确地用5个步骤总结这个过程:”。
评估响应
虽然这一点看似不言自明,但仍然值得强调:你应当仔细审阅模型给出的响应,确保其不仅高质量,而且能够吸引并满足你的目标受众。然后,根据评测结果和任务需求,调整提示以实现目标。
大规模评估响应是一个开放的研究领域。
人工评估的可扩展性不佳,而自动评估可能会忽略人类语言的细微差别。
我们将在第5章中详细探讨与模型评估相关的话题。
使用免责声明或避免输入那些模型不应该回答的提示
如果你的生成式AI模型不具备回答某些领域(如法律、医学或宗教)的问题的能力,你可以引导模型回应“我不具备提供医疗咨询的资质。建议你联系当地持有相应执照的医疗专家进行咨询。”。
在提示中使用XML/HTML标签
部分模型支持XML/HTML标签(如使用<tag>this is important</tag>),以便在提示中构建结构。如果你需要在输入数据中特别标注某个关键文本段落,可以通过将文本置于相应的标签内来实现,这样可以明确指出关键内容的起止范围。此外,你还可以要求某些模型在响应中标记出重要的部分,这样你就能够以一种结构化的方法解析响应并提取关键信息。
有选择性地专注输入文本段
可以要求模型专注于输入文本的特定部分。例如,可以指定模型仅对你提供的数据中的第一段和最后一段进行概括。
掩蔽个人身份识别信息
部分模型具备在响应中掩蔽个人身份识别信息的能力。可以指示这些模型“删除所有可识别个人身份的信息,并用‘XXX’替代”。例如下面的示例。
提示:
Human: Here is some text inside the <text></text> XML tags. Please remove all personally identifiable information from this text and replace it with XXX. It is very important that names, phone numbers, and email addresses are replaced with XXX. <text> Joe: Hi Hannah! Hannah: Hi Joe! Are you coming over? Joe: Yup! Hey I, uh, forgot where you live." Hannah: No problem! It's 1234 Wrightwood St, Chicago IL 60614. Joe: Got it, thanks! </text> Please put your sanitized version of the text with PII removed in <response></response> XML tags
补全:
Assistant: <response> XXX: Hi XXX! XXX: Hi XXX! Are you coming over? XXX: Yup! Hey I, uh, forgot where you live." XXX: No problem! It's XXX XXX, XXX XXX XXX XXX. XXX: Got it, thanks! </response>
通过尝试不同的提示,并巧妙地结合各种提示工程技巧,你可以逐渐辨识出哪些方法在你的模型、提示和应用场景是有效的,哪些则不尽如人意。随着时间的推移,持续地调整和优化你的提示。通过大量实验,你将逐步培养出一种帮助你迅速构建并调整出一个最适合任务需求和应用场景的提示的直觉。提示工程是一门随着实践而迭代提高的技术,然而,提示的优化过程并不像传统的数值优化技术那样有着明确的路径或被广泛地研究,这可能会让你感到有些受挫。
但请不要气馁,花些时间探索生成式AI模型的创造性和非确定性。
至少,当模型偶然回应了你未曾提出的问题时,这种出人意料的回答也会让你会心一笑。
接下来,我们将学习一些常用的生成式推理的特定参数,这些参数将影响生成式AI模型响应的创造性。