现在大模型已经很智能,所以写prompt的必要性正在逐步降低,但是写好prompt,可以让大模型按你的想法或格式得到答案。下面介绍 Prompt 的原则与一些相关的策略:
策略一:使用分隔符清晰地表示输入的不同部分
分隔符可以是:`、 "" 、 <> 、 \<tag><\tag> 、 : 等。
你可以使用任何明显的标点符号将特定的文本部分与提示的其余部分分开,这可以是任何可以使模型明确知道这是一个单独部分
的标记。使用分隔符是一种可以避免提示注入的有用技术,提示注入是指如果用户将某些输入添加到提示中,则可能会向模型提
供与您想要执行的操作相冲突的指令,从而使其遵循冲突的指令而不是执行您想要的操作。即,输入里面可能包含其他指令,会
覆盖掉你的指令。对此,使用分隔符是一个不错的策略。
以下是一个例子,我们给出一段话并要求 GPT 进行总结,在该示例中我们使用 ` 来作为分隔符。
输入:
text = f"""
你应该提供尽可能清晰、具体的指示,以表达你希望模型执行的任务。\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
不要将写清晰的提示与写简短的提示混淆。\
在许多情况下,更长的提示可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。
"""
# 需要总结的文本内容
prompt = f"""
把用三个反引号括起来的文本总结成一句话。
```{text}```
"""
# 指令内容,使用 ``` 来分隔指令和待总结的内容
response = get_completion(prompt)
print(response)
策略二:要求一个结构化的输出
结构化输出可以是 JSON、HTML 等格式。
第二个策略是要求生成一个结构化的输出,这可以使模型的输出更容易被我们解析,例如,你可以在 Python 中将其读入字典或
列表中。
在以下示例中,我们要求 GPT 生成三本书的标题、作者和类别,并要求 GPT 以 JSON 的格式返回给我们,为便于解析,我们
指定了 JSON 的键。
输入:
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"
}
]
}
策略三:提供少量示例
即在要求模型执行实际任务之前,提供给它少量成功执行任务的示例。
例如,在以下的示例中,我们告诉模型其任务是以一致的风格回答问题,并先给它一个孩子和一个祖父之间的对话的例子。孩子
说,“教我耐心”,祖父用这些隐喻回答。因此,由于我们已经告诉模型要以一致的语气回答,现在我们说“教我韧性”,由于模型
已经有了这个少样本示例,它将以类似的语气回答下一个任务。
输入:
prompt = f"""
你的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
"""
response = get_completion(prompt)
print(response)