吴恩达《 提示工程》学习笔记

2023-09-12 09:33:59 浏览数 (3)

一、前言

ChatGPT出圈后,网上有很多提示词大全,这些提示词库里的提示词通常用于实现一次性的特定任务。但是从开发人员视角来看,使用大语言模型API来快速构建应用程序的能力还没得到充分的利用。

吴恩达的《ChatGPT 提示工程》课程主要是分享使用大语言模型API来构建应用程序的一些可行性,以及如何构建的最佳实践。

在基于LLM进行开发的过程中,大语言模型可以分为两种类型:

  • Base LLM: 预测下一个单词,基于文本训练数据。
  • Instruction Turned LLM: 指令转化LLM。 尝试遵循指令,基于指令进行微调然后遵循指令。Instruction Turned LLM使用RLHF(基于人类反馈的强化学习)。 Instruction Turned LLM更易用,更安全。

二、提示工程关键原则

1. 原则一:使用清晰明确的指令

我们应用通过提供尽可能清晰和明确的指令,来告诉ChatGPT我们系统它做什么。从而减少模型回复不相关内容的概率。 

这里“清晰和明确的指令”不同于“简洁”的指令,事实上,提供尽可能详细的指令有助于ChatGPT更好地理解。

那么,如何编写清晰明确的指令?

策略一: 使用分隔符清楚地指示输入的不同部分。

举个栗子,我们有一个文本片段,然后希望ChatGPT将这个文本片段进行总结

代码语言:javascript复制
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import openai
import os
# from dotenv import load_dotenv, find_dotenv

openai.api_key = os.getenv("CHATGPT_API_KEY")

def get_completion(prompt, model="gpt-3.5-turbo"):
    messages = [{"role":"user", "content":prompt}]
    response = openai.ChatCompletion.create(
        model = model,
        messages = messages,
        temperature = 0,
    )
    return response.choices[0].message["content"]

text = f"""
报道称,林绍波今日在广州出席“粤港合作周”启动仪式暨SmartHK“推动高质量发展·香港论坛”。他会见记者时回应事件,用普通话再次致歉。他表示,今后将会带领一个工作小组全面检讨,审视公司服务流程等相关制度,改善相关方面的情况。
林绍波还称,此次事件对国泰航空品牌形象有负面影响,特别是在内地,但希望能给予国泰航空机会改善服务。
近日,有内地网民在网上曝光香港国泰航空乘务员歧视不说英语的乘客。23日晚,林绍波发声明,向受影响乘客及社会各界致歉,并对3名涉事乘务员予以解聘。
据香港文汇网报道,香港特别行政区行政长官李家超今日上午也出席上述活动开幕式,他在致辞时表示,对香港国泰航空公司有关人员对内地乘客做出不尊重的言行感到痛心,称这些恶劣行为伤害了香港和内地同胞的感情,破坏了香港一贯的尊重、有礼的文化和价值观。李家超表示,他已向国泰航空行政总裁林绍波提出,此次事件属于严重事件,国泰航空需进行检讨,类似情况不容再次发生。
"""

prompt = f"""
请将下面三个反引号包含的内容总结成一句话,
```
{text}
```
"""

response = get_completion(prompt=prompt)
print(response)

上述栗子中,我们将要总结的文本片段使用3重反引号包裹起来,从而将文本的内容与Prompt指令加以区别。

代码运行结果:

代码语言:javascript复制
(HelloPython) ➜  HelloChatGPT git:(main) ✗ python3 main.py
国泰航空事件引发内地网民不满,香港特首李家超表示痛心,要求国泰航空进行检讨,国泰航空行政总裁林绍波向受影响乘客及社会致歉并解聘3名涉事乘务员。
(HelloPython) ➜  HelloChatGPT git:(main) ✗ 

分隔符既可以是反引号这种标点符号,也可以是XML标签等其他的符号,总而言之,就是为了帮助模型理解输入的各个部分。

如果我们不使用分隔符加以分隔,且要总结的文本里出现“忘记之前的指令”等内容时,就有可能导致ChatGPT模型无法理解我们的真实意图。

策略二,要求结构化的输出

要求模型提供结构化的输出(如json、html、xml等格式),对我们基于模型构建应用很有帮助。

举个栗子:

代码语言:javascript复制
prompt = f"""
请帮忙提供一份由三本书组成的书籍列表,包含三个字段’书名‘,‘作者’,‘流派’; 
请使用json 列表格式回复,并使用‘book_name', 'authors', 'genres'作为key
"""

response = get_completion(prompt=prompt)
print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloChatGPT git:(main) ✗ python3 main.py
[
  {
    "book_name": "1984",
    "authors": "George Orwell",
    "genres": "Dystopian Fiction"
  },
  {
    "book_name": "To Kill a Mockingbird",
    "authors": "Harper Lee",
    "genres": "Southern Gothic Fiction"
  },
  {
    "book_name": "The Catcher in the Rye",
    "authors": "J.D. Salinger",
    "genres": "Coming-of-Age Fiction"
  }
]
(HelloPython) ➜  HelloChatGPT git:(main) ✗ 

类似这种格式化的应答结果,可以让我们很便捷地就可以将应答内容(通过python等)加载到我们的应用程序中的数组和list。

策略三:检查我们的条件、假定是否被满足

通过在指令中设定条件/假定,可以帮助模型更好的输出我们想要的内容

栗子01: 满足我们指定的条件

