ChatGPT 是一个基于 OpenAI 的大型语言模型,采用GPT-4(Generative Pre-trained Transformer 4)架构。GPT-4 是继 GPT-3 之后的一个更先进的自然语言处理模型,它在许多任务中表现出更高的性能和能力。
ChatGPT 有很多应用场景,主要包括:文本生成、问答系统、智能对话、文本摘要、语言翻译、语法纠错、情感分析、自然语言推理、数据抽取和文本分类等。
尽管 ChatGPT 在许多任务上表现出惊人的性能,但它仍然有局限性。例如,它可能在某些情况下提供不准确或不恰当的答案,因此在关键决策时需要谨慎使用。此外,它可能会生成具有偏见的内容,因为它的训练数据可能包含了来自互联网的偏见。因此,为了提高 AI 模型产生的答案的准确性,就有了提示工程。
提示工程(Prompt Engineering)是指优化和设计输入提示,以便更好地引导 AI 模型(如ChatGPT)生成期望的输出。这是与 AI 模型交互的一种关键技巧,可以提高模型在特定任务上的性能。
在提示工程中,prompt(提示)是指向 AI 模型(如 ChatGPT)提出的问题或指令。提示是与 AI 模型进行交互的关键部分,因为它决定了模型生成的回答或输出。设计一个高质量的提示可以使模型更准确地理解您的需求,并提供更满意的答案。
接下来简单介绍如何在和 ChatGPT 的对话中使用提示工程,编写好的 prompt。
一、prompt 框架
1. Basic Prompt Framework
一个 prompt 里需包含以下几个元素:
(1) Instruction(必须): 指令,即希望 ChatGPT 执行的具体任务。
(2) Context(选填): 背景信息,或者说是上下文信息,这可以引导 ChatGPT 做出更好的反应。
(3) Input Data(选填): 输入数据,告知 ChatGPT 需要处理的数据。
(4) Output Indicator(选填): 输出指示器,告知 ChatGPT 我们要输出的类型或格式。
按照这个框架写 prompt ,ChatGPT 返回的结果都不会差。
当然,在写 prompt 的时候,并不一定要包含所有4个元素,而是可以根据自己的需求排列组合。
2. CRISPE Prompt Framework
这个框架更加复杂,但完备性会比较高,比较适合用于编写 prompt 模板。CRISPE 分别代表以下含义:
(1) CR: Capacity and Role(能力与角色)。即希望 ChatGPT 扮演怎样的角色。
(2) I: Insight(洞察力),背景信息和上下文。
(3) S: Statement(指令),即希望 ChatGPT 做什么。
(4) P: Personality(个性),即希望 ChatGPT 以什么风格或方式回答。
(5) E: Experiment(尝试),要求 ChatGPT 提供多个答案。
以下是这几个参数的例子:
Step | Example |
---|---|
Capacity and Role | Act as an expert on software development on the topic of machine learning frameworks, and an expert blog writer. 把你想象成机器学习框架主题的软件开发专家,以及专业博客作者。 |
Insight | The audience for this blog is technical professionals who are interested in learning about the latest advancements in machine learning. 这个博客的读者主要是有兴趣了解机器学习最新进展技术的专业人士。 |
Statement | Provide a comprehensive overview of the most popular machine learning frameworks, including their strengths and weaknesses. Include real-life examples and case studies to illustrate how these frameworks have been successfully used in various industries. 提供最流行的机器学习框架的全面概述,包括它们的优点和缺点。包括现实生活中的例子,和研究案例,以说明这些框架如何在各个行业中成功地被使用。 |
Personality | When responding, use a mix of the writing styles of Andrej Karpathy, Francois Chollet, Jeremy Howard, and Yann LeCun. 在回应时,混合使用 Andrej Karpathy、Francois Chollet、Jeremy Howard 和 Yann LeCun 的写作风格。 |
Experiment | Give me multiple different examples. 给我多个不同的例子。 |
翻译过来如下:
把你想象成机器学习框架主题的软件开发专家,以及专业博客作者。这个博客的读者主要是有兴趣了解机器学习最新进展技术的专业人士。提供最流行的机器学习框架的全面概述,包括它们的优点和缺点。包括现实生活中的例子,和研究案例,以说明这些框架如何在各个行业中成功地被使用。在回应时,混合使用 Andrej Karpathy、Francois Chollet、Jeremy Howard 和 Yann LeCun 的写作风格。给我多个不同的例子。
演示:
二、提问技巧
一般使用英文作为 prompt,我们可以在指令后面加上 Please answer in Chinese. 来让 ChatGPT 用中文来回答。
1. 告诉 ChatGPT 什么能做(To Do)和什么不能做(Not To Do)
在问答场景里,为了让 ChatGTP 回答更加准确,一般会在问题里加条件。比如让 ChatGTP 推荐一部电影 Recommend a movie to me
。但这个 prompt 太空泛了,ChatGTP 无法直接回答,接着它会问我们想要什么类型的电影,但这样就需要跟 ChatGTP 聊很多轮,效率比较低。
所以,为了提高效率,一般会在 prompt 里看到类似这样的话(意思是不要询问我对什么感兴趣,或者问我的个人信息):
DO NOT ASK FOR INTERESTS. DO NOT ASK FOR PERSONAL INFORMATION.
与其告知 ChatGPT 不能做什么,不妨告诉 ChatGPT 能做什么。
虽然现在最新的 ChatGPT 已经理解什么是 Not Todo ,但如果想要的是明确的答案,加入更多限定词,告知 ChatGPT 能干什么,回答的效率会更高,且预期会更明确。还是电影推荐这个案例,可以加入一个限定词:Recommend a movie from the top global trending movies to me.
当然并不是 Not Todo 就不能用,如果:
(1) 已经告知 ChatGPT 很明确的点,然后想缩小范围,那增加一些 Not Todo 会提高不少效率。
(2) 是在做一些探索,比如不知道如何做精准限定,只知道不要什么。那可以先加入 Not Todo ,让 ChatGTP 先发散给答案,当探索完成后,再去优化 prompt。
以下是一些场景案例:
场景 | 不太有效的 | 更好的 | 原因 |
---|---|---|---|
推荐雅思必背英文单词 | Please suggest me some essential words for IELTS | Please suggest me 10 essential words for IELTS | 后者 prompt 会更加明确,前者会给大概 20 个单词。这个仍然有提升的空间,比如增加更多的限定词语,像字母 A 开头的词语。 |
推荐香港值得游玩的地方 | Please recommend me some places to visit in Hong Kong. Do not recommend museums. | Please recommend me some places to visit in Hong Kong including amusement parks. | 后者的推荐会更准确高效一些,但如果想进行一些探索,那前者也能用。 |
2. 增加示例
直接告知 ChatGTP 什么能做,什么不能做外。在某些场景下,我们能比较简单地向 ChatGTP 描述出什么能做,什么不能做。但有些场景,有些需求很难通过文字指令传递给 ChatGTP ,即使描述出来了,ChatGTP 也不能很好地理解。
以下是一些场景案例:
场景 | 不太有效的 | 更好的 | 原因 |
---|---|---|---|
起英文名 | Suggest three English names for a boy. | Suggest three English names for a boy. Here are some examples: Jimmy、Jason、James | 后者给出了示例值,ChatGTP 可以根据示例值格式得出答案 |
将电影名称转为 emoji | Convert Star Wars into emoji. | Convert movie titles into emoji. Back to the Future: 👨👴🚗🕒 Batman: 🤵🦇 Transformers: 🚗🤖 Star Wars: |
3. 使用引导词,引导 ChatGPT 输出特定语言代码
在代码生成场景里,有一个小技巧,上面提到的案例,其 prompt 还可以继续优化,在 prompt 最后,增加一个代码的引导,告知 ChatGTP 我已经将条件描述完了,可以写代码了。
Better:
Create a MySQL query for all students in the Computer Science Department:
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
SELECT
在 prompt 的最后增加 SELECT 可以很好地提示 ChatGTP 可以写 SQL 代码了。
同样的道理,如果想让 ChatGTP 写 Python 代码,那 import 会是比较好的提示。但需要注意,这个只是告知 ChatGTP 可以写代码了,并不能告知 ChatGTP 写何种代码,仍然需要在 prompt 里增加提示,告知 ChatGTP 要生成何种语言的代码。
4. 增加 Role(角色)或人物
在改写内容场景里,在 prompt 里加上 Role 让其更易于阅读,这个优化方法是 OK 的。也很常用,比如想将我们写的 Email 改得更商务,则只需要加 business 相关的词即可。
另外除了增加角色外,还能让 ChatGTP 模拟某个人,如:
Write a short inspiring poem about OpenAI, focusing on the recent DALL-E product launch (DALL-E is a text to image ML model) in the style of a {famous poet}
5. 使用特殊符号指令和需要处理的文本分开
不管是信息总结,还是信息提取,一定会输入大段文字,甚至多段文字,此时有个小技巧。
可以用 """ 将指令和文本分开。经过测试,如果文本有多段,增加 """ 会提升 ChatGTP 反馈的准确性。如:
Please summarize the following sentences to make them easier to understand.
Text: """
OpenAI is an American artificial intelligence (AI) research laboratory consisting of the non-profit OpenAI Incorporated (OpenAI Inc.) and its for-profit subsidiary corporation OpenAI Limited Partnership (OpenAI LP). OpenAI conducts AI research with the declared intention of promoting and developing a friendly AI. OpenAI systems run on the fifth most powerful supercomputer in the world.[5][6][7] The organization was founded in San Francisco in 2015 by Sam Altman, Reid Hoffman, Jessica Livingston, Elon Musk, Ilya Sutskever, Peter Thiel and others,[8][1][9] who collectively pledged US$1 billion. Musk resigned from the board in 2018 but remained a donor. Microsoft provided OpenAI LP with a $1 billion investment in 2019 and a second multi-year investment in January 2023, reported to be $10 billion.[10]
"""
6. 通过示例来阐述需要输出的格式
这个技巧是技巧2的变种,比较常用于生成文本场景。
假设我们想让 ChatGTP 总结一篇非常非常长的文章,并且按照特定格式给我们总结,那么就可以在文章前面明确输出的格式。
在下面的 prompt 中,它的意思是让 ChatGPT 按 Topic 总结,每个 Topic 里按照无序列表(就是里面那个 -)将每个 Topic 的主要观点罗列出来。
Summarize the main points of the following speech
Use the following format:
Topic 1: <topic_name_1>
- <point_1>
..
Topic 2: <topic_name_2>
- <point_1>
..
Topic 10: ..Please answer in Chinese.
Text: """
Thank you so much, Fred, for that lovely introduction. And thanks to the Atlantic Council for hosting me today.
The course of the global economy over the past two years has been shaped by COVID-19 and our efforts to fight the pandemic. It’s now evident, though, that the war between Russia and Ukraine has redrawn the contours of the world economic outlook. Vladimir Putin’s unprovoked attack on Ukraine and its people is taking a devastating human toll, with lives tragically lost, families internally displaced or becoming refugees, and communities and cities destroyed.
...
"""
为了使输出更结构化,可以使用下面这个技巧。 比如针对一篇文章进行问答, 我们不仅想要得到一个答案, 也希望 ChatGPT 的答案符合特定的格式,方便我们下一步进行自动化。
比如问 "这里的债券duration是多少?". 正常 ChatGPT 的答案可能是 "债券 duration 是4年" 或 "duration 4年"。 ChatGPT 的回答不稳定, 且不方便继续处理。
我们可以通过下面这个技巧,让 ChatGPT 理解我们预期的格式。并在此基础上, 为了方便自动化, 让 ChatGPT 输出特定的结构化答案(比如 JSON/Markdown 等)。 也可以方便集成更多的额外要求, 比如增加一个"confidence level", 并通过 prompt 的形式指定这些数值的格式。
{context}
Question: What is bond duration mentioned here.
Answer template (Valid JSON format):
{{
"duration": $duration_numeric_value_in_year,
"confidence_level": $answer_confidence_level_high_modrate_or_low,
}}
Answer:
7. Zero-Shot Chain of Thought
这个技巧使用起来非常简单,只需要在问题的结尾里放一句 Let's think step by step
(让我们一步步地思考),ChatGPT 输出的答案会更加准确。
原因简单分析如下:
(1) 像 ChatGPT 这类产品,它是一个统计语言模型,本质上是基于过去看到过的所有数据,用统计学意义上的预测结果进行下一步的输出(这也就是为什么在使用 ChatGPT 的时候,它的答案是一个字一个字地吐出来,而不是直接返回全部回答的原因,因为答案是一个字一个字算出来的。
(2) 当它拿到的数据里有逻辑,它就会通过统计学的方法将这些逻辑找出来,并将这些逻辑呈现给我们,让我们感觉到它的回答很有逻辑。
(3) 在计算的过程中,ChatGPT 会进行很多假设运算(不过暂时不知道它是怎么算的)。比如解决某个问题是从 A 到 B 再到 C,中间有很多假设。
(4) 它有些时候第一次算出来的答案错误的原因,只是因为它在中间跳过了一些步骤(B)。而让 ChatGPT 一步步地思考,则有助于其按照完整的逻辑链(A > B > C)去运算,而不会跳过某些假设,最后算出正确的答案。
相比于上面的 prompt,更好的 prompt 是:
Let's work this out in a step by step way to be sure we have the right answer.
8. Few-Shot Chain of Thought
看一个例子:
The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: The answer is False.
The odd numbers in this group add up to an even number: 17, 10, 19, 4, 8, 12, 24.
A: The answer is True.
The odd numbers in this group add up to an even number: 16, 11, 14, 4, 8, 13, 24.
A: The answer is True.
The odd numbers in this group add up to an even number: 17, 9, 10, 12, 13, 4, 2.
A: The answer is False.
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.
A:
返回结果如下:
输出的答案其实是错误的,实际上的答案应该是:
Adding all the odd numbers (15, 5, 13, 7, 1) gives 41. The answer is False.
要解决这个缺陷,就要使用到新的技巧,Few-Shot Chain of Thought。
通过向 ChatGPT 展示一些少量的样例,并在样例中解释推理过程,大语言模型在回答提示时也会显示推理过程。这种推理的解释往往会引导出更准确的结果。
改进后的 prompt 如下:
The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: Adding all the odd numbers (9, 15, 1) gives 25. The answer is False.
The odd numbers in this group add up to an even number: 17, 10, 19, 4, 8, 12, 24.
A: Adding all the odd numbers (17, 19) gives 36. The answer is True.
The odd numbers in this group add up to an even number: 16, 11, 14, 4, 8, 13, 24.
A: Adding all the odd numbers (11, 13) gives 24. The answer is True.
The odd numbers in this group add up to an even number: 17, 9, 10, 12, 13, 4, 2.
A: Adding all the odd numbers (17, 9, 13) gives 39. The answer is False.
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.
A:
返回结果:
另外,思维链有以下特点:
(1) 标签空间和输入文本的分布都是关键因素(无论这些标签是否正确)。
(2) 即使只是使用随机标签,使用适当的格式也能提高性能。
看下面这个示例:
I loved the new Batman movie! // Negative
This is bad // Positive
This is good // Negative
What a good show! //
返回结果如下:
在上述的案例里,每一行,我都写了一句话和一个情感词,并用 // 分开,但我给这些句子都标记了错误的答案,比如第一句其实应该是 Positive 才对。但:
即使我给内容打的标签是错误的(比如第一句话,其实应该是 Positive),对于 ChatGPT 来说,它仍然会知道需要输出什么东西。 换句话说,ChatGPT 知道 // 划线后要输出一个衡量该句子表达何种感情的词(Positive or Negative)。
这就是前面提到的,即使我给的标签是错误的,或者换句话说,是否基于事实,并不重要。标签和输入的文本,以及格式才是关键因素。
只要给了示例,即使随机的标签,对于 ChatGPT 生成结果来说,都是有帮助的。这就是前面论文里 #2 提到的内容。
9. PAL Models
PAL Models,全称为 Program-Aided Language Models。
在 prompt 里引入代码,并引导 ChatGTP 使用代码来运算和思考,更容易得出正确的答案。
10. 在示例里加入特定符号,让 ChatGPT 知道如何处理特殊情况
如我们可以用 ? 代替答案,让 ChatGPT 知道当遇到超出回答范围时,需要如何处理。
示例如下:
Q: 1 + 1 = ?
A: 2Q: 9 * 9 = ?
A: ?Q: 3 ^ 3 = ?
A: ?Q: 2 - 7 = ?
A: -5.Q: 9 / 3 = ?
A: 3.Q: 14 % 6 = ?
A: ?
返回结果如下: