吴恩达 x ChatGPT提示工程教程

May 18, 2023

原教程: ChatGPT Prompt Engineering for Developers

中文翻译: 吴恩达 x OpenAI的Prompt Engineering课程专业翻译版

中英字幕: 《ChatGPT提示工程》非官方版中英双语字幕

本文是对ChatGPT Prompt Engineering for Developers课程内容的总结归档,另外课程中的英文Prompt也翻译为中文,方便理解和学习。

原则一:清楚和具体的指示

策略1:使用分隔符

  • 三重引号: """
  • 三重反引号: ```
  • 三重破折号: ---
  • 尖括号: <>
  • XML标签: <tag> </tag>
1
2
3
4
5
6
7
8
9
10
11
12
13
text = f"""
你应该尽可能清晰和具体地表达你希望模型做什么。\
这将引导模型朝着期望的输出方向,\
并减少收到无关或错误回应的机会。不要把写清晰的提示和写短的提示混淆。\
在许多情况下,更长的提示为模型提供了更多的清晰度和上下文,\
这可以导致更详细和相关的输出。
"""
prompt = f"""
将由三重反引号括起的文本总结为一句话。
```{text}```
"""
response = get_completion(prompt)
print(response)

策略2:要求结构化输出

  • JSON, HTML
1
2
3
4
5
6
7
prompt = f"""
生成一个包含三个虚构书名以及它们的作者和类型的列表。
以JSON格式提供,包含以下键:
book_id, title, author, genre.
"""
response = get_completion(prompt)
print(response)

策略3:检查条件是否满足检查完成任务所需的假设

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
text_1 = f"""
做一杯茶很简单!首先,你需要烧一些开水。在这个过程中,\
拿一个杯子,放入一个茶包。一旦水热了,就把它倒在茶包上。\
让它坐一会儿,让茶可以浸泡。几分钟后,取出茶包。如果你\
喜欢,可以加一些糖或牛奶调味。\
就这样!你就有了一杯美味的茶可以享用了。
"""
prompt = f"""
你将得到由三重反引号括起的文本。
如果它包含一系列的指示,\
将这些指示重写为以下格式:

步骤1 - ...
步骤2 - ...
...
步骤N - ...

如果文本中没有包含一系列的指示,\
那么只需写\"没有提供步骤。\"

'''{text_1}'''
"""
response = get_completion(prompt)
print("对于文本1的完成:")
print(response)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
text_2 = f"""
今天阳光明媚,鸟儿在歌唱。这是一个美好的日子,适合在公园散步。花儿在盛开,\
树木在微风中轻轻摇曳。人们都出来了,

享受着美好的天气。有些人在野餐,有些人在玩游戏,或者只是在草地上放松。这是一个完美的日子,可以在户外度过,欣赏大自然的美丽。
"""
prompt = f"""
你将得到由三重引号括起的文本。
如果它包含一系列的指示,\
将这些指示重写为以下格式:

步骤1 - ...
步骤2 - ...
...
步骤N - ...

如果文本中没有包含一系列的指示,\
那么只需写\"没有提供步骤。\"

'''{text_2}'''
"""
response = get_completion(prompt)
print("对于文本2的完成:")
print(response)

策略4:少样本提示。

1
2
3
4
5
6
7
8
9
10
11
12
13
prompt = f"""
你的任务是以一致的风格回答。

<child>: 教我什么是耐心。

<grandparent>: 深刻的河谷是由一股温和的泉水流出的;\
宏伟的交响乐源于一个单音;\
最复杂的挂毯始于一根孤独的线。

<child>: 教我什么是韧性。
"""
response = get_completion(prompt)
print(response)

原则二:给模型时间”思考”

策略1:明确完成任务所需的步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
text = f"""
在一个迷人的村庄里,兄妹杰克和吉尔开始了\
从山顶井里取水的任务。他们爬山时,欢快地唱歌,不幸的是\
杰克在一块石头上绊倒,滚下了山,吉尔也跟着他。\
尽管有些破碎,但这对兄妹回到家中,得到了\
安慰的拥抱。尽管发生了这样的事故,\
他们的冒险精神仍然未减,他们\
继续兴奋地探索。
"""
# 示例 1
prompt_1 = f"""
执行以下操作:
1 - 用一句话总结以下由三重反引号\
括起的文本。
2 - 将摘要翻译成法语。
3 - 列出法语摘要中的每个名字。
4 - 输出一个包含以下\
键的json对象:french_summary, num_names。