代码语言:javascript复制
text = f"""
糖醋排骨的菜谱:

所需材料:

猪排骨 500克
面粉 适量
食用油 适量
青椒 1个
红椒 1个
姜 适量
蒜 适量
醋 50毫升
番茄酱 50克
糖 50克
盐 适量
生抽 适量
料酒 适量
水淀粉 适量
步骤:

将猪排骨洗净,切成小段,用盐、生抽、料酒腌制20分钟。
在腌制的排骨上均匀地撒上一层面粉,用手搓匀。
热锅凉油,将排骨放入锅中煎至两面金黄色,捞出沥干油。
将锅中的油倒出,留下少量底油,加入姜蒜末煸炒出香味。
加入青椒、红椒翻炒,再加入番茄酱、糖、醋、盐和适量的水,煮沸后转小火煮5分钟。
将煮好的酱汁倒入煎好的排骨上,翻炒均匀,再加入适量的水淀粉勾芡即可。
糖醋排骨是一道口感酸甜可口的传统中式菜肴,适合搭配米饭或面条食用。
"""


prompt = f"""
你将得到一段使用三个反引号包含的内容的简单文本。
如果文本中包含一系列指令则安下列格式重写文本内容:

第一步: ...
第二步:...
...
第三步: ...

如果文本中不包含指令序列,则简写这段文本

```{text}```
"""

response = get_completion(prompt=prompt)
print(response)

运行结果:

代码语言:javascript复制
(HelloPython) ➜  HelloChatGPT git:(main) ✗ python3 main.py 
第一步:将猪排骨洗净,切成小段,用盐、生抽、料酒腌制20分钟。
第二步:在腌制的排骨上均匀地撒上一层面粉,用手搓匀。
第三步:热锅凉油,将排骨放入锅中煎至两面金黄色,捞出沥干油。
第四步:将锅中的油倒出,留下少量底油,加入姜蒜末煸炒出香味。
第五步:加入青椒、红椒翻炒,再加入番茄酱、糖、醋、盐和适量的水,煮沸后转小火煮5分钟。
第六步:将煮好的酱汁倒入煎好的排骨上,翻炒均匀,再加入适量的水淀粉勾芡即可。糖醋排骨是一道口感酸甜可口的传统中式菜肴,适合搭配米饭或面条食用。
(HelloPython) ➜  HelloChatGPT git:(main) ✗ 

栗子02: 不满足我们的条件:

代码语言:javascript复制
text = f"""
报道称,林绍波今日在广州出席“粤港合作周”启动仪式暨SmartHK“推动高质量发展·香港论坛”。他会见记者时回应事件,用普通话再次致歉。他表示,今后将会带领一个工作小组全面检讨,审视公司服务流程等相关制度,改善相关方面的情况。
林绍波还称,此次事件对国泰航空品牌形象有负面影响,特别是在内地,但希望能给予国泰航空机会改善服务。
近日,有内地网民在网上曝光香港国泰航空乘务员歧视不说英语的乘客。23日晚,林绍波发声明,向受影响乘客及社会各界致歉,并对3名涉事乘务员予以解聘。
据香港文汇网报道,香港特别行政区行政长官李家超今日上午也出席上述活动开幕式,他在致辞时表示,对香港国泰航空公司有关人员对内地乘客做出不尊重的言行感到痛心,称这些恶劣行为伤害了香港和内地同胞的感情,破坏了香港一贯的尊重、有礼的文化和价值观。李家超表示,他已向国泰航空行政总裁林绍波提出,此次事件属于严重事件,国泰航空需进行检讨,类似情况不容再次发生。
"""

prompt = f"""
你将得到一段使用三个反引号包含的内容的简单文本。
如果文本中包含一系列指令则安下列格式重写文本内容:

第一步: ...
第二步:...
...
第三步: ...

如果文本中不包含指令序列,则简写这段文本

```{text}```
"""

response = get_completion(prompt=prompt)
print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloChatGPT git:(main) ✗ python3 main.py
报道称,林绍波今日在广州出席“粤港合作周”启动仪式暨SmartHK“推动高质量发展·香港论坛”。他会见记者时回应事件,用普通话再次致歉。他表示,今后将会带领一个工作小组全面检讨,审视公司服务流程等相关制度,改善相关方面的情况。林绍波还称,此次事件对国泰航空品牌形象有负面影响,特别是在内地,但希望能给予国泰航空机会改善服务。近日,有内地网民在网上曝光香港国泰航空乘务员歧视不说英语的乘客。23日晚,林绍波发声明,向受影响乘客及社会各界致歉,并对3名涉事乘务员予以解聘。据香港文汇网报道,香港特别行政区行政长官李家超今日上午也出席上述活动开幕式,他在致辞时表示,对香港国泰航空公司有关人员对内地乘客做出不尊重的言行感到痛心,称这些恶劣行为伤害了香港和内地同胞的感情,破坏了香港一贯的尊重、有礼的文化和价值观。李家超表示,他已向国泰航空行政总裁林绍波提出,此次事件属于严重事件,国泰航空需进行检讨,类似情况不容再次发生。
(HelloPython) ➜  HelloChatGPT git:(main) ✗ 

策略四: 在Prompt中提供一些已完成的成功示例

栗子01

代码语言:javascript复制
prompt = f"""
你的任务是按照一致的风格来回答问题

学生: 请告诉我关于”负荆请罪“的内容
老师: 成语“负荆请罪”出自《史记·廉颇蔺相如列传》,讲述的事战国时期廉颇蔺相如的故事。

学生: 请告诉我关于“桃园结义”的内容
"""

response = get_completion(prompt=prompt)
print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloChatGPT git:(main) ✗ python3 main.py
老师: 成语“桃园结义”出自《三国演义》,讲述的是三位义兄弟在桃园中结义的故事。
(HelloPython) ➜  HelloChatGPT git:(main) ✗ 

