使用提示词的目的

1、获取具体问题的具体结果。

最基础也最简单的目的,就是获取具体问题的具体结果。比如,你问生成对抗模型有什么特点,它就会告诉你生成对抗模型的特点。

2、将提示词固化到程序中,成为系统的一部分。

更难掌握的使用方法,但却是我们编程者的独特优势。比如,你希望你的程序能够自动生成代码,那么你就可以将Prompt固化到程序中,让它成为系统的一部分。这样,当用户输入一个需求时,程序就可以自动生成对应的代码。

使用原则

使用提示词命令的几个原则

编写清晰且具体的指令

通过提供尽可能清洗和具体的指令来表达你希望模型为你执行的任务,引导模型朝希望的输出方向发展,并降低生成无关或错误内容的可能。

提示清晰≠提示简短

如何编写清晰、具体的指令:

  • 多使用分隔符,如三重反引号(```)或双引号(“ “)等能清晰表明这是单独部分的符号,将指令拆分成多个部分,使模型更容易理解。等。
  • 请求结构化输出,要求模型进行结构化的输出也是明确指令的一种方式,例如要求模型以表格形式输出结果,或者要求模型以JSON格式输出结果,这样更方便对输出结果进行保存或后续的处理。实际使用时,也可以考虑给模型一个示例模板,使目标更加明确。
  • 让模型检查条件是否被满足,如果我们使用的命令中包含一些条件,那么我们可以要求模型在输出结果之前检查这些条件是否被满足,例如要求模型在输出结果之前检查用户是否已经登录,或者要求模型在输出结果之前检查用户是否已经完成了某个任务。
  • 少样本提示,也叫few-shot prompting,少样本提示是一种让模型在给定少量示例的情况下执行特定任务的方法。可以有效地引导模型生成符合我们期望的输出。例如,如果我们希望模型生成一个包含特定关键词的句子,我们可以给模型一个包含关键词的句子作为示例,然后要求模型生成一个包含相同关键词的句子。

给予模型思考的时间

  1. 如果模型匆忙思考得出了错误的结论,那么我们可以要求模型在得出结论之前先进行思考并展示推理过程,例如要求模型在得出结论之前先进行推理。
  2. 如果一个任务过于复杂,模型无法在短时间内完成,就考虑给模型更多的思考时间,要求模型在生成结果之前先进行思考。
  • 指导模型完成任务所需的步骤
  • 指导模型制定自己的解决方案

提示词典型构成

  • 角色:给模型定义一个符合任务的角色身份,例如:你是一个前端工程师/你是一个医生。
  • 指示:对要进行的任务的描述,尽量清晰且具体。
  • 上下文:对任务的补充说明,例如:请使用Vue3框架。
  • 示例:必要时给出任务结果的示例,也就是上面提到的few-shot prompting。
  • 输入:任务的输入信息,在提示词中明确标识。
  • 输出:任务输出格式的描述,便于对任务输出结果的保存和后续处理,比如输出为JSON/XML格式。

有论文指出,大模型对提示词开头和结尾的内容更敏感,也就是注意力更强,因此,任务中的一些重要的信息尽量放在开头或者结尾。

提示词调优

如果知道训练数据,参考训练数据构造提示词,针对性地调整提示词。
如果不知道训练数据,尝试能否让模型自己主动告诉我们训练数据。
最后只能不断尝试优化,逐字修改提示词。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import openai
openai.api_key = "sk-xxxxxx"

from dotenv import load_dotenv, find_dotenv
_= load_dotenv(find_dotenv())

openai.api_key = os.getenv("OPENAI_API_KEY")

def generate_prompt(prompt, model="YOUR_MODEL_NAME"):
message = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=message,
temperature=0.9,
max_tokens=3000,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return response.choices[0].message["content"]