用换行符分隔你的答案。

文本:
```{text}```
"""
response = get_completion(prompt_1)
print("示例 1 的完成情况:")
print(response)

要求以指定格式输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
prompt_2 = f"""
你的任务是执行以下操作:
1 - 用一句话总结以下由<>括起的文本。
2 - 将摘要翻译成法语。
3 - 列出法语摘要中的每个名字。
4 - 输出一个包含以下键的json对象:french_summary, num_names。

使用以下格式:
文本: <需要总结的文本>
摘要: <摘要>
翻译: <摘要的翻译>
名字: <意大利语摘要中的名字列表>
输出的 JSON: <包含摘要和 num_names 的 json>

文本: <{text}>
"""
response = get_completion(prompt_2)
print("\n示例 2 的完成情况:")
print(response)

策略2:在草率得出结论之前,要求模型自行找出解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
prompt = f"""
判断学生的解答是否正确。

问题:
我正在建设一个太阳能发电设施,我需要\
帮助计算财务问题。
- 土地每平方英尺100美元
- 我可以以每平方英尺250美元的价格购买太阳能电池板
- 我谈判了一份维护合同,每年将花费我10万美元,以及每平方英尺10美元的额外费用
第一年运营的总成本作为平方英尺数量的函数是多少。

学生的解答:
设x为安装设施的面积(平方英尺)。
成本:
1. 土地成本:100x
2. 太阳能电池板成本:250x
3. 维护成本:100,000 + 10x
总成本:100x + 250x + 100,000 + 10x = 360x + 100,000
"""
response = get_completion(prompt)
print("学生解答的判断:")
print(response)

注意,学生的解答实际上是不正确的。

我们可以通过指导模型先自己解决问题来修复这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
prompt = f"""
你的任务是判断学生的解答是否正确。
为了解决这个问题,请按照以下步骤操作:
- 首先,自己解决这个问题。
- 然后,将你的解答与学生的解答进行比较,评估学生的解答是否正确。
- 在你自己做完这个问题之前,不要判断学生的解答是否正确。

使用以下格式:
问题:
'''
这里是问题
'''

学生的解答:
'''
这里是学生的解答
'''

实际的解答:
'''
解答步骤和你的解答在这里
'''

学生的解答是否与刚刚计算出的实际解答相同:
'''
是或否
'''

学生的成绩:
'''
正确或错误
'''

问题:
'''
我正在建设一个太阳能发电设施,我需要帮助计算财务问题。
- 土地每平方英尺100美元
- 我可以以每平方英尺250美元的价格购买太阳能电池板
- 我谈判了一份维护合同,每年将花费我10万美元,以及每平方英尺10美元的额外费用
第一年运营的总成本作为平方英尺数量的函数是多少。
'''

学生的解答:
'''
设x为安装设施的面积(平方英尺)。
成本:
1. 土地成本:100x
2. 太阳能电池板

成本:250x
3. 维护成本:100,000 + 10x
总成本:100x + 250x + 100,000 + 10x = 360x + 100,000
'''