2. 原则二:给ChatGPT思考的时间 

如果一个模型只是进行匆忙的推理,那就很可能得到错误的结论。相反,得到充分的推理、计算再进行回复,可以得到更加准确的结果。

策略一:指定完成任务所需要的步骤

栗子01:

代码语言:python代码运行次数:0复制
text = f"""
报道称,林绍波今日在广州出席“粤港合作周”启动仪式暨SmartHK“推动高质量发展·香港论坛”。他会见记者时回应事件,用普通话再次致歉。他表示,今后将会带领一个工作小组全面检讨,审视公司服务流程等相关制度,改善相关方面的情况。
林绍波还称,此次事件对国泰航空品牌形象有负面影响,特别是在内地,但希望能给予国泰航空机会改善服务。
近日,有内地网民在网上曝光香港国泰航空乘务员歧视不说英语的乘客。23日晚,林绍波发声明,向受影响乘客及社会各界致歉,并对3名涉事乘务员予以解聘。
据香港文汇网报道,香港特别行政区行政长官李家超今日上午也出席上述活动开幕式,他在致辞时表示,对香港国泰航空公司有关人员对内地乘客做出不尊重的言行感到痛心,称这些恶劣行为伤害了香港和内地同胞的感情,破坏了香港一贯的尊重、有礼的文化和价值观。李家超表示,他已向国泰航空行政总裁林绍波提出,此次事件属于严重事件,国泰航空需进行检讨,类似情况不容再次发生。
"""

prompt = f"""
请针对下面三个反引号括起来的文本执行以下步骤:
1. 用一句话总结这段文本。
2. 将文本内容翻译成英语
3. 列出文本中的姓名
4. 输出一个json对象,包含以下字段,'name'表示姓名,'num'表示出现次数

请使用换行符分隔答案的每一个步骤。

```{text}```

"""


response = get_completion(prompt=prompt)
print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloChatGPT git:(main) ✗ python3 main.py
1. 国泰航空乘务员歧视内地乘客事件后续报道及相关人士回应。
2. The article reports on the follow-up of the incident where Cathay Pacific Airways flight attendants discriminated against mainland Chinese passengers, and the responses from relevant individuals.
3. 林绍波、李家超
4. {"name": "林绍波", "num": 2}, {"name": "李家超", "num": 2}
(HelloPython) ➜  HelloChatGPT git:(main) ✗ 

策略二: 指示模型在给出结论前先进行推理分析

栗子01: 直接给出答案

代码语言:javascript复制
prompt = f"""
你的任务是判断学生的答案是否正确。

问题:
```
小明到烧烤店吃烧烤,肉串:5元/串,鸡翅: 10元/串,小明点了8串肉串,2串鸡翅。烧烤店有满100减5(优惠前金额超过100元可以使用)优惠活动。
请问小明需要支付多少钱。
```
学生答案:
```
小明的总账单是:`5*8   10*2`,扣去满减金额,因此需要支付: 5*8   2*5  - 5  = 55元
```

"""


response = get_completion(prompt=prompt)
print(response)

运行结果:

代码语言:javascript复制
(HelloPython) ➜  HelloChatGPT git:(main) ✗ python3 main.py
学生答案正确。
(HelloPython) ➜  HelloChatGPT git:(main) ✗ 

栗子02 经过推理分析:

代码语言:javascript复制
prompt = f"""
你的任务是根据问题描述判断学生的答案是否正确。

在判断答案是否正确之前,你需要做的事情:
1. 自己分析问题,计算出账单金额,判断是否满足满减的优惠活动,并通过数学计算得到小明需要支付的金额。
2. 将自己的答案与学生的答案进行对比,如果一直则学生的答案是正确的,否则学生的答案就是错误的。

问题:
```
小明到烧烤店吃烧烤,肉串:5元/串,鸡翅: 10元/串,小明点了8串肉串,2串鸡翅。烧烤店有满100减5(优惠前金额超过100元可以使用)优惠活动。
请问小明需要支付多少钱。
```
学生答案:
```
小明的总账单是:`5*8   10*2`,扣去满减金额,因此需要支付: 5*8   2*5  - 5  = 55元
```

你需要给出你的分析过程的计算结果。 最后再判断学生的答案是否正确。
"""


response = get_completion(prompt=prompt)
print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloChatGPT git:(main) ✗ python3 main.py
小明点了8串肉串,每串5元,共40元;点了2串鸡翅,每串10元,共20元。总共消费60元,不满足满减优惠条件,因此不享受优惠活动。小明需要支付60元。

学生的答案是错误的。
(HelloPython) ➜  HelloChatGPT git:(main) ✗ 

3. 模型的限制

  • 不清楚自己的知识边界,会给出一些事实性错误的结论。

三、提示工程需要迭代

在使用大语言模型构建大型应用程序的时候,第一次prompt 尝试就能有效工作几率并不高。不过这没什么关系,只要持续迭代、尝试,最终往往就能得到可以有效工作的prompt。

  • 1.  编写清晰明确的prompt
  • 2.  分析为什么没有得到期望的回复
  • 3. 调整idea和prompt
  • 4. 重复前面三个步骤,指导得到期望的回复。

下面以总结摘要类的应用作为例子,对一份手机的技术规格说明书,编写宣传文案。

技术说明书如下:

