两个基本原则
原则一:编写清晰、具体的指令
策略一L使用分隔符清晰地表示输入的不同部分
可以使用的是:```,“”,<>,,<\tag>等等,我们可以使用任何明显的标点符号将特定的文本部分与提示的其余部分分开。这可以是任何使用模型明确指导这个是一个单独的部分标记。使用分隔符是一种可以避免示注入的有用技术。提示注入是指如果用户将某些输入添加到提示中,则可能会向模型提供想要执行的操作相冲突的指令,从而使其遵循冲突的指令而不是执行想要的操作。即:输入里面可能包含其他指令,会覆盖你的指令。对此,使用分隔符是一个不做的策略。
text = f"""
你应该提供尽可能清晰、具体的指示,以表达你希望模型执行的任务。\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
不要将写清晰的提示与写简短的提示混淆。\
在许多情况下,更长的提示可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。
"""
# 需要总结的文本内容
prompt = f"""
把用三个反引号括起来的文本总结成一句话。
```{
text}```
"""
# 指令内容,使用 ```来分隔指令和待总结的内容
response = get_completion(prompt)
print(response)
# 输出的结果
# 提供清晰具体的指示,避免无关或不正确响应,不要混淆写清晰和写简短,更长的提示可以提供更多清晰度和上下文信息,导致更详细和相关的输出。
策略二:要求一个结构化的输出
使模型的输出更容易被我们了解,可以在python中将其读入字典或列表中。可以输出Jason、HTML等格式。
prompt = f"""
请生成包括书名、作者和类别的三本虚构书籍清单,\
并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)
# 输出结果
# {
"books": [
{
"book_id": 1,
"title": "The Shadow of the Wind",
"author": "Carlos Ruiz Zafón",
"genre": "Mystery"
},
{
"book_id": 2,
"title": "The Name of the Wind",
"author": "Patrick Rothfuss",
"genre": "Fantasy"
},
{
"book_id": 3,
"title": "The Hitchhiker's Guide to the Galaxy",
"author": "Douglas Adams",
"genre": "Science Fiction"
}
]
}
策略三:要求模型检查是否满足条件
如果任务做出的假设不一定满足,我们可以高速模型先检查这些假设,如果不满足,指示并停止执行。我们还可以考虑潜在的边缘情况以及模型应该如何处理他们,以避免意外的错误或结果。
text_1 = f"""
泡一杯茶很容易。首先,需要把水烧开。\
在等待期间,拿一个杯子并把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\
如果你愿意,可以加一些糖或牛奶调味。\
就这样,你可以享受一杯美味的茶了。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ...
第二步 - …
…
第N步 - …
如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{
text_1}\"\"\"
"""
response = get_completion(prompt)
print("Text 1 的总结:")
print(response)
# 结果
"""
Text 1 的总结:
第一步 - 把水烧开。
第二步 - 拿一个杯子并把茶包放进去。
第三步 - 把烧开的水倒在茶包上。
第四步 - 等待几分钟,让茶叶浸泡。
第五步 - 取出茶包。
第六步 - 如果你愿意,可以加一些糖或牛奶调味。
第七步 - 就这样,你可以享受一杯美味的茶了。
"""
策略四:提供少量的示例
在要求模型执行实际操作任务之前,提供给它少量成功执行任务的示例。
prompt = f"""
你的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
"""
response = get_completion(prompt)
print(response)
# 结果
# <祖父母>: 韧性就像是一棵树,它需要经历风吹雨打、寒冬酷暑,才能成长得更加坚强。在生活中,我们也需要经历各种挫折和困难,才能锻炼出韧性。记住,不要轻易放弃,坚持下去,你会发现自己变得更加坚强。
原则二:给模型时间去思考
如果模型匆忙地得出了错误的结论,我们应该尝试重新构思查询,请求模型在提供最终答案之前进行一系列的相关的推理。换句话说,如果模型在短时间或用少量的文字无法完成任务,他可能会给出错误的答案。
策略一:指定完成任务所需要的步骤
我们将通过给定一个复杂任务,给出完成该任务的一系列步骤,来展示策略的效果;
text = f"""
在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
他们一边唱着欢乐的歌,一边往上爬,\
然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
虽然略有些摔伤,但他们还是回到了温馨的家中。\
尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
"""
# example 1
prompt_1 = f"""
执行以下操作:
1-用一句话概括下面用三个反引号括起来的文本。
2-将摘要翻译成法语。
3-在法语摘要中列出每个人名。
4-输出一个 JSON 对象,其中包含以下键:French_summary,num_names。
请用换行符分隔您的答案。
Text:
```{
text}```
"""
response = get_completion(prompt_1)
print("prompt 1:")
print(response)
# 结果
"""
prompt 1:
1-兄妹在山顶井里打水时发生意外,但仍然保持冒险精神。
2-Dans un charmant village, les frère et sœur Jack et Jill partent chercher de l'eau dans un puits au sommet de la montagne. Malheureusement, Jack trébuche sur une pierre et tombe de la montagne, suivi de près par Jill. Bien qu'ils soient légèrement blessés, ils retournent chez eux chaleureusement. Malgré cet accident, leur esprit d'aventure ne diminue pas et ils continuent à explorer joyeusement.
3-Jack, Jill
4-{
"French_summary": "Dans un charmant village, les frère et sœur Jack et Jill partent chercher de l'eau dans un puits au sommet de la montagne. Malheureusement, Jack trébuche sur une pierre et tombe de la montagne, suivi de près par Jill. Bien qu'ils soient légèrement blessés, ils retournent chez eux chaleureusement. Malgré cet accident, leur esprit d'aventure ne diminue pas et ils continuent à explorer joyeusement.",
"num_names": 2
}
"""