实际的解答:
"""
response = get_completion(prompt)
print("实际解答:")
print(response)

模型的缺陷:

幻觉

1
2
3
4
5
6
prompt = f"""
告诉我关于Boie的AeroGlide UltraSlim智能牙刷的信息
"""
response = get_completion(prompt)
print("关于Boie的AeroGlide UltraSlim智能牙刷的信息:")
print(response)

对提示进行迭代(Iterative Prompt Development)

🎯迭代流程:想法 → 实现(代码/数据) → 实验结果 → 错误分析 → 重复

提示指南

  • 清晰且具体
  • 分析为什么结果没有得到期望的输出
  • 精炼想法和提示
  • 重复

迭代过程

  • 尝试某些操作
  • 分析结果为何不符合你的期望
  • 明确指示,给予更多的思考时间
  • 用一批例子来精炼提示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
fact_sheet_chair = """
概览
- 是一系列美丽的中世纪风格办公家具的一部分,
包括文件柜、书桌、书架、会议桌等。
- 提供多种外壳颜色和底座饰面选项。
- 提供塑料背面和前面的布艺(SWC-100)
或全布艺(SWC-110)在10种布艺和6种皮革选项中选择。
- 底座饰面选项有:不锈钢、哑光黑色、
光亮白色或铬。
- 椅子可选择有或无扶手。
- 适合家庭或商业环境。
- 适合合同使用。

构造
- 5轮塑料涂层铝底座。
- 气动椅子调节,方便升降。

尺寸
- 宽度 53 厘米 | 20.87”
- 深度 51 厘米 | 20.08”
- 高度 80 厘米 | 31.50”
- 座位高度 44 厘米 | 17.32”
- 座位深度 41 厘米 | 16.14”

选项
- 软地板或硬地板脚轮选项。
- 两种选择的座位泡沫密度:
中等(1.8 磅/立方英尺)或高(2.8 磅/立方英尺)
- 无扶手或8位置PU扶手

材料
外壳底座滑轮
- 铸铝,涂有改性尼龙PA6/PA66涂层。
- 外壳厚度:10 毫米。
座位
- HD36泡沫

原产地
- 意大利
"""

以下方提示举例:

1
2
3
4
5
6
7
8
9
10
11
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。

根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。

技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)

错误分析

问题 1. 文本过长

  • 限制单词/句子/字符的数量。
1
2
3
4
5
6
7
8
9
10
11
12
13
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。

根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。

最多使用50个词。

技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)

问题 2. 文本关注了错误的细节

  • 让它关注对目标受众相关的方面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。

根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。

描述面向家具零售商,
所以应该具有技术性质,并关注产品的构造材料。

最多使用50个词。

技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。

根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。

描述面向家具零售商,
所以应该具有技术性质,并关注产品的构造材料。

在描述的最后,包括技术规格中的每个7字符
产品ID。

最多使用50个词。

技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)

问题 3. 描述需要一个尺寸表

  • 要求它提取信息并将其组织成表格。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。

根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。

描述面向家具零售商,
所以应该具有技术性质,并关注产品的构造材料。

在描述的最后,包括技术规格中的每个7字符
产品ID。

在描述之后,包括一个给出产品尺寸的表格。表格应有两列。
在第一列中包括尺寸的名称。
在第二列中只包括英寸的测量。

给表格标题为'产品尺寸'。

将所有内容格式化为可在网站中使用的HTML。
将描述放在<div>元素中。

技术规格:```{fact_sheet_chair}```
"""

response = get_completion(prompt)
print(response)

案例一:总结文字(Summarizing)

需要总结的文本

1
2
3
4
5
6
7
8
prod_review = """
为我女儿的生日买了这个熊猫毛绒玩具,\
她非常喜欢,带着它去处处。它很软,\
超级可爱,脸上的表情看起来很友好。不过我觉得\
我付的钱买到的东西有点小。我觉得可能有\
其他同样价格但更大的选项。它比预期的到货日期早了一天,\
所以我在给她之前自己玩了一下。
"""

用词/句/字符限制进行总结

1
2
3
4
5
6
7
8
9
10
prompt = f"""
你的任务是生成一个电子商务网站的产品评论的简短总结。

总结下面由三重反引号括起的评论,最多用30个词。

评论:```{prod_review}```
"""

response = get_completion(prompt)
print(response)

总结关注运输和交货的评论

1
2
3
4
5
6
7
8
9
10
11
prompt = f"""
你的任务是生成一个电子商务网站的产品评论的简短总结,以便给予\
运输部门反馈。

总结下面由三重反引号括起的评论,最多用30个词,并关注任何提及产品运输和交货的方面。

评论:```{prod_review}```
"""