代码语言:javascript复制
text = f"""
主体: 入网型号 A2896
机型: Apple iPhone 14 Pro Max
基本信息: 机身颜色 暗紫色
机身重量: 240g
CPU型号: A16
机身尺寸: 宽77.6mm;长160.7mm;厚7.85mm
存储: 存储卡不支持
机身内存: 256GB

屏幕
屏幕分辨率: 2796 x 1290
屏幕材质: OLED直屏
屏幕特色: 无
屏幕尺寸: 6.7英寸

电池信息: 
    充电功率 20W 无线充电: 20W及以下
操作系统: 系统iOS
网络支持: 5G网络,支持5G、4G网络、4G FDD-LTE;4G TD-LTE
SIM卡类型: Nano SIM
双卡机类型:  双卡双待
SIM卡数量: 2个
数据接口: 耳机接口,Lightning,
充电接口: Lightning
数据接口: WIFI;NFC;蓝牙
手机特性: 生物识别人脸识别
摄像头: 后摄主像素4800万像素 后摄2-超广角像素 1200万像素 后摄3-tele像素 1200万像素
前摄主像素: 1200万像素
包装清单: 装有 iOS 16 的 iPhone*1 USB-C 转闪电连接线*1 资料*1
"""

第一次prompt

代码语言:javascript复制
prompt = f"""
你的任务是,根据下面三个反括号内的技术规格说明文本,为销售营销团队写一份营销文案.

技术规格说明书: ```{text}```
"""

response = get_completion(prompt=prompt)
print(response)

运行结果:

代码语言:javascript复制
(HelloPython) ➜  HelloChatGPT git:(main) ✗ python3 iterative.py 
营销文案:

全新 Apple iPhone 14 Pro Max,让你的生活更加精彩!

想要一款既美观又实用的手机吗?那就选择 Apple iPhone 14 Pro Max 吧!它采用了暗紫色的机身设计,让你在人群中脱颖而出。同时,它的重量只有 240g,轻盈便携,随时随地都能带着它出门。

Apple iPhone 14 Pro Max 搭载了 A16 CPU,性能强劲,让你的手机使用更加流畅。同时,它的存储空间达到了 256GB,让你可以存储更多的照片、视频和文件。

屏幕方面,Apple iPhone 14 Pro Max 采用了 6.7 英寸的 OLED 直屏,分辨率高达 2796 x 1290,让你的视觉体验更加震撼。同时,它还支持 5G 网络,让你的上网速度更快。

Apple iPhone 14 Pro Max 还拥有强大的电池续航能力,支持 20W 的有线充电和无线充电,让你的手机随时保持充足电量。

在摄像方面,Apple iPhone 14 Pro Max 拥有后摄主像素 4800 万像素,后摄 2 超广角像素 1200 万像素,后摄 3 tele 像素 1200 万像素,前摄主像素 1200 万像素,让你的拍照更加清晰、美丽。

最后,Apple iPhone 14 Pro Max 还支持生物识别和人脸识别,让你的手机更加安全可靠。

购买 Apple iPhone 14 Pro Max,你将获得一部美观、实用、性能强劲的手机,让你的生活更加精彩!
(HelloPython) ➜  HelloChatGPT git:(main) ✗ 

可以看到,ChatGPT基于技术规格说明书,完成了宣传文案的编写,但是它太长了。

我们对prompt进行迭代,加入字数的限制。

代码语言:javascript复制
prompt = f"""
你的任务是,根据下面三个反括号内的技术规格说明文本,为销售营销团队写一份营销文案.

你最多只能使用100个字来编写文案。

技术规格说明书: ```{text}```
"""

response = get_completion(prompt=prompt)
print(response)
print(len(response))

运行结果:

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 iterative.py
iPhone 14 Pro Max,暗紫色,6.7英寸OLED直屏,256GB内存,支持5G网络,20W无线充电,生物/人脸识别,后置4800万像素 超广角 tele,前置1200万像素。iOS 16系统,附赠USB-C转闪电连接线。
117
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

可以看到,文案的内容得到了较大的精简。ChatGPT不会严格地限制到100个字符,但是其结果仍然是在合理范围内的。

继续迭代,我们让他使用三句话来编写文案:

代码语言:javascript复制
prompt = f"""
你的任务是,根据下面三个反括号内的技术规格说明文本,为销售营销团队写一份营销文案.

你需要使用三句话来编写这份文案。

技术规格说明书: ```{text}```
"""

response = get_completion(prompt=prompt)
print(response)
print(len(response))

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 iterative.py
1. 体验更强大的5G网络,选择入网型号A2896的Apple iPhone 14 Pro Max。
2. 暗紫色的机身,配合6.7英寸OLED直屏,让你的视觉享受更上一层楼。
3. 4800万像素后摄主像素和1200万像素超广角像素、tele像素,让你的拍照更加出色。
135
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

继续迭代,面向摄影爱好者,重点描述摄像头相关信息

代码语言:javascript复制
prompt = f"""
你的任务是,基于下面三个反括号内的技术规格说明文本,为该手机中国的销售营销团队写一份营销文案.

请使用不超过300个字来编写文案。
你需要在文案中重点描述摄像头相关信息。

技术规格说明书: ```{text}```
"""

response = get_completion(prompt=prompt)
print(response)
print(len(response))

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 iterative.py
全新iPhone 14 Pro Max,摄影新境界!4800万像素主摄像头,1200万像素超广角和tele摄像头,让你随时随地记录生活美好瞬间。6.7英寸OLED直屏,色彩鲜艳,细节清晰,让你沉浸于视觉盛宴。20W无线充电,快速充电,让你无忧无虑。生物识别和人脸识别,保护你的隐私安全。入网型号A2896,支持5G、4G网络,Nano SIM双卡双待,轻松切换。256GB机身内存,存储无忧。购买即送iOS 16,让你体验更多新功能。选择iPhone 14 Pro Max,记录美好,留住回忆!
247
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

