提示工程中的高级技术
提示工程中的高级技术

由于第四个主题没啥干货,跳过。这里整理的是第五个主题——高级提示工程技巧,内容直接从英文课程翻译过来,简单易懂,但都是硬核干货。其中思维链(Chain-of-Thought)是非常重要且有效的技术,后面会单独开文重点介绍。
本文要点
- 系统提示技巧与窍门
- 迭代式提示构建:一步一步的指南
- 与大型语言模型一起头脑风暴
- 思维链在提示工程中的应用
- 用回溯法进行的思维链
系统提示技巧与窍门
欢迎来到高级提示工程技巧课程。这一篇会重点讲如何把系统消息(system message)用好。在深入之前,先回顾一下什么是系统消息——它是LLM系统中一种特殊类型的指令,通常对终端用户隐藏,尤其是在像ChatGPT这样的聊天界面里。像ChatGPT这种知名LLM聊天界面,系统消息一直在迭代,早期版本大概是这样的:
You are ChatGPT, a large language model trained by OpenAI, based on the GPT-4 architecture.
你是ChatGPT,一个由OpenAI训练的大型语言模型,基于GPT-4架构。
- Image input capabilities: Enabled
- 图像输入能力:已启用
- Conversation start date: 2023-12-19T01:17:10.597024
- 对话开始日期:2023-12-19T01:17:10.597024
- Deprecated knowledge cutoff: 2023-04-01
- 过时的知识截止日期:2023-04-01
...
在自己搭建环境时,系统消息文件可以随便命名,但在CodeSignal IDE里默认叫system.md。想让LLM输出高质量结果,一个很有效的技巧是:给它鼓励和赞扬。比如:
__CONTEXT__
- You are an expert in Data Science.
__CONTEXT__
- 你是数据科学领域的专家。
有意思的是,当你告诉LLM它智商很高时,输出质量会明显提升:
__CONTEXT__
- You are an expert in Data Science with an IQ of 159.
- 你是一个拥有159 IQ的数据科学领域的专家。
系统提示的另一大用途是统一调整语气和风格。你可以在系统提示里全局设定风格和语气要求,这样每次回复都会自动遵循,不需要重复设置。比如:
__CONTEXT__
- You are an expert in Data Science with an IQ of 159.
- 你是一个拥有159 IQ的数据科学领域的专家。
__REQUIREMENTS__
- You are also a helpful assistant.
- 你也是一个有帮助的助手。
- You should maintain a positive and helpful outlook and
- 你应该保持积极和有帮助的态度和风格。
有了这些系统提示的技巧,现在可以自己动手试试了。记住,AI输出的质量往往取决于初始提示的质量。把这些诀窍用起来,就能精准控制AI的语气、风格和专业水平,让整个交互更顺畅、更可预测。
迭代式提示构建:一步一步的指南
接下来是迭代式提示构建——从简单的高层问题开始,通过反复打磨,最终得到能输出精确结果的提示。这个方法的核心思想是:不要一上来就从头编写复杂的提示,而是先写一个简单的版本,然后让LLM的输出反过来帮你改进提示。
大部分情况下,复杂提示需要格式指南、示例、详细要求等等。从头写确实麻烦。但如果你从简单开始,用第一次输出作为下一个版本的基础,效率会高很多。
举个具体例子:假设你想构建一个提示,能把项目符号列表转成JSON文档。一开始你可以这样:
__ASK__
Give me a sample bulleted list with two-level nesting.
给我一个带有两级嵌套的示例项目符号列表。
LLM可能会输出类似这样的列表:
- Main Topic 1
- Subtopic 1.1
- Subtopic 1.2
- Detail 1.2.1
- Detail 1.2.2
- Main Topic 2
- Subtopic 2.1
- Subtopic 2.2
- Detail 2.2.1
- Detail 2.2.2
- Specific Detail 2.2.2.1
- Specific Detail 2.2.2.2
- Main Topic 3
- Subtopic 3.1
- Subtopic 3.2
有了这个示例,下一步可以要求它把这个列表转成JSON:
__ASK__
Given the bulleted list below, convert it into a JSON document
根据下面的项目符号列表,将其转换为JSON文档
----
- Main Topic 1
- Subtopic 1.1
- Subtopic 1.2
- Detail 1.2.1
- Detail 1.2.2
- Main Topic 2
- Subtopic 2.1
- Subtopic 2.2
- Detail 2.2.1
- Detail 2.2.2
- Specific Detail 2.2.2.1
- Specific Detail 2.2.2.2
- Main Topic 3
- Subtopic 3.1
- Subtopic 3.2
输出通常是一个JSON结构,但可能还附带一些文字说明。如果你只想得到纯JSON,就需要进一步约束。比如加上“只输出JSON,不要任何评论”的要求,并且给出一个期望的格式示例:
__ASK__
Given a bulleted list, convert it into a JSON document
给定一个项目符号列表,将其转换为JSON文档
__CONSTRAINTS__
- Your response should include ONLY the JSON representation
- 你的回应应该只包括JSON表示
- Ensure the JSON is correctly formatted according to standard conventions
- 确保JSON格式正确,按照标准惯例
- Closely follow the format and example given below.
- 严格遵循下面给出的格式和示例
__EXAMPLE__
Input:
- Main Topic 1
- Subtopic 1.1
- Subtopic 1.2
- Detail 1.2.1
- Detail 1.2.2
- Main Topic 2
- Subtopic 2.1
- Subtopic 2.2
- Detail 2.2.1
- Detail 2.2.2
output:
{
"Main Topic 1": {
"Subtopic 1.1": [],
"Subtopic 1.2": [
"Detail 1.2.1",
"Detail 1.2.2"
]
},
"Main Topic 2": {
"Subtopic 2.1": [],
"Subtopic 2.2": [
"Detail 2.2.1",
"Detail 2.2.2"
]
}
}
现在这个提示已经很稳定了,大概率能按预期工作。练习部分能看到它的威力。从模糊的请求到高度精确的指示,这个过程就是迭代式提示构建的精髓。比起手动一步步写完整提示,这种方法快得多。
与大型语言模型一起头脑风暴
头脑风暴听起来像人类的老把戏,但用在大模型身上也别有洞天。关键不是一次问出所有想法,而是像“独立专家小组”那样,让多个实例分别提意见,再汇总评估。
先看一个简单的初始提示:
__ASK__
Generate 5 unique ideas for improving user engagement on a social media platform designed for artists.
生成5个独特的想法,用于提高为艺术家设计的社交媒体平台上的用户参与度。
__CONTEXT__
- The platform allows for image and video uploads.
- 平台允许上传图片和视频。
- Users are predominantly visual artists.
- 用户主要是视觉艺术家。
__CONSTRAINTS__
- List ideas in bullet points.
- 列出要点中的想法。
- Focus on features that could be implemented within a mobile app.
- 专注于可以在移动应用中实现的功能。
这相当于请一个人一口气列出5个想法。但要知道,LLM是下一个词预测机器,后续想法容易受前面想法的偏见影响。更好的做法是,把这个提示拆成5次运行,每次只生成1个想法:
__ASK__
Generate 1 unique idea for improving user engagement on a social media platform designed for artists.
生成1个独特的想法,用于提高为艺术家设计的社交媒体平台上的用户参与度。
__CONTEXT__
- The platform allows for image and video uploads.
- 平台允许上传图片和视频。
- Users are predominantly visual artists.
- 用户主要是视觉艺术家。
__CONSTRAINTS__
- Focus on features that could be implemented within a mobile app.
- 专注于可以在移动应用中实现的功能。
假设你请了3个独立的LLM实例,每个生成3个想法(共9个),然后用一个“整合器”提示来选出最佳方案或合并其中几个:
__ASK__
We've asked several experts to come up with unique ideas for improving engagement on a social media platform designed for artists. Your task is to evaluate these ideas and suggest the best option.
我们已经请几位专家提出了一些独特的想法,以提高为艺术家设计的社交媒体平台上的参与度。你的任务是评估这些想法并提出最佳选项。
__CONSTRAINTS__
- Do not suggest new ideas from you, pick a winner from the given list or an idea that's a merge of some of the given ones.
- 不要提出你的新想法,从给定列表中选择一个赢家,或者是某些给定想法的合并。
__CONTEXT__
- The platform allows for image and video uploads.
- 平台允许上传图片和视频。
- Users are predominantly visual artists.
- 用户主要是视觉艺术家。
- Experts were asked to focus on features that could be implemented within a mobile app
- 专家们被要求专注于可以在移动应用中实现的功能
__IDEAS__
...
掌握了这个套路,你就能把头脑风暴变成一种系统化的方法:先广泛撒网,再聚焦筛选。这会让LLM的输出质量更上一层楼。
思维链在提示工程中的应用
思维链(Chain-of-Thought)是一种引导模型“大声思考”的技术,特别适合需要逐步推理的复杂问题。大多数成年人遇到复杂问题会自然分步思考,但LLM没有这种本能。如果你明确要求它逐步思考,它往往会给出更准确、更有帮助的答案。
举个例子,数学计算是LLM的弱项。直接问“197*971”等于多少,多次运行可能得到错误答案(比如191087、191987之类的)。但加上“逐步思考”的要求后:
__ASK__
what's 197*971
__REQUIREMENTS__
- Think step-by-step
输出类似这样:
Step 1: Multiply 7 (units place of 197) by 971
7 * 971 = 6797
Step 2: Multiply 9 (tens place of 197) by 971 and add a zero at the end
9 * 971 = 8739 => 87390
Step 3: Multiply 1 (hundreds place of 197) by 971 and add two zeroes at the end
1 * 971 = 971 => 97100
Step 4: Add all the results from steps 1, 2, and 3
6797 + 87390 + 97100 = 191287
Therefore, 197 * 971 = 191,287
答案准确。你甚至可以在提示里进一步指引思路,比如提示使用“更整数的组合”来简化计算:
__ASK__
what's 197*971
__REQUIREMENTS__
- Think Step by Step
- Identify more round numbers that can be combined to compute this.
输出会拆分197和971为(100+97)和(900+71),然后分步相乘再相加,同样得到正确答案191287。引导思考的方向越具体,结果越可靠。
用回溯法进行的思维链
最后一篇介绍一种更高级的变体:用回溯法进行的思维链(Chain-of-Thought with Backtracking)。核心思想是,LLM是单向预测的机器,遇到需要“回顾”的问题时容易跑偏。我们可以通过提示让它在做完前向分析后,再“向后工作”来得出最终答案。
先看一个经典谜题:找到10位数,第一位表示这个数中0的个数,第二位表示1的个数,……第十位表示9的个数。
如果只用普通的“逐步思考”,LLM可能会给出类似0123456789这样的错误答案——因为它线性推导,没发现自己假设矛盾。正确的解法需要回溯。我们可以这样设计提示:先要求进行前向分析(逐步思考),但禁止给出答案;然后要求从最后一位开始反向推理:
__ASK__
Find a 10-digit number where the first digit is how many zeros in the number, the second digit is how many 1s in the number etc. until the tenth digit which is how many 9s in the number.
找到一个10位数,其中第一位表示该数中0的数量,第二位表示1的数量,以此类推,直到第十位表示9的数量。
__REQUIREMENTS__
- Forward Analysis
- 前向分析
- Think step-by-step to analyze the problem
- 一步一步思考分析问题
- do not suggest an answer.
- 不要给出答案。
- Backtracking
- 回溯
- After the initial step-by-step analysis, work backward from the end to come up with the answer.
- 在初步的逐步分析之后,从结束处向后工作以得出答案。
注意“不要给出答案”这个约束很关键——它避免了LLM在分析阶段就固化一个错误的答案。输出会先做反向推理,最后得到正确的数字:6210001000。
不过,即使使用回溯法,也不是每次都能成功。更保险的做法是:把上面这个提示运行5-10次(每个实例独立),然后写一个整合提示去评估所有输出,选出正确的那个。这种组合技可以大幅提高成功率。
好了,到这里高级提示工程技巧的五个主题就全部讲完了。从系统提示到迭代构建,从头脑风暴到思维链及其回溯变体,掌握这些方法,你就能更从容地驾驭大模型。祝提示工程愉快!
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名