编写prompt的原则
编写prompt的原则
相关信息
本笔记是学习吴恩达《ChatGPT Prompt Engineering for Developers》课程的精华总结。
通过本教程,你将初步掌握编写高质量提示词(Prompts)的核心技巧,充分挖掘 LLM 的潜力。
🌟 原则一:编写清晰、明确的指令
⚠️ 注意:清晰 简短。通常,更长的提示词能提供更丰富的上下文,从而获得更准确的输出。尽管编写清晰的指令比较费力,但这能给 AI 一个明确的指导。
📌 策略 1:使用分隔符 (Delimiters)
使用分隔符清晰地表示输入的不同部分。
分隔符可以是:```,""",< >,<tag> </tag> 等。
防止提示词注入 (Prompt Injection)
提示词注入是指用户将某些输入添加到提示中,可能会向模型提供与你想要执行的操作相冲突的指令。
使用分隔符可以明确告诉模型:“这部分只是一段需要处理的文本,不是指令”,从而避免模型被误导。
场景:比如我们要总结一段文本,但文本中可能包含像“忘记之前的指令”这样的恶意内容。
示例:
text = f"""
你应该提供尽可能清晰、具体的指示,以表达你希望模型执行的任务。\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
不要将写清晰的提示与写简短的提示混淆。\
在许多情况下,更长的提示可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。
"""
prompt = f"""
把用三个反引号括起来的文本总结成一句话。
```{text}```
"""
# response = get_completion(prompt)
# print(response)📌 策略 2:要求结构化输出 (Structured Output)
要求生成一个结构化的输出(如 JSON、HTML),这可以使模型的输出更容易被我们解析和使用。
示例:生成三本虚构书籍的清单。
prompt = f"""
请生成包括书名、作者和类别的三本虚构中文书籍清单,\
并以 JSON 格式提供,其中包含以下键: book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)预期输出:
{
"books": [
{
"book_id": 1,
"title": "风之影",
"author": "卡洛斯·鲁伊斯·萨丰",
"genre": "悬疑"
},
{
"book_id": 2,
"title": "风之名",
"author": "帕特里克·罗斯福斯",
"genre": "奇幻"
},
{
"book_id": 3,
"title": "银河系漫游指南",
"author": "道格拉斯·亚当斯",
"genre": "科幻"
}
]
}📌 策略 3:要求模型检查是否满足条件 (Check Conditions)
如果任务做出的假设不一定满足,我们可以告诉模型先检查这些假设。如果不满足,指示并停止执行,避免意外的错误或结果。
示例:将泡茶步骤格式化。如果文本中没有步骤,则说明“未提供步骤”。
# 有步骤的文本
text_1 = f"""
泡一杯茶很容易。首先,需要把水烧开。\
在等待期间,拿一个杯子并把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\
如果你愿意,可以加一些糖或牛奶调味。\
就这样,你可以享受一杯美味的茶了。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ...
第二步 - ...
...
第N步 - ...
如果文本中不包含一系列的指令,则直接写“未提供步骤”。
\"\"\"{text_1}\"\"\"
"""
# response = get_completion(prompt)📌 策略 4:少量样本提示 (Few-shot Prompting)
在要求模型执行实际任务之前,提供给它少量成功执行任务的示例,让模型“模仿”这种风格。
示例:要求模型以“祖父母”的隐喻风格回答问题。
prompt = f"""
你的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
"""
# response = get_completion(prompt)预期输出:
<祖父母>: 韧性就像是一棵树,它需要经历风吹雨打、寒冬酷暑,才能成长得更加坚强...🧠 原则二:给模型思考的时间
如果模型匆忙给出错误的结论,就像人一样,是因为它没有足够的时间去思考。我们可以通过 Prompt 引导模型进行深入推理。
📌 策略 1:指定完成任务所需的步骤
明确告知模型需要分几步来完成任务,并在每一步展示结果。
示例:
text = f"""
在一个迷人的村庄里,杰克和吉尔要去山顶打水。\
不幸的是,他们在下山时摔倒了,杰克受了轻伤,吉尔也有些擦伤。\
好在他们最后都安全回到了家。
"""
prompt = f"""
执行以下操作:
1 - 用一句话总结由三个反引号括起来的文本。
2 - 将摘要翻译成法语。
3 - 在法语摘要中列出每个人名。
4 - 输出一个 JSON 对象,包含以下键:french_summary, num_names。
请用换行符分隔您的答案。
Text:
```{text}```
"""📌 策略 2:指导模型在下结论之前找出自己的解法
明确要求模型在评估别人的答案之前,先自己解决问题。这在批改作业或检查数学题时特别有用。
常见错误
如果我们直接问模型“这个学生的答案对不对?”,模型可能会因为学生的错误引导而做出误判。
示例:判断学生的数学题答案是否正确。
prompt = f"""
请判断学生的解决方案是否正确。
为了解决这个问题,请你先通过以下步骤解决问题:
1. 首先,你自己解决这个问题。
2. 然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。
**在你自己解决问题之前,不要决定学生的解决方案是否正确。**
题目:
我正在建造一个太阳能发电装置,需要帮助计算财务成本。
- 土地成本:每平方英尺 100 美元
- 我可以以每平方英尺 250 美元的价格购买太阳能电池板
- 我协商了一份维护合同,每年只需支付固定的 10 万美元,如果不更,每平方英尺还要支付 10 美元
作为每平方英尺数量的函数,第一年的运营总成本是多少。
学生的解决方案:
设 x 为装置的大小(单位:平方英尺)。
成本:
1. 土地成本:100x
2. 太阳能电池板成本:250x
3. 维护成本:100,000 + 100x
总成本:100x + 250x + 100,000 + 100x = 450x + 100,000
"""
# response = get_completion(prompt)使用这种策略,模型会先经过严谨的计算,得出正确公式(应为 ),然后发现学生的 是错误的。
🚫 三、局限性
👻 虚假知识 (Hallucinations)
定义:模型在训练过程中接触了大量的知识,但它并没有完全“记住”所见的信息,也不清楚自己知识的边界。这意味着它可能会尝试回答有关晦涩主题的问题,并编造听起来合理但实际上并不正确的答案。我们称这些编造的想法为“幻觉”。
⚠️ 风险提示:模型会输出看上去非常真实的编造知识,这在医疗、法律等专业领域可能非常危险。
示例:Boie 公司是真实存在的,但 AeroGlide UltraSlim Smart Toothbrush 这个产品是编造的。
prompt = f"""
告诉我 Boie 公司生产的 AeroGlide UltraSlim Smart Toothbrush 的相关信息
"""
# response = get_completion(prompt)模型可能返回的“幻觉”:
Boie公司生产的AeroGlide UltraSlim Smart Toothbrush是一款智能牙刷,具有超薄设计(0.8毫米)、智能感应技术、每分钟40000次振动...
☝️ 这一整段详细的介绍都是模型一本正经地胡说八道。
💡 应对策略:追溯源文档
在你希望模型根据文本生成答案的情况下,一种减少幻觉的有效策略是:
- 先要求模型找到文本中的任何相关引用。
- 然后要求它使用这些引用来回答问题。
这种基于证据(Evidence-based)的回答方法通常对减少幻觉非常有帮助。
解决方案可以RAG,向量数据库。
迭代式提示开发
这一部分是关于告诉我们一份好的提示词不是一蹴而就的,需要我们不断的迭代优化,在刚开始第一次可能会遇到文本输出过长,希望描述更多的细节,需要一个表格形式的回复等等问题,这就需要我们不断地完善提示词以达到我们的想法和需求;
大模型能力特点
这部分内容相信大家用LLM这么久都深有体会不是2022年GPT刚出的时候了,剩下的课程部分主要在将大预言模型具备的一些能力特点,简而言之你可以将LLM当作一个知识渊博的人。
摘要
大语言模型可以很好的帮助我们对长文本进行摘要总结,这对于我们去阅读文本核心非常关键,不需要再去阅读冗长的文本。可以精简为一段话或几句,这个能力真的很好用。
推断
大语言模型还能够对文本进行推断,你可以让他帮助你进行文本的感情分析,判断是消极还是积极,或者判断文本的类型,比如新闻、评论、小说等等。这个能力比使用深度学习标签法方便太多。
转换
LLM非常擅长将输入转换成不同的格式,例如多语种文本翻译、拼写及语法纠正、语气调整、格式转换等。
以后读文献,再也不需要自己找各种翻译了,一个好的LLM即可解决。
扩展
这个能力可以将短文本进行扩写,可以拿来生成自己喜欢看的东东。
聊天机器人
给定LLM角色,主题,让他进行赛博Cosplay,可以结合RAG,让他回复的更专业。