可以看到输出的结果中重点描述了摄像头相关的内容。

继续迭代,以html网页的格式输出文案。

代码语言:javascript复制
prompt = f"""
你的任务是,基于下面三个反括号内的技术规格说明文本,为该手机中国的销售营销团队写一份营销文案.

你需要在文案中先做三句话的总结。
你需要在文案中重点描述摄像头相关信息。
你需要以HTML网页的格式输出文案。

技术规格说明书: ```{text}```
"""

response = get_completion(prompt=prompt)
print(response)
print(len(response))

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 iterative.py
总结:Apple iPhone 14 Pro Max是一款支持5G网络的手机,拥有强大的A16 CPU和256GB机身内存,配备了高像素的后置摄像头和生物识别/人脸识别等多种手机特性。

摄像头是Apple iPhone 14 Pro Max的一大亮点。后置摄像头主像素高达4800万像素,同时还有超广角像素和tele像素,可以拍摄出更加清晰、细腻的照片和视频。前置摄像头也有1200万像素,可以满足用户自拍和视频通话的需求。

<!DOCTYPE html>
<html>
<head>
        <title>Apple iPhone 14 Pro Max</title>
        <meta charset="utf-8">
</head>
<body>
        <h1>Apple iPhone 14 Pro Max</h1>
        <h2>摄像头</h2>
        <p>后置摄像头主像素高达4800万像素,同时还有超广角像素和tele像素,可以拍摄出更加清晰、细腻的照片和视频。前置摄像头也有1200万像素,可以满足用户自拍和视频通话的需求。</p>
        <h2>基本信息</h2>
        <ul>
                <li>机身颜色:暗紫色</li>
                <li>机身重量:240g</li>
                <li>机身尺寸:宽77.6mm;长160.7mm;厚7.85mm</li>
                <li>存储:存储卡不支持,机身内存256GB</li>
        </ul>
        <h2>屏幕</h2>
        <ul>
                <li>屏幕分辨率:2796 x 1290</li>
                <li>屏幕材质:OLED直屏</li>
                <li>屏幕尺寸:6.7英寸</li>
        </ul>
        <h2>电池信息</h2>
        <ul>
                <li>充电功率:20W</li>
                <li>无线充电:20W及以下</li>
        </ul>
        <h2>操作系统</h2>
        <p>iOS系统</p>
        <h2>网络支持</h2>
        <ul>
                <li>5G网络,支持5G、4G网络、4G FDD-LTE;4G TD-LTE</li>
                <li>SIM卡类型:Nano SIM</li>
                <li>双卡机类型:双卡双待,SIM卡数量2个</li>
        </ul>
        <h2>数据接口</h2>
        <ul>
                <li>耳机接口</li>
                <li>Lightning接口</li>
                <li>WIFI</li>
                <li>NFC</li>
                <li>蓝牙</li>
        </ul>
        <h2>手机特性</h2>
        <p>生物识别/人脸识别</p>
        <h2>包装清单</h2>
        <ul>
                <li>iOS 16的iPhone*1</li>
                <li>USB-C转闪电连接线*1</li>
                <li>资料*1</li>
        </ul>
</body>
</html>
1197
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

总结:

prompt 迭代过程:

  1. 先尝试一个我们认为可行的prompt
  2. 分析为什么结果没有达到我们的预期
  3. 优化prompt指令,并让模型有更多时间思考。
  4. 通过一系列的尝试,完善prompt

四、摘要类应用

当前世界充斥着大量的文本内容,基于没有人有足够的时间阅读他希望阅读的内容。大语言模型的一个重要的应用就是帮助人类对文本进行总结。

以电商场景为例,一个产品可能会有大量的评论,可以利用大语言模型帮助生成评论摘要。

栗子-01

代码语言:javascript复制
# 摘自京东商城iPhone14Pro的商品评论
prod_review = f"""
11Pro升级14Pro,现在知道了年年换新和隔几代换的区别,每年换的话确实升级不大,隔了两代再换感觉很值,到现在11还很流畅就是电池老化了然后杀后台,升级点很多,首先外观从圆润边框变成直边框,5G网络,高刷新率,还有就是14Pro系列的灵动岛,拍照视频方面也升级了很多,做工很外面,并没有网上说的摄像头进灰和边框屏幕中间插纸的那种问题,这次升级的很完美,爱了。
"""

prompt = f"""
你的任务是将下面三个反引号内的商品评论总结成一个简短的摘要。
```{prod_review}```
"""

response = get_completion(prompt=prompt)
print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 summary.py
11Pro升级14Pro,外观、5G网络、高刷新率、拍照视频等方面都有很大提升,做工很精细,升级很完美。
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

与我们在前面《提示工程需要迭代》章节中的例子类似,我们可以针对特定部门/目的,对商品评论总结摘要:

代码语言:javascript复制
# 摘自某东商城iPhone14Pro的商品评论
prod_review = f"""
很棒!最终还是从三星换回了iPhone,和之前一样熟悉,运行起来也十分流畅,系统及各方面的设置都突出一个简约干净!这代在拍照方面也非常出色!(如图8、9所示)
机子从内而外没有任何问题,续航比起三星的小杯来说相当可以,日常使用一天一充足矣!而外观相较于老机型这次很漂亮,用惯三星后感觉iPhone稍微重那么一点点,而整体上也是可以接受的,信号还行,没想象中的差!只是目前灵动岛功能感觉可有可无,作用不大,权当一个挖孔屏对待,所以可忽略。
因为仅用来日常使用,游戏运行方面不做评价(不玩手机游戏),而本次购物体验方面无论是发货速度,还是派送速度都很快,客服的服务态度也很赞!机子隔一晚上就收到了,总之,真的非常满意诶!是一次相当顺心愉快的购物体验!
"""