response = get_completion(prompt)
print(response)

总结关注价格和价值的评论

1
2
3
4
5
6
7
8
9
10
11
prompt = f"""
你的任务是生成一个电子商务网站的产品评论的简短总结,以便给予\
负责确定产品价格的定价部门反馈。

总结下面由三重反引号括起的评论,最多用30个词,并关注任何与价格和感知价值相关的方面。

评论:```{prod_review}```
"""

response = get_completion(prompt)
print(response)
  • 得到的总结中包括与关注主题无关的话题。

尝试"提取"而不是"总结"

1
2
3
4
5
6
7
8
9
10
prompt = f"""
你的任务是从电子商务网站的产品评论中提取相关信息,以便给予运输部门反馈。

从下面由三重引号括起的评论中提取与运输和交货相关的信息。限制为30个词。

评论:```{prod_review}```
"""

response = get_completion(prompt)
print(response)

总结多个产品评论

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
review_1 = prod_review 

# 立式灯评论
review_2 = """
我需要一个漂亮的卧室灯,这个灯还有额外的存储空间,价格也不高。
快速到货 - 2天就到了。灯的拉绳在运输过程中断了,公司愉快地寄来了一个新的。也在几天内到了。


很容易组装。然后我发现缺了一个零件,所以我联系了他们的客服,他们很快就给我寄来了缺失的零件!
看起来这是一家非常关心他们的客户和产品的公司。
"""

# 电动牙刷评论
review_3 = """
我的牙科卫生师推荐我使用电动牙刷,
这就是我为什么会买这个。到目前为止,电池寿命似乎相当令人印象深刻。
在初始充电和第一周内插入充电器以调整电池后,
我已经拔掉了充电器,并在过去的3周内每天刷两次牙,都是用同一次充电。
但是牙刷头太小了。我见过的婴儿牙刷比这个还大。
我希望头部更大,刷毛长度不同,以便更好地进入牙齿之间,因为这个做不到。
总的来说,如果你能以50美元左右的价格买到这个,那是个好交易。
制造商的替换头相当贵,但你可以买到价格更合理的通用品牌。
这款牙刷让我感觉每天都去过牙医。我的牙齿感觉闪闪发光的干净!
"""

# 搅拌机评论
review_4 = """
所以,他们在11月份还有17件套系统的季节性销售,价格大约在49美元左右,
大约半价,但是出于某种原因(称之为价格欺诈)在12月的第二周,
同样的系统的价格都涨到了70-89美元之间。而11件套系统的价格也从之前的销售价格29美元涨了大约10美元左右。
所以看起来还行,但如果你看底座,刀片锁定的部分看起来不如几年前的版本好,
但我打算对它非常温柔(例如,我先在搅拌机中粉碎非常硬的物品,如豆子、冰块、大米等,
然后在我想要的份量中将它们在搅拌机中粉碎,然后换用搅拌刀片进行更细的磨粉,
并在制作奶昔时先使用交叉切割刀片,然后如果我需要它们更细/少浆糊,我会使用平刀片)。
制作奶昔的特别提示,细切并冻结你打算使用的水果和蔬菜(如果使用菠菜-轻

炖软菠菜然后冻结直到准备使用-如果制作冰糕,使用小到中等大小的食品处理器)
这样你就可以避免添加太多的冰,如果有的话-在制作你的奶昔时。
大约一年后,电机开始发出奇怪的噪音。
我打电话给客服,但保修期已经过了,所以我不得不再买一个。
FYI:这类产品的整体质量已经下降,所以他们有点依赖品牌认知度和消费者忠诚度来维持销售。大约两天就收到了。
"""

reviews = [review_1, review_2, review_3, review_4]
1
2
3
4
5
6
7
8
9
10
11
for i in range(len(reviews)):
prompt = f"""
你的任务是生成一个电子商务网站的产品评论的简短总结。

总结下面由三重反引号括起的评论,最多用20个词。

评论:```{reviews[i]}```
"""

response = get_completion(prompt)
print(i, response, "\n")

