吴恩达 x ChatGPT提示工程教程
2023年5月18日 · 31min · 中文
原教程: ChatGPT Prompt Engineering for Developers
中文翻译: 吴恩达 x OpenAI的Prompt Engineering课程专业翻译版
中英字幕: 《ChatGPT提示工程》非官方版中英双语字幕
本文是对ChatGPT Prompt Engineering for Developers课程内容的总结归档,另外课程中的英文Prompt也翻译为中文,方便理解和学习。
原则一:清楚和具体的指示
策略1:使用分隔符
- 三重引号:
""" - 三重反引号:
``` - 三重破折号:
--- - 尖括号:
<> - XML标签:
<tag> </tag>
text = f"""
你应该尽可能清晰和具体地表达你希望模型做什么。\
这将引导模型朝着期望的输出方向,\
并减少收到无关或错误回应的机会。不要把写清晰的提示和写短的提示混淆。\
在许多情况下,更长的提示为模型提供了更多的清晰度和上下文,\
这可以导致更详细和相关的输出。
"""
prompt = f"""
将由三重反引号括起的文本总结为一句话。
```{text}```
"""
response = get_completion(prompt)
print(response)
策略2:要求结构化输出
- JSON, HTML
prompt = f"""
生成一个包含三个虚构书名以及它们的作者和类型的列表。
以JSON格式提供,包含以下键:
book_id, title, author, genre.
"""
response = get_completion(prompt)
print(response)
策略3:检查条件是否满足检查完成任务所需的假设
text_1 = f"""
做一杯茶很简单!首先,你需要烧一些开水。在这个过程中,\
拿一个杯子,放入一个茶包。一旦水热了,就把它倒在茶包上。\
让它坐一会儿,让茶可以浸泡。几分钟后,取出茶包。如果你\
喜欢,可以加一些糖或牛奶调味。\
就这样!你就有了一杯美味的茶可以享用了。
"""
prompt = f"""
你将得到由三重反引号括起的文本。
如果它包含一系列的指示,\
将这些指示重写为以下格式:
步骤1 - ...
步骤2 - ...
...
步骤N - ...
如果文本中没有包含一系列的指示,\
那么只需写\"没有提供步骤。\"
'''{text_1}'''
"""
response = get_completion(prompt)
print("对于文本1的完成:")
print(response)
text_2 = f"""
今天阳光明媚,鸟儿在歌唱。这是一个美好的日子,适合在公园散步。花儿在盛开,\
树木在微风中轻轻摇曳。人们都出来了,
享受着美好的天气。有些人在野餐,有些人在玩游戏,或者只是在草地上放松。这是一个完美的日子,可以在户外度过,欣赏大自然的美丽。
"""
prompt = f"""
你将得到由三重引号括起的文本。
如果它包含一系列的指示,\
将这些指示重写为以下格式:
步骤1 - ...
步骤2 - ...
...
步骤N - ...
如果文本中没有包含一系列的指示,\
那么只需写\"没有提供步骤。\"
'''{text_2}'''
"""
response = get_completion(prompt)
print("对于文本2的完成:")
print(response)
策略4:少样本提示。
prompt = f"""
你的任务是以一致的风格回答。
<child>: 教我什么是耐心。
<grandparent>: 深刻的河谷是由一股温和的泉水流出的;\
宏伟的交响乐源于一个单音;\
最复杂的挂毯始于一根孤独的线。
<child>: 教我什么是韧性。
"""
response = get_completion(prompt)
print(response)
原则二:给模型时间”思考”
策略1:明确完成任务所需的步骤
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)
要求以指定格式输出
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:在草率得出结论之前,要求模型自行找出解决方案
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)
注意,学生的解答实际上是不正确的。
我们可以通过指导模型先自己解决问题来修复这个问题。
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)
模型的缺陷:
幻觉
prompt = f"""
告诉我关于Boie的AeroGlide UltraSlim智能牙刷的信息
"""
response = get_completion(prompt)
print("关于Boie的AeroGlide UltraSlim智能牙刷的信息:")
print(response)
对提示进行迭代(Iterative Prompt Development)
🎯迭代流程:想法 → 实现(代码/数据) → 实验结果 → 错误分析 → 重复
提示指南
- 清晰且具体
- 分析为什么结果没有得到期望的输出
- 精炼想法和提示
- 重复
迭代过程
- 尝试某些操作
- 分析结果为何不符合你的期望
- 明确指示,给予更多的思考时间
- 用一批例子来精炼提示
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泡沫
原产地
- 意大利
"""
以下方提示举例:
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。
根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。
技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
错误分析
问题 1. 文本过长
- 限制单词/句子/字符的数量。
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。
根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。
最多使用50个词。
技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
问题 2. 文本关注了错误的细节
- 让它关注对目标受众相关的方面。
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。
根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。
描述面向家具零售商,
所以应该具有技术性质,并关注产品的构造材料。
最多使用50个词。
技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。
根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。
描述面向家具零售商,
所以应该具有技术性质,并关注产品的构造材料。
在描述的最后,包括技术规格中的每个7字符
产品ID。
最多使用50个词。
技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
问题 3. 描述需要一个尺寸表
- 要求它提取信息并将其组织成表格。
prompt = f"""
你的任务是帮助营销团队根据技术规格表创建一个产品的
零售网站描述。
根据在由三重反引号括起的技术规格中提供的信息
编写产品描述。
描述面向家具零售商,
所以应该具有技术性质,并关注产品的构造材料。
在描述的最后,包括技术规格中的每个7字符
产品ID。
在描述之后,包括一个给出产品尺寸的表格。表格应有两列。
在第一列中包括尺寸的名称。
在第二列中只包括英寸的测量。
给表格标题为'产品尺寸'。
将所有内容格式化为可在网站中使用的HTML。
将描述放在<div>元素中。
技术规格:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
案例一:总结文字(Summarizing)
需要总结的文本
prod_review = """
为我女儿的生日买了这个熊猫毛绒玩具,\
她非常喜欢,带着它去处处。它很软,\
超级可爱,脸上的表情看起来很友好。不过我觉得\
我付的钱买到的东西有点小。我觉得可能有\
其他同样价格但更大的选项。它比预期的到货日期早了一天,\
所以我在给她之前自己玩了一下。
"""
用词/句/字符限制进行总结
prompt = f"""
你的任务是生成一个电子商务网站的产品评论的简短总结。
总结下面由三重反引号括起的评论,最多用30个词。
评论:```{prod_review}```
"""
response = get_completion(prompt)
print(response)
总结关注运输和交货的评论
prompt = f"""
你的任务是生成一个电子商务网站的产品评论的简短总结,以便给予\
运输部门反馈。
总结下面由三重反引号括起的评论,最多用30个词,并关注任何提及产品运输和交货的方面。
评论:```{prod_review}```
"""
response = get_completion(prompt)
print(response)
总结关注价格和价值的评论
prompt = f"""
你的任务是生成一个电子商务网站的产品评论的简短总结,以便给予\
负责确定产品价格的定价部门反馈。
总结下面由三重反引号括起的评论,最多用30个词,并关注任何与价格和感知价值相关的方面。
评论:```{prod_review}```
"""
response = get_completion(prompt)
print(response)
- 得到的总结中包括与关注主题无关的话题。
尝试”提取”而不是”总结”
prompt = f"""
你的任务是从电子商务网站的产品评论中提取相关信息,以便给予运输部门反馈。
从下面由三重引号括起的评论中提取与运输和交货相关的信息。限制为30个词。
评论:```{prod_review}```
"""
response = get_completion(prompt)
print(response)
总结多个产品评论
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]
for i in range(len(reviews)):
prompt = f"""
你的任务是生成一个电子商务网站的产品评论的简短总结。
总结下面由三重反引号括起的评论,最多用20个词。
评论:```{reviews[i]}```
"""
response = get_completion(prompt)
print(i, response, "\n")
案例二:推理(Inferring)
产品评论文本
lamp_review = """
我需要一个漂亮的灯放在我的卧室,这个灯有额外的存储空间,价格也不高。\
收到货很快。在运输过程中,灯的绳子断了,公司很高兴地送来了一个新的。\
几天内就收到了。很容易组装。我缺了一个零件,所以我联系了他们的支持,他们很快就给我寄来了缺失的零件!\
Lumina在我看来是一个非常好的公司,他们关心他们的客户和产品!!
"""
判断情绪(积极/消极)
prompt = f"""
以下产品评论的情绪是什么,\
评论由三重反引号括起?
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
prompt = f"""
以下产品评论的情绪是什么,\
评论由三重反引号括起?
用一个词给出你的答案,要么是"积极",要么是"消极"。
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
识别情绪的类型
prompt = f"""
识别出评论作者表达的一系列情绪。列表中的项目不超过\
五个。将你的答案格式化为由逗号分隔的小写单词列表。
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
识别愤怒
prompt = f"""
评论作者是否表达了愤怒?\
评论由三重反引号括起。 \
给出你的答案,要么是是,要么是否。
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
从客户评论中提取产品和公司名称
prompt = f"""
从评论文本中识别以下项目:
- 评论者购买的商品
- 制造该商品的公司
评论由三重反引号括起。 \
将你的回答格式化为一个JSON对象,\
"Item"和"Brand"作为键。
如果信息不存在,使用"unknown" \
作为值。
使你的回答尽可能简短。
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
同时进行多项任务
prompt = f"""
从评论文本中识别以下项目:
- 判断情绪(积极或消极)
- 评论者是否表达了愤怒?(真或假)
- 评论者购买的商品
- 制造商品的公司
评论以三重反引号为界限。\
将你的回答格式化为一个JSON对象,\
"Sentiment", "Anger", "Item" 和 "Brand" 作为键。
如果信息不存在,使用 "unknown" \
作为值。
尽可能简短地回答。
将 "Anger" 的值格式化为布尔值。
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
推断主题
story = """
在政府最近进行的一项调查中,
公共部门的员工被要求对他们所在的部门
进行满意度评价。
结果显示,NASA是最受欢迎的
部门,满意度评分为95%。
一位NASA的员工,John Smith,对这个发现进行了评论,
他说:"我并不惊讶NASA会名列前茅。
这是一个有着出色的人才和
难以置信的机会的工作场所。我为能成为
这样一个创新组织的一部分而感到自豪。"
这个结果也受到了NASA管理团队的欢迎,
总监Tom Johnson表示:"我们很高兴
听到我们的员工对在NASA的工作感到满意。
我们有一个才华横溢且全心投入的团队,他们不懈努力
实现我们的目标,看到他们的辛勤工作得到回报真是太好了。"
调查还显示,社会保障局的满意度
评分最低,只有45%的员工表示他们对自己的工作感到满意。政府已经承诺
解决员工在调查中提出的问题,并
致力于提高所有部门的工作满意度。
"""
推断5个主题
prompt = f"""
确定以下文本中正在讨论的五个主题,
文本以三重反引号为界限。
每个项目长度为一到两个词。
将你的回答格式化为一个由逗号分隔的项目列表。
文本样本:'''{story}'''
"""
response = get_completion(prompt)
print(response)
response.split(sep=',')
topic_list = [
"nasa", "地方政府", "工程",
"员工满意度", "联邦政府"
]
为特定主题制作新闻警报
prompt = f"""
确定以下主题列表中的每个项目是否在下面的文本中是一个主题,
文
本以三重反引号为界限。
将你的答案以列表形式给出,每个主题对应0或1。
主题列表:{", ".join(topic_list)}
文本样本:'''{story}'''
"""
response = get_completion(prompt)
print(response)
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接受了多种语言的训练。这使得该模型具有翻译能力。以下是一些如何使用这种能力的例子。
prompt = f"""
将以下英文文本翻译为西班牙语: \
```Hi, I would like to order a blender```
"""
response = get_completion(prompt)
print(response)
prompt = f"""
告诉我这是什么语言:
```Combien coûte le lampadaire?```
"""
response = get_completion(prompt)
print(response)
prompt = f"""
将以下文本翻译为法语、西班牙语
和英语海盗语: \
```I want to order a basketball```
"""
response = get_completion(prompt)
print(response)
prompt = f"""
将以下文本翻译为西班牙语的正式和非正式形式:
'Would you like to order a pillow?'
"""
response = get_completion(prompt)
print(response)
通用翻译器
假设你负责一家大型跨国电商公司的IT部门。用户用他们的母语向你发送IT问题。你的员工来自世界各地,只会说他们的母语。你需要一个通用翻译器!
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键坏了
"我的屏幕在闪烁" ## 我的屏幕在闪烁
]
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可以产生不同的语气。
prompt = f"""
将以下的俚语翻译为商业信函的形式:
'Dude, This is Joe, check out this spec on this standing lamp.'
"""
response = get_completion(prompt)
print(response)
格式转换
ChatGPT可以在格式之间进行转换。提示应描述输入和输出的格式。
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)
from IPython.display import display, Markdown, Latex, HTML, JSON
display(HTML(response))
拼写检查/语法检查。
以下是一些常见的语法和拼写问题以及LLM的回应。
要向LLM指示你希望它校对你的文本,你可以指示模型进行’proofread’或’proofread and correct’。
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)
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)
from redlines import Redlines
diff = Redlines(text,response)
display(Markdown(diff.output_markdown))
prompt = f"""
校对并纠正这个评论。使它更有吸引力。
确保它遵循APA风格指南并针对高级读者。
以markdown格式输出。
文本: ```{text}```
"""
response = get_completion(prompt)
display(Markdown(response))
案例四:扩展(Expanding)
在这个课程中,你将生成针对每个客户评论的定制客户服务邮件。
定制自动回复客户邮件
## 根据“推断”课程中的情绪,
## 和原始的客户信息,定制邮件
sentiment = "negative"
## 对于一款搅拌机的评论
review = f"""
所以,他们在11月份的季节性销售中仍然有17件套装系统,
大约49美元,大约半价,但是出于某种原因(称之为价格欺诈)
在12月的第二周,同样的系统的价格都涨到了大约70-89美元之间。
而11件套装系统的价格也从之前的销售价格29美元涨了大约10美元左右。
所以它看起来还可以,但是如果你看看底座,那部分
刀片锁定的地方看起来并不如几年前的版本那么好,但是我
打算对它非常温柔(例如,我先在
搅拌机中粉碎非常硬的物品,如豆子、冰块、大米等,然后在我想要的份量中
在搅拌机中将它们粉碎成我想要的份量,然后切换到搅拌
刀片以获得更细的面粉,当制作冰沙时,我首先使用交叉切割刀片
然后如果我需要它们更细/少浆糊的话,我会使用平刀片)。制作冰沙的特别提示,
精细切割并冷冻你打算使用的水果和
蔬菜(如果使用菠菜-轻炖软化菠菜然后冷冻直到准备使用-如果制作
冰糕,使用一个小到中等大小的食品处理器)
这样你就可以避免添加太多的冰,如果有的话-当制作你的冰沙时。
大约一年后,电机开始发出奇怪的噪音。
我打电话给客户服务,但是保修期已经过了,
所以我不得不再买一个。FYI:这类产品的整体质量已经下降,
所以他们有点依赖品牌认知和
消费者的忠诚度来维持销售。大约
两天就收到了。
"""
prompt = f"""
你是一个客户服务AI助手。
你的任务是向一位重要客户发送电子邮件回复。
给出由```界定的客户电子邮件,
生成一个回复,感谢客户的评论。
如果情绪是积极
的或中性的,感谢他们的评论。
如果情绪是消极的,道歉并建议他们可以联系客户服务。
确保使用评论中的具体细节。
以简洁、专业的语气写作。
以`AI客户代理`签署邮件。
客户评论:```{review}```
评论情绪:{sentiment}
"""
response = get_completion(prompt)
print(response)
提醒模型使用客户电子邮件中的细节
prompt = f"""
你是一个客户服务AI助手。
你的任务是向一位重要客户发送电子邮件回复。
给出由```界定的客户电子邮件,
生成一个回复,感谢客户的评论。
如果情绪是积极的或中性的,感谢他们的评论。
如果情绪是消极的,道歉并建议他们可以联系客户服务。
确保使用评论中的具体细节。
以简洁、专业的语气写作。
以`AI客户代理`签署邮件。
客户评论:```{review}```
评论情绪:{sentiment}
"""
response = get_completion(prompt, temperature=0.7)
print(response)
案例五:聊天机器人
messages = [
{'role':'system', 'content':'你是一个会说莎士比亚语的助手。'},
{'role':'user', 'content':'给我讲个笑话'},
{'role':'assistant', 'content':'为什么鸡要过马路'},
{'role':'user', 'content':'我不知道'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
messages = [
{'role':'system', 'content':'你是友好的聊天机器人。'},
{'role':'user', 'content':'嗨,我叫Isa'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
messages = [
{'role':'system', 'content':'你是友好的聊天机器人。'},
{'role':'user', 'content':'是的,你能提醒我,我的名字是什么?'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
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)
点单机器人
我们可以自动收集用户提示和助手回应,以建立一个点单机器人。点单机器人将在披萨餐厅接受订单。
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)
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
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)