prompt = f"""
你的任务是将下面三个反引号内的商品评论进行总结,并针对物流部门、客服部门、生产部分分别生成简短的摘要。

商品评论如下
```{prod_review}```
"""

response = get_completion(prompt=prompt)
print(response)

运行结果:

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 summary.py
总结:该用户对iPhone的使用体验非常满意,包括系统流畅、拍照出色、外观漂亮等方面。续航表现也很好,日常使用一天一充足矣。购物体验方面,物流速度快,客服服务态度好。

物流部门摘要:发货速度快,派送速度也很快,用户隔一晚上就收到了商品。

客服部门摘要:客服服务态度很赞,用户对购物体验非常满意。

生产部门摘要:用户对iPhone的使用体验非常满意,包括系统流畅、拍照出色、外观漂亮等方面。续航表现也很好,日常使用一天一充足矣。
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

五、推理类应用

在传统的机器学习工作流程中,如果你想要提取一段文本的积极和消极的内容,你必须收集标签数据集,训练模型,部署模型,然后进行推理。  对于不同类型的文本,我们可能都需要单独训练模型。

现在,有了ChatGPT这样的大语言模型,我只需要编写一个prompt,就可以很好的完成这类任务,省去了折腾的过程。

栗子-01 (选自某点评里某家餐厅的评论)

代码语言:javascript复制
review_01 = f"""
环境还是可以,我们坐的大厅,需要提前一点来,晚了要排队,食材看着选,马上选马上杀,很不错,很新鲜,第一名的避风塘蟹我感觉比较一般,但是花胶海参汤很惊艳.印象比较深的有盐焗花螺和三椒烤虾.总体味道比较清淡和我们大成都香辣口味相比是另外一种感觉,很适合老人小孩这种家庭聚餐.
"""

review_02 = f"""
点餐都要排队,第一次遇到!可能生意太好了,点餐的人多,所以服务也差,整餐饭直到我们吃完了,连壶白开水都没有上!点的炒牛河50分钟没上餐,我们说不要了退了吧,被服务员很大声的鄙视,跟另一个服务员很大声的说听没听见人家不要了!语气相当不好。明明是你们没给上餐啊!然后切水果的吧台女服务员也是奇葩,不知道是耳朵不好还是不会说话,跟她说话完全不理人。总之整个用餐过程体验并不好,以后不会再来了
"""

reviews = [review_01, review_02]

for r in reviews:
    prompt = f"""
        你的任务是对下面三个反引号包含的文本内容进行推理分析,推理出文本内容中表达的情绪。请使用“好评”、“中评”、“差评”来回答。
        文本内容是```{r}```
    """
    response = get_completion(prompt=prompt)
    print(response)

运行结果:

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 infering.py
好评
差评
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

也可以使用大语言模型来推断长篇文本的主题:

代码语言:javascript复制
text= f"""
 “百姓富起来最重要!”上个世纪80年代,时任山东寿光县委书记的王伯祥带领群众集中力量办了三件事:一是推进蔬菜产业化,二是开发寿北盐碱滩,三是为工业翻身打基础。正是这三件事,让寿光人从此鼓起了口袋、挺起了腰板、走向了世界。“为人民服务,为人民服务好”,这位被群众念念不忘的“百姓书记”在病危期间颤颤巍巍写下的话语,正是他用一生践行的信仰。

  为政之道,以顺民心为本,以厚民生为本。习近平总书记指出,“干事创业一定要树立正确政绩观,做到‘民之所好好之,民之所恶恶之’”,强调“以造福人民为最大政绩”。对共产党人来说,人民是正确政绩观的核心,是干事创业的价值源头。新时代十年,以“人民有所呼、改革有所应”的鲜明导向,推进全面深化改革;以“不让一个人掉队”的真挚情怀,历史性解决绝对贫困问题;以“得罪千百人、不负十四亿”的勇毅担当,开展反腐败斗争;以“为了保护人民生命安全,我们什么都可以豁得出来”的坚定决心,抗击世纪疫情……一切努力都是为了人民,一切奋斗旨在造福人民,党和国家事业取得历史性成就、发生历史性变革,无不闪耀着一个光辉的起点——为了人民。

  树立和践行正确政绩观,起决定性作用的是党性。只有党性坚强、摒弃私心杂念,才能保证政绩观不出偏差。我们党是为人民谋幸福、给人民办事的,除了人民利益之外没有自己的特殊利益。做得人心、暖人心、稳人心的事,解决群众最关心、最迫切需要解决的问题,就是共产党人的政绩。这就要求广大党员干部始终以百姓心为心,以人民利益为重。在谋划推进工作时,要顺应群众所思所想所忧所盼;在制定政策措施时,要以满足人民日益增长的美好生活需要为出发点和落脚点;在推动工作落实时,要努力让群众看到变化、得到实惠。共产党人为的是大公、守的是大义、求的是大我。全心全力把老百姓的事一件一件办好,才能做俯仰无愧的共产党人,才能创造经得起历史检验的政绩。

  为老百姓办了多少好事实事是共产党人检验政绩的重要标准。但什么是好事实事,要从群众切身需要来考量,不能主观臆断,不能简单化、片面化。当年,林县县委主要负责人到农民家里调研,大家反映最强烈的问题就是缺水。在农户家,他想洗把脸,主人端来烩面碗大小的脸盆,只盛了半盆水,还不停“叮嘱”:“您洗完脸千万别把水泼了,俺还等着喂牲口哩!”“水在林县是天大的事”,正是深深知晓群众的需求,林县县委迎难而上,果断作出修建红旗渠的正确决策。坚持从群众中来,到群众中去,把调查研究作为基本功,自觉问计于民、问需于民,才能使想出来的点子、举措、方案符合实际情况,才能真正把惠民生、暖民心、顺民意的工作做到群众心坎上。

  金杯银杯比不上群众的口碑。业绩好不好,要看群众实际感受,由群众来评判。焦裕禄“心里装着全体人民、唯独没有他自己”,带领干部群众治理“三害”,兰考人至今“看到泡桐树,想起焦裕禄”;谷文昌怀揣“不把人民拯救出苦难,共产党来干什么”的信仰,带领东山干部群众把人间荒岛变成海上绿洲,“先祭谷公,后祭祖宗”成为东山百姓至今的传统。脚踏实地工作,俯首为民办事,才能在群众心中树起恒久的丰碑。广大党员干部要以此为标尺,坚持“做事”不“作秀”,“造福”不“造势”,坚决摒弃为了个人功名搞华而不实、劳民伤财的“形象工程”“政绩工程”,坚决防止因政绩冲动而虚报浮夸搞“数字政绩”“虚假政绩”,把为人民造福的事情真正办好办实,追求人民群众的好口碑、历史沉淀之后的真正评价。

  为人民利益而奋斗,是我们党矢志不渝的崇高追求,也是新征程上的使命担当。当前,学习贯彻习近平新时代中国特色社会主义思想主题教育正在全党深入开展,广大党员干部要以此为契机,牢固树立和践行正确政绩观,把为民造福作为最大政绩,想人民之所想,行人民之所嘱,使一切决策和工作着眼于更好满足人民需求、经得起人民检验,不断增进民生福祉,提高人民生活品质。
"""