案例二:推理(Inferring)

产品评论文本

1
2
3
4
5
6
lamp_review = """
我需要一个漂亮的灯放在我的卧室,这个灯有额外的存储空间,价格也不高。\
收到货很快。在运输过程中,灯的绳子断了,公司很高兴地送来了一个新的。\
几天内就收到了。很容易组装。我缺了一个零件,所以我联系了他们的支持,他们很快就给我寄来了缺失的零件!\
Lumina在我看来是一个非常好的公司,他们关心他们的客户和产品!!
"""

判断情绪(积极/消极)

1
2
3
4
5
6
7
8
prompt = f"""
以下产品评论的情绪是什么,\
评论由三重反引号括起?

评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
1
2
3
4
5
6
7
8
9
10
prompt = f"""
以下产品评论的情绪是什么,\
评论由三重反引号括起?

用一个词给出你的答案,要么是"积极",要么是"消极"。

评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

识别情绪的类型

1
2
3
4
5
6
7
8
prompt = f"""
识别出评论作者表达的一系列情绪。列表中的项目不超过\
五个。将你的答案格式化为由逗号分隔的小写单词列表。

评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

识别愤怒

1
2
3
4
5
6
7
8
9
prompt = f"""
评论作者是否表达了愤怒?\
评论由三重反引号括起。 \
给出你的答案,要么是是,要么是否。

评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

从客户评论中提取产品和公司名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
prompt = f"""
从评论文本中识别以下项目:
- 评论者购买的商品
- 制造该商品的公司

评论由三重反引号括起。 \
将你的回答格式化为一个JSON对象,\
"Item"和"Brand"作为键。
如果信息不存在,使用"unknown" \
作为值。
使你的回答尽可能简短。

评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

同时进行多项任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
prompt = f"""
从评论文本中识别以下项目:
- 判断情绪(积极或消极)
- 评论者是否表达了愤怒?(真或假)
- 评论者购买的商品
- 制造商品的公司

评论以三重反引号为界限。\
将你的回答格式化为一个JSON对象,\
"Sentiment", "Anger", "Item" 和 "Brand" 作为键。
如果信息不存在,使用 "unknown" \
作为值。
尽可能简短地回答。
将 "Anger" 的值格式化为布尔值。

评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

推断主题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
story = """
在政府最近进行的一项调查中,
公共部门的员工被要求对他们所在的部门
进行满意度评价。
结果显示,NASA是最受欢迎的
部门,满意度评分为95%。

一位NASA的员工,John Smith,对这个发现进行了评论,
他说:"我并不惊讶NASA会名列前茅。
这是一个有着出色的人才和
难以置信的机会的工作场所。我为能成为
这样一个创新组织的一部分而感到自豪。"

这个结果也受到了NASA管理团队的欢迎,
总监Tom Johnson表示:"我们很高兴
听到我们的员工对在NASA的工作感到满意。
我们有一个才华横溢且全心投入的团队,他们不懈努力
实现我们的目标,看到他们的辛勤工作得到回报真是太好了。"

调查还显示,社会保障局的满意度
评分最低,只有45%的员工表示他们对自己的工作感到满意。政府已经承诺
解决员工在调查中提出的问题,并
致力于提高所有部门的工作满意度。
"""

推断5个主题

1
2
3
4
5
6
7
8
9
10
11
12
prompt = f"""
确定以下文本中正在讨论的五个主题,
文本以三重反引号为界限。

每个项目长度为一到两个词。

将你的回答格式化为一个由逗号分隔的项目列表。

文本样本:'''{story}'''
"""
response = get_completion(prompt)
print(response)
1
response.split(sep=',')
1
2
3
4
topic_list = [
"nasa", "地方政府", "工程",
"员工满意度", "联邦政府"
]

为特定主题制作新闻警报

