原文:我是如何赢得GPT-4提示工程大赛冠军的
原文的原文: How I Won Singapore’s GPT-4 Prompt Engineering Competition
!!本内容仅适用
于具有 System Prompt(系统提示)
功能的 LLM。具有这一功能的最著名 LLM 是 ChatGPT。
1. 与 System Prompts 有关的术语
对于 ChatGPT,有大量资源使用 System Prompts
、System Messages
和 Custom Instructions
这三个术语,而且很多时候它们的意思似乎差不多。简单总结一下:
- System Prompts 和 System Messages 是通过 ChatGPT 的
Chat Completions API
以程序化方式使用该 LLM 时使用的术语。 - Custom Instructions 是通过 https://chat.openai.com/ 的
用户界面
使用 ChatGPT 时的术语。
不过整体而言,这三个术语指代的是同一对象。
2. System Prompts
System Prompts 是指附加的额外 prompt
,其作用
是指示 LLM 理应的行为方式
。之所以说这是额外附加的,是因为它位于「普通」prompt(也被称为用户 prompt)之外。
在一组聊天中,每一次你都要提供一个新的 prompt,System Prompts 的作用就像是一个 LLM 会自动应用的过滤器。这意味着,在一组聊天中,LLM 每次响应都要考虑 System Prompts
。
3 . 使用 System Prompts
使用 System Prompts 提供你希望 LLM 在整个聊天过程中全程记住的指令
。
4. System Prompts 应包含的内容
System Prompts 中的指令通常包含以下类别:
任务定义
,这样 LLM 在聊天过程中能一直记得要做什么
。输出格式
,这样 LLM 能一直记得
自己应该如何响应
。防护围栏
,这样 LLM 能一直记得
自己不应该如何响应
。防护围栏(Guardrails)是 LLM 治理方面一个新兴领域,是指为 LLM 配置的可运行操作的边界。
举个例子,System Prompt 可能是这样的:
You will answer questions using this text: [insert text].
You will respond with a JSON object in this format: {“Question”: “Answer”}.
If the text does not contain sufficient information to answer the question, do not make up information and give the answer as “NA”.
You are only allowed to answer questions related to [insert scope]. Never answer any questions related to demographic information such as age, gender, and religion.
翻译:
你将使用以下文本回答问题:[insert text]。
你将使用以下格式的JSON对象进行响应:{“Question”:“Answer”}。
如果文本中没有包含足够的信息来回答问题,请不要编造信息,并给出“NA”的答案。
你只能回答与[insert scope]相关的问题。永远不要回答任何与人口统计信息有关的问题,如年龄、性别和宗教。
其中每部分的类别如下:
5. 「普通」prompt(用户 prompt) 包含的内容
System Prompt 会大致描述任务概况。在上面的 System Prompt 示例中,任务被定义为仅使用特定的文本进行问答,并指示 LLM 以 {“Question”: “Answer”} 的格式进行响应。
You will answer questions using this text: [insert text].
You will respond with a JSON object in this format: {“Question”: “Answer”}.
在这个案例中,聊天中的每个用户 prompt 都只是你希望得到文本解答的问题。举个例子,用户 prompt 可能是这样「What is the text about?」。而 LLM 的响应会是这样:{“What is the text about?”: “The text is about…”}。
但我们可以进一步泛化这个示例任务。在实践中,你更可能会有多个希望得到解答的问题,而不只是一个。在这个案例中,我们可以将上述 System Prompt 的第一行从
You will answer questions using this text: [insert text].
改为
You will answer questions using the provided text.
现在,每个用户 prompt 中都既包含执行问答所基于的文本,也包含所要回答的问题。
<text>
[insert text]
</text>
<question>
[insert question]
</question>
这里,我们依然使用 XML 标签作为分隔符,以一种结构化的方式为 LLM 提供这两段所需信息。此处 XML 标签中使用的名词是 text
和 question
,对应于 System Prompt 中使用的名词
,这样一来 LLM 就能理解这些标签与 System Prompt 指令有何关联。
System Prompt
应能给出整体
的任务指令
,而每个用户 prompt
应提供你希望执行任务
时使用的确切细节
。比如在这个案例中,这个确切的细节是text 和question。
补充: 让 LLM 防护围栏变得动态化
固定防护围栏
:通过System Prompt 中
的几句话添加的。动态防护围栏
:英伟达团队开发的 NeMo Guardrails 能让用户配置与 LLM 之间的期望对话流,从而在聊天的不同位置设置不同的防护围栏,实现随聊天不断演进的动态防护围栏。