prompt = f"""
你的任务是推断下面三个反引号包含的内容所表达的主题, 请使用3个短语来表达主题。 

文本内容是```{text}```
"""

response = get_completion(prompt)
print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 infering.py
1. 以人民为中心的政绩观
2. 为民造福的使命担当
3. 群众口碑是检验政绩的标准
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

六、转换类应用

ChatGPT等大语言模型的一个重要能力是将输入转换为不同格式的输出。可以将我们输入的文本翻译成数百种不同的语言,也可以把输入转为换HTML、Json、XML等格式的输出。

翻译类例子

代码语言:javascript复制
text = f"""
北国风光,千里冰封,万里雪飘。 望长城内外,惟余莽莽;大河上下,顿失滔滔。 山舞银蛇,原驰蜡象,欲与天公试比高。 须晴日,看红装素裹,分外妖娆。 江山如此多娇,引无数英雄竞折腰。 惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。 一代天骄,成吉思汗,只识弯弓射大雕。 俱往矣,数风流人物,还看今朝。
"""

prompt = f"""
你的任务是将下面三个反引号包含的文本翻译成英语和法语。 
并且以Json格式输出翻译的内容,key分别为"英语"和"法语"。


```{text}```
"""

response = get_completion(prompt=prompt)
print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 transform.py
{
  "英语": "The northern scenery, a thousand miles of ice, and snow drifting for thousands of miles. Looking inside and outside the Great Wall, only vastness remains; the river above and below, the waves are lost. The mountain dances with silver snakes, and the original wax elephants gallop, wanting to compare with the gods. On a clear day, look at the red and white clothes, especially charming. The country is so beautiful, attracting countless heroes to compete. Unfortunately, Qin Shihuang and Han Wu lost their literary talent; Tang Zong and Song Zu were slightly inferior in style. A generation of heroes, Genghis Khan, only knew how to shoot eagles with a bow. All have passed, the number of romantic figures, still looking at today.",
  "法语": "Les paysages du nord, mille miles de glace et de neige dérivante pour des milliers de miles. Regardant à l'intérieur et à l'extérieur de la Grande Muraille, seule la vastitude reste ; la rivière au-dessus et en dessous, les vagues sont perdues. La montagne danse avec des serpents d'argent, et les éléphants de cire d'origine galopent, voulant se comparer aux dieux. Par une journée claire, regardez les vêtements rouges et blancs, particulièrement charmants. Le pays est si beau, attirant d'innombrables héros pour concourir. Malheureusement, Qin Shihuang et Han Wu ont perdu leur talent littéraire ; Tang Zong et Song Zu étaient légèrement inférieurs en style. Une génération de héros, Genghis Khan, ne savait que tirer des aigles avec un arc. Tout est passé, le nombre de figures romantiques, regardant encore aujourd'hui." 
}
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

循环翻译转换的例子:

代码语言:javascript复制
msg_01 = "Prouver que j'ai raison serait accorder que je puis avoir tort."
msg_02 = "Bad times make a good man."
msg_03 = "Alle Wege führen nach Rom."

msgs = [msg_01, msg_02, msg_03]

for msg in msgs:
    prompt = f"""请推断出下面三个反引号中的文本是那种语言, 分别翻译成中文和英语, 请使用Json列表格式输出,key分别是"原文本", "语种", "中文文本", "英文文本", 原文本内容是 ```{msg}```"""
    response = get_completion(prompt)
    print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 transform.py
{
    "原文本": "```Prouver que j'ai raison serait accorder que je puis avoir tort.```",
    "语种": "法语",
    "中文文本": "证明我是正确的意味着承认我可能是错误的。",
    "英文文本": "To prove that I am right would be to admit that I could be wrong."
}
{
    "原文本": "Bad times make a good man.",
    "语种": "英语",
    "中文文本": "艰难困苦出能人。",
    "英文文本": "Bad times make a good man."
}
{
    "原文本": "```Alle Wege führen nach Rom.```",
    "语种": "德语",
    "中文文本": "所有的道路都通往罗马。",
    "英文文本": "All roads lead to Rome."
}
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