1
2
3
4
5
6
7
8
9
10
11
12
13
14
prompt = f"""
确定以下主题列表中的每个项目是否在下面的文本中是一个主题,


本以三重反引号为界限。

将你的答案以列表形式给出,每个主题对应0或1。

主题列表:{", ".join(topic_list)}

文本样本:'''{story}'''
"""
response = get_completion(prompt)
print(response)
1
2
3
topic_dict = {i.split(': ')[0]: int(i.split(': ')[1]) for i in response.split(sep='\n')}
if topic_dict['nasa'] == 1:
print("警告:新的NASA故事!")

案例三:转换(Transforming)

翻译

ChatGPT接受了多种语言的训练。这使得该模型具有翻译能力。以下是一些如何使用这种能力的例子。

1
2
3
4
5
6
prompt = f"""
将以下英文文本翻译为西班牙语: \
```Hi, I would like to order a blender```
"""
response = get_completion(prompt)
print(response)
1
2
3
4
5
6
prompt = f"""
告诉我这是什么语言:
```Combien coûte le lampadaire?```
"""
response = get_completion(prompt)
print(response)
1
2
3
4
5
6
7
prompt = f"""
将以下文本翻译为法语、西班牙语
和英语海盗语: \
```I want to order a basketball```
"""
response = get_completion(prompt)
print(response)
1
2
3
4
5
6
prompt = f"""
将以下文本翻译为西班牙语的正式和非正式形式:
'Would you like to order a pillow?'
"""
response = get_completion(prompt)
print(response)

通用翻译器

假设你负责一家大型跨国电商公司的IT部门。用户用他们的母语向你发送IT问题。你的员工来自世界各地,只会说他们的母语。你需要一个通用翻译器!

1
2
3
4
5
6
7
user_messages = [
"La performance du système est plus lente que d'habitude.", # 系统性能比平时慢
"Mi monitor tiene píxeles que no se iluminan.", # 我的显示器有像素不亮
"Il mio mouse non funziona", # 我的鼠标不工作
"Mój klawisz Ctrl jest zepsuty", # 我的键盘的Ctrl键坏了
"我的屏幕在闪烁" # 我的屏幕在闪烁
]
1
2
3
4
5
6
7
8
9
10
11
for issue in user_messages:
prompt = f"告诉我这是什么语言: ```{issue}```"
lang = get_completion(prompt)
print(f"原始信息 ({lang}): {issue}")

prompt = f"""
将以下文本翻译为英语 \
和韩语: ```{issue}```
"""
response = get_completion(prompt)
print(response, "\n")

语气转换

写作可以根据预期的受众而变化。ChatGPT可以产生不同的语气。

1
2
3
4
5
6
prompt = f"""
将以下的俚语翻译为商业信函的形式:
'Dude, This is Joe, check out this spec on this standing lamp.'
"""
response = get_completion(prompt)
print(response)

格式转换

ChatGPT可以在格式之间进行转换。提示应描述输入和输出的格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data_json = { "resturant employees" :[ 
{"name":"Shyam", "email":"[email protected]"},


{"name":"Bob", "email":"[email protected]"},
{"name":"Jai", "email":"[email protected]"}
]}

prompt = f"""
将以下的python字典从JSON格式转换为带有列标题和标题的HTML \
表格: {data_json}
"""
response = get_completion(prompt)
print(response)
1
2
from IPython.display import display, Markdown, Latex, HTML, JSON
display(HTML(response))

拼写检查/语法检查。

以下是一些常见的语法和拼写问题以及LLM的回应。

要向LLM指示你希望它校对你的文本,你可以指示模型进行’proofread’或’proofread and correct’。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
text = [ 
"The girl with the black and white puppies have a ball.", # 那个女孩有一个球。
"Yolanda has her notebook.", # ok
"Its going to be a long day. Does the car need it’s oil changed?", # 同音异义词
"Their goes my freedom. There going to bring they’re suitcases.", # 同音异义词
"Your going to need you’re notebook.", # 同音异义词
"That medicine effects my ability to sleep. Have you heard of the butterfly affect?", # 同音异义词
"This phrase is to cherck chatGPT for speling abilitty" # 拼写
]
for t in text:
prompt = f"""校对并纠正以下文本
并重写纠正后的版本。如果你没有找到
任何错误,只需说"No errors found"。不要在文本周围
使用任何标点符号:
```{t}```"""
response = get_completion(prompt)
print(response)
1
2
3
4
5
6
7
8
9
10
11
12
13
text = f"""
Got this for my daughter for her birthday cuz she keeps taking \
mine from my room. Yes, adults also like pandas too. She takes \
it everywhere with her, and it's super soft and cute. One of the \
ears is a bit lower than the other, and I don't think that was \
designed to be asymmetrical. It's a bit small for what I paid for it \
though. I think there might be other options that are bigger for \
the same price. It arrived a day earlier than expected, so I got \
to play with it myself before I gave it to my daughter.
"""
prompt = f"校对并纠正这个评论: ```{text}```"
response = get_completion(prompt)
print(response)
1
2
3
4
from redlines import Redlines

diff = Redlines(text,response)
display(Markdown(diff.output_markdown))
1
2
3
4
5
6
7
8
prompt = f"""
校对并纠正这个评论。使它更有吸引力。
确保它遵循APA风格指南并针对高级读者。
以markdown格式输出。
文本: ```{text}```
"""
response = get_completion(prompt)
display(Markdown(response))

案例四:扩展(Expanding)

在这个课程中,你将生成针对每个客户评论的定制客户服务邮件。

定制自动回复客户邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 根据“推断”课程中的情绪,
# 和原始的客户信息,定制邮件
sentiment = "negative"

# 对于一款搅拌机的评论
review = f"""
所以,他们在11月份的季节性销售中仍然有17件套装系统,
大约49美元,大约半价,但是出于某种原因(称之为价格欺诈)
在12月的第二周,同样的系统的价格都涨到了大约70-89美元之间。
而11件套装系统的价格也从之前的销售价格29美元涨了大约10美元左右。
所以它看起来还可以,但是如果你看看底座,那部分
刀片锁定的地方看起来并不如几年前的版本那么好,但是我
打算对它非常温柔(例如,我先在
搅拌机中粉碎非常硬的物品,如豆子、冰块、大米等,然后在我想要的份量中
在搅拌机中将它们粉碎成我想要的份量,然后切换到搅拌
刀片以获得更细的面粉,当制作冰沙时,我首先使用交叉切割刀片
然后如果我需要它们更细/少浆糊的话,我会使用平刀片)。制作冰沙的特别提示,
精细切割并冷冻你打算使用的水果和
蔬菜(如果使用菠菜-轻炖软化菠菜然后冷冻直到准备使用-如果制作
冰糕,使用一个小到中等大小的食品处理器)
这样你就可以避免添加太多的冰,如果有的话-当制作你的冰沙时。
大约一年后,电机开始发出奇怪的噪音。
我打电话给客户服务,但是保修期已经过了,
所以我不得不再买一个。FYI:这类产品的整体质量已经下降,
所以他们有点依赖品牌认知和
消费者的忠诚度来维持销售。大约
两天就收到了。
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
prompt = f"""
你是一个客户服务AI助手。
你的任务是向一位重要客户发送电子邮件回复。
给出由```界定的客户电子邮件,
生成一个回复,感谢客户的评论。
如果情绪是积极

的或中性的,感谢他们的评论。
如果情绪是消极的,道歉并建议他们可以联系客户服务。
确保使用评论中的具体细节。
以简洁、专业的语气写作。
以`AI客户代理`签署邮件。
客户评论:```{review}```
评论情绪:{sentiment}
"""
response = get_completion(prompt)
print(response)

提醒模型使用客户电子邮件中的细节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
prompt = f"""
你是一个客户服务AI助手。
你的任务是向一位重要客户发送电子邮件回复。
给出由```界定的客户电子邮件,
生成一个回复,感谢客户的评论。
如果情绪是积极的或中性的,感谢他们的评论。
如果情绪是消极的,道歉并建议他们可以联系客户服务。
确保使用评论中的具体细节。
以简洁、专业的语气写作。
以`AI客户代理`签署邮件。
客户评论:```{review}```
评论情绪:{sentiment}
"""
response = get_completion(prompt, temperature=0.7)
print(response)

案例五:聊天机器人

1
2
3
4
5
messages =  [  
{'role':'system', 'content':'你是一个会说莎士比亚语的助手。'},
{'role':'user', 'content':'给我讲个笑话'},
{'role':'assistant', 'content':'为什么鸡要过马路'},
{'role':'user', 'content':'我不知道'} ]
1
2
response = get_completion_from_messages(messages, temperature=1)
print(response)
1
2
3
4
5
messages =  [  
{'role':'system', 'content':'你是友好的聊天机器人。'},
{'role':'user', 'content':'嗨,我叫Isa'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
1
2
3
4
5
messages =  [  
{'role':'system', 'content':'你是友好的聊天机器人。'},
{'role':'user', 'content':'是的,你能提醒我,我的名字是什么?'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
1
2
3
4
5
6
7
8
messages =  [  
{'role':'system', 'content':'你是友好的聊天机器人。'},
{'role':'user', 'content':'嗨,我叫Isa'},
{'role':'assistant', 'content': "嗨,Isa!很高兴认识你。\
有什么我可以帮你的吗?"},
{'role':'user', 'content':'是的,你能提醒我,我的名字是什么?'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)

点单机器人

我们可以自动收集用户提示和助手回应,以建立一个点单机器人。点单机器人将在披萨餐厅接受订单。

1
2
3
4
5
6
7
8
9
10
11
12
def collect_messages(_):
prompt = inp.value_input
inp.value = ''
context.append({'role':'user', 'content':f"{prompt}"})
response = get_completion_from_messages(context)
context.append({'role':'assistant', 'content':f"{response}"})
panels.append(
pn.Row('User:', pn.pane.Markdown(prompt, width=600)))
panels.append(
pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))

return pn.Column(*panels)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import panel as pn  # GUI
pn.extension()

panels = [] # collect display

context = [ {'role':'system', 'content':"""
你是OrderBot,一个自动收集披萨餐厅订单的服务。 \
你首先向客户问好,然后收集订单, \
然后询问是自取还是送货。 \
你等待收集整个订单,然后总结它并最后检查一次 \
如果客户想要添加其他东西。 \
如果是送货,你会询问地址。 \
最后你收集付款。\
确保澄清所有选项,额外的和大小以唯一 \
从菜单中识别出项目。\
你以简短,非常会话友好的风格回应。 \
菜单包括 \
pepperoni pizza 12.95, 10.00, 7.00 \
cheese pizza 10.95, 9.25, 6.50 \
eggplant pizza 11.95, 9.75, 6.75 \
fries 4.50, 3.50 \
greek salad 7.25 \
Toppings: \
extra cheese 2.00, \
mushrooms 1.50 \
sausage 3.00 \
canadian bacon 3.50 \
AI sauce 1.50 \
peppers 1.00 \
Drinks: \
coke 3.00, 2.00, 1.00 \
sprite 3.00, 2.00, 1.00 \
bottled water 5.00 \
"""} ] # accumulate messages

inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
button_conversation = pn.widgets.Button(name="Chat!")

interactive_conversation = pn.bind(collect_messages,

button_conversation)

dashboard = pn.Column(
inp,
pn.Row(button_conversation),
pn.panel(interactive_conversation, loading_indicator=True, height=300),
)

dashboard
1
2
3
4
5
6
7
8
9
messages =  context.copy()
messages.append(
{'role':'system', 'content':'创建上一个食品订单的json摘要。为每个项目明细价格\
字段应为1) 披萨,包括大小 2) 配料列表 3) 饮料列表,包括大小 4) 侧菜列表,包括大小 5)总价格 '},
)
#字段应为1) 披萨,价格 2) 配料列表 3) 饮料列表,包括大小,包括价格 4) 侧菜列表,包括大小,包括价格,5)总价格 '},

response = get_completion_from_messages(messages, temperature=0)
print(response)

如果您喜欢此博客或觉得它对您有用,则欢迎对此发表评论。 也欢迎您分享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与我联系以将其删除。 谢谢 !