七、扩展类应用

什么是拓展? 在LLM中,拓展是指输入一小段文本,例如一组说明或者主题列表,然后让大语言模型生成更长的文本。

LLM的拓展能力,很多不错的用途,例如作为头脑风暴的伙伴,写小说等。但是也有一些糟糕的用例,比如用来生成大量垃圾邮件。

生产个性化邮件的例子:

代码语言:javascript复制
prod_review = f"""
很棒!最终还是从三星换回了iPhone,和之前一样熟悉,运行起来也十分流畅,系统及各方面的设置都突出一个简约干净!这代在拍照方面也非常出色!(如图8、9所示)
机子从内而外没有任何问题,续航比起三星的小杯来说相当可以,日常使用一天一充足矣!而外观相较于老机型这次很漂亮,用惯三星后感觉iPhone稍微重那么一点点,而整体上也是可以接受的,信号还行,没想象中的差!只是目前灵动岛功能感觉可有可无,作用不大,权当一个挖孔屏对待,所以可忽略。
因为仅用来日常使用,游戏运行方面不做评价(不玩手机游戏),而本次购物体验方面无论是发货速度,还是派送速度都很快,客服的服务态度也很赞!机子隔一晚上就收到了,总之,真的非常满意诶!是一次相当顺心愉快的购物体验!
"""

prompt = f"""
你的任务是根据下面三个反引号括起来的商品评论,给客户写一封电子邮件。电子邮件需要包含以下几个方面。
1. 首先,你要推断评论的情绪,用“好评”“中评”“差评”来概括。然后在邮件中感谢客户的“好评”“中评”或“差评”
2. 你的邮件需要结合评论中的细节,从生产部门、物流部门、或者客服部门给予具体的回复。
3. 最后,你需要告诉客户这封邮件是通过AI自动编写的。

客户的商品评论是: ```{prod_review}```

"""

response = get_completion(prompt)
print(response)

运行结果

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 expanding.py 
尊敬的客户,

非常感谢您对我们产品的评价!根据您的评论,我们认为这是一条“好评”。

我们很高兴听到您对iPhone的使用体验非常满意。我们的生产部门一直致力于提供高质量的产品,而您的评价证明了我们的努力得到了回报。

同时,我们也很高兴听到您对我们的物流和客服服务感到满意。我们的物流部门一直在努力确保您的订单能够及时送达,而我们的客服部门一直在为您提供优质的服务。

最后,我们需要告诉您,这封邮件是通过AI自动编写的。我们的AI系统一直在努力提高自己的能力,以便更好地为客户提供服务。

再次感谢您的评价,我们期待为您提供更好的服务!

祝您生活愉快!

此致

敬礼

AI客服
(HelloPython) ➜  HelloPrompt git:(main) ✗ 

温度 Temperature

Temperature是GPT模型中的一个参数,可以理解为GPT模型探索性、随机性的程度。

举个例子, 我们输入“my favorite food is”, GPT的预测下一个次可能是:

  • pizza: 53%概率
  • sushi: 30%概率
  • tacos: 5%概率
  • 其他

如果我们将Temperature设置为0, 则每次都会回复概率最高的pizza。

如果我们将Temperature设置为0.3, 则输入次数增多是有可能随机会出现一些sushi。

如果我们将Temperature设置为0.7, 则回复的随机性就更高了。

八、聊天机器人

role

在ChatGPT中, role 用于表示message的作者,可以是一下三种角色之一。

  • system: 用于设定assistant的行为
  • user: 模型的用户,消息的用户
  • assistant: Chat模型, ChatGPT

示例:

代码语言:javascript复制
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import openai
import os
# from dotenv import load_dotenv, find_dotenv

openai.api_key = os.getenv("CHATGPT_API_KEY")


def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
    # messages = [{"role":"user", "content":prompt}]
    response = openai.ChatCompletion.create(
        model = model,
        messages = messages,
        temperature = temperature,
    )
    print(response.choices[0].message["role"])
    return response.choices[0].message["content"]

messages = [
    {
        "role": "system",
        "content": "你是一个喜欢引用语文课文,并会指明引用出处来对话的助手"
    }, {
        "role": "user",
        "content": "今天天气怎么样?"
    }, {
        "role": "assistant", 
        "content": "今天天气很好!"
    }, {
        "role": "user",
        "content": "描述下今天天气有多好"
    }
]

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

这里将temperature设置为1, 随机性更强了,并切在 get_completion_from_messages 打印了回复人的角色。

运行结果:

代码语言:javascript复制
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 chatbot.py
assistant
可以用老舍先生的《在延安文艺座谈会上的讲话》中的描述来形容今天的天气:今天的天空,“湛蓝无云,空气清新,几乎可以感觉到空气中静止着的那种透明的东西。这是多么美好的感觉啊!”
(HelloPython) ➜  HelloPrompt git:(main) ✗ python3 chatbot.py
assistant
今天的天气晴空万里,阳光明媚,温度适宜,让人感觉舒适宜人。仿佛是《红楼梦》中写的“日日是好天”。
(HelloPython) ➜  HelloPrompt git:(main) ✗

上下文 Context

课程中,聊天机器人的部分设计到了交互式UI库和比较多的代码。 还没整理,以后再补充

0 人点赞