面向开发人员的 ChatGPT 提示语教程 - ChatGPT Prompt Engineering for Developers
- 1. 指南
- 1-1. 提示的准则
- 1-2. 配置
- 1-3. 提示语原则
- 原则 1: 写出清晰而具体的指示(原文: Write clear and specific instructions)
- 技巧 1: 使用分隔符来清楚地表明输入的不同部分(原文: Use delimiters to clearly indicate distinct parts of the input)
- 技巧 2: 要求提供结构化的输出(原文: Ask for a structured output)
- 技巧 3: 要求模型检查条件是否得到满足(原文: Ask the model to check whether conditions are satisfied)
- 技巧 4: "少许样本"提示(原文: "Few-shot" prompting)
- 原则 2: 给模型 "思考 "的时间(原文: Give the model time to “think”)
- 技巧 1: 具体说明完成一项任务所需的步骤(原文: Specify the steps required to complete a task)
- 技巧 2: 在匆忙得出结论之前,要求模型自己解决问题(原文: Instruct the model to work out its own solution before rushing to a conclusion)
- 模型的局限性: 幻觉(原文: Model Limitations: Hallucinations)
- 2. 迭代式
- 2-1. 迭代式提示语开发
- 2-2. 配置
- 2-3. 从产品概况表中生成营销产品描述(原文: Generate a marketing product description from a product fact sheet)
- 2-4. 问题1: 文本太长(原文: The text is too long )
- 2-5. 问题 2: 文本集中在错误的细节上(原文: Text focuses on the wrong details)
- 2-6. 问题3. 描述需要一个维度的表格(原文: Description needs a table of dimensions)
- 2-7. 加载Python库以查看HTML(原文: Load Python libraries to view HTML)
- 3. 归纳总结
- 3-1. 归纳总结
- 3-2. 配置
- 3-3. 归纳的文本(原文: Text to summarize)
- 3-4. 用字/句/字数限制进行总结(原文: Summarize with a word/sentence/character limit)
- 3-5. 以运输和交付为重点进行总结(原文: Summarize with a focus on shipping and delivery)
- 3-6. 总结时注重价格和价值(原文: Summarize with a focus on price and value)
- 3-7. 尝试 "提取" 而不是 "总结"(原文: Try "extract" instead of "summarize")
- 3-8. 总结多个产品评论(原文: Summarize multiple product reviews)
- 4. 推断
- 4-1. 推断
- 4-2. 配置
- 4-3. 产品评论内容(原文: Product review text)
- 4-4. 情感(正面/负面)(原文: Sentiment (positive/negative))
- 4-5. 识别情感的类型(原文: Identify types of emotions)
- 4-6. 识别愤怒(原文: Identify anger)
- 4-7. 从客户评论中提取产品和公司名称(原文: Extract product and company name from customer reviews)
- 4-8: 一次性完成多项任务(原文: Doing multiple tasks at once)
- 4-9: 推断主题(原文: Inferring topics)
- 4-10. 推断出5个主题(原文: Infer 5 topics)
- 4-11. 为某些主题制作新闻提醒(原文: Make a news alert for certain topics)
- 5. 转化
- 5-1. 转化
- 5-2. 配置
1. 指南
1-1. 提示的准则
在本课中,你将练习两个提示原则及其相关策略,以便为大型语言模型编写有效的提示语。
1-2. 配置
安装 openai 依赖,
!pip install openai
!export OPENAI_API_KEY='sk-...'
加载API密钥和相关的Python库,
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.getenv('OPENAI_API_KEY')
在整个课程中,我们将使用 OpenAI 的 gpt-3.5-turbo 模型和聊天完成度端点(chat completions endpoint)。
这个辅助函数将使我们更容易使用提示语和查看生成的输出,
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # this is the degree of randomness of the model's output
)
return response.choices[0].message["content"]
1-3. 提示语原则
-
原则 1: 写出清晰而具体的指示(Write clear and specific instructions)
-
原则 2: 给模型 "思考 "的时间(Give the model time to “think”)
原则 1: 写出清晰而具体的指示(原文: Write clear and specific instructions)
技巧 1: 使用分隔符来清楚地表明输入的不同部分(原文: Use delimiters to clearly indicate distinct parts of the input)
- 分隔符可以是任何东西,例如: ```,
"""
,< >
,<tag> <\tag>
,:
示例代码,
text = f"""
你应该通过提供尽可能清晰和具体的指令来表达你希望模型做什么。\
这将引导模型走向所需的输出,并减少收到不相关或不正确响应的机会。\
不要把写一个清晰的提示和写一个短的提示混为一谈。\
在许多情况下,较长的提示为模型提供了更多的清晰度和背景,\
这可以导致更详细和相关的输出。
"""
prompt = f"""
将由三个反斜线划定的文本总结为一句话。
```{text}```
"""
response = get_completion(prompt)
print(response)
输出结果如下,
提供清晰具体的指令可以引导模型输出所需结果,避免不相关或不正确响应,较长的提示可以提供更多清晰度和背景,导致更详细和相关的输出。
技巧 2: 要求提供结构化的输出(原文: Ask for a structured output)
- JSON, HTML
示例代码,
prompt = f"""
生成一个包含三个编造的书名及其作者和流派的列表。\
以JSON格式提供,键值如下:
book_id, title, author, genre。
"""
response = get_completion(prompt)
print(response)
输出结果如下,
[
{
"book_id": 1,
"title": "The Shadow of the Wind",
"author": "Carlos Ruiz Zafón",
"genre": "Gothic fiction"
},
{
"book_id": 2,
"title": "The Nightingale",
"author": "Kristin Hannah",
"genre": "Historical fiction"
},
{
"book_id": 3,
"title": "The Martian",
"author": "Andy Weir",
"genre": "Science fiction"
}
]
技巧 3: 要求模型检查条件是否得到满足(原文: Ask the model to check whether conditions are satisfied)
示例代码 1,
text_1 = f"""
泡一杯茶很容易!\
首先,你需要让一些水沸腾。\
在这过程中,拿起一个杯子,把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
让茶叶浸泡一会儿。\
几分钟后,取出茶包。\
如果你喜欢,你可以加入一些糖或牛奶来调味。\
就这样 你就可以享受到一杯美味的茶了。
"""
prompt = f"""
你将得到由三引号划定的文本。\
如果它包含一连串的指令,请按以下格式重写这些指令:
第1步 - ...
第2步 - ...
...
第N步 - ...
如果该文本不包含指令序列,那么只需写上 "未提供步骤"。
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Completion for Text 1:")
print(response)
输出结果如下,
Completion for Text 1:
第1步 - 让一些水沸腾。
第2步 - 拿起一个杯子,把茶包放进去。
第3步 - 一旦水足够热,就把它倒在茶包上。
第4步 - 让茶叶浸泡一会儿。
第5步 - 取出茶包。
第6步 - 如果你喜欢,你可以加入一些糖或牛奶来调味。
第7步 - 享受你的美味茶!
示例代码 2,
text_2 = f"""
今天阳光明媚,鸟儿在歌唱。
这是一个去公园散步的好日子。
鲜花盛开,树木在微风中轻轻摇曳。
人们都出来走动,享受这美好的天气。
一些人正在野餐,而另一些人正在玩游戏,或只是在草地上放松。
这是一个完美的日子,可以花时间在户外,欣赏大自然的美丽。
"""
prompt = f"""
你将得到由三引号划定的文本。\
如果它包含一连串的指令,请按以下格式重写这些指令:
第1步 - ...
第2步 - ...
...
第N步 - ...
如果该文本不包含指令序列,那么只需写上 "未提供步骤"。
\"\"\"{text_2}\"\"\"
"""
response = get_completion(prompt)
print("Completion for Text 2:")
print(response)
输出结果如下,
Completion for Text 2:
未提供步骤
技巧 4: "少许样本"提示(原文: “Few-shot” prompting)
举出完成任务的成功例子,然后要求模型执行任务。
示例代码,
prompt = f"""
你的任务是以一致的风格来回答。
<孩子>:教我耐心。
<祖父母>:雕琢最深山谷的河流从一个小小的泉眼流过;\
最宏伟的交响乐源于一个音符;最复杂的织锦从一根线开始。
<孩子>:教我如何坚韧不拔。
"""
response = get_completion(prompt)
print(response)
输出结果如下,
<祖父母>:坚韧不拔的力量来自于内心的信念和毅力。要有目标,有计划,有毅力,不断努力,不轻易放弃,才能走向成功的道路。
原则 2: 给模型 "思考 "的时间(原文: Give the model time to “think”)
技巧 1: 具体说明完成一项任务所需的步骤(原文: Specify the steps required to complete a task)
示例代码,
text = f"""
在一个迷人的村庄里,杰克和吉尔兄妹开始了从山顶水井取水的征程。
当他们欢快地唱着歌爬上山顶时,不幸发生了--杰克被一块石头绊倒,\
翻下山去,吉尔也跟着摔倒。
虽然受了点伤,但两人还是在安慰的怀抱中回到了家。
尽管发生了意外,他们的冒险精神仍然没有受到影响,他们继续愉快地探索。
"""
# example 1
prompt_1 = f"""
执行以下操作:
1 - 用1个句子总结以下由三个反斜线划定的文本。
2 - 将摘要翻译成日文。
3 - 在日文摘要中列出每个名字。
4 - 输出一个json对象,包含以下内容 \
keys: japanese_summary, num_names.
用换行符把你的答案分开。
Text:
```{text}```
"""
response = get_completion(prompt_1)
print("Completion for prompt 1:")
print(response)
输出结果如下,
Completion for prompt 1:
1 - 杰克和吉尔兄妹在山顶水井取水时发生了意外,但他们的冒险精神没有受到影响,继续愉快地探索。
2 - 山頂の井戸から水を汲む旅を始めたジャックとジル兄妹は、歌を歌いながら山を登っていたが、ジャックが石につまずいて山から転落し、ジルも転倒してしまった。彼らは少し怪我をしたが、安心した抱擁の中で家に戻った。事故が起こったにもかかわらず、彼らの冒険心は影響を受けず、彼らは楽しく探検を続けた。
3 - ジャック、ジル
4 - {
"japanese_summary": "山頂の井戸から水を汲む旅を始めたジャックとジル兄妹は、歌を歌いながら山を登っていたが、ジャックが石につまずいて山から転落し、ジルも転倒してしまった。彼らは少し怪我をしたが、安心した抱擁の中で家に戻った。事故が起こったにもかかわらず、彼らの冒険心は影響を受けず、彼らは楽しく探検を続けた。",
"num_names": 2
}
要求以指定的格式输出,
示例代码,
prompt_2 = f"""
你的任务是执行以下行动:
1 - 用1个句子总结以下以<>为界的文字。
2 - 将摘要翻译成日文。
3 - 列出日文摘要中的每个名字。
4 - 输出一个json对象,包含以下键:japanese_summary, num_names。
使用以下格式:
文本: <要总结的文本>
摘要: <摘要>
翻译: <摘要翻译>
名称: <日文摘要中的名字列表>
输出JSON:<json格式的summary 和 num_names>
Text: <{text}>
"""
response = get_completion(prompt_2)
print("\nCompletion for prompt 2:")
print(response)
输出结果如下,
Completion for prompt 2:
摘要:在一个迷人的村庄里,杰克和吉尔兄妹开始了从山顶水井取水的征程,但杰克不幸被一块石头绊倒,两人受了点伤但还是继续愉快地探索。
翻译:魅力的村にて、ジャックとジル兄妹は山頂の井戸から水を汲む旅を始めましたが、ジャックは石につまずいて山から転落し、2人は少し怪我をしましたが、探検を楽しんで続けました。
名称:杰克、吉尔
输出JSON:{"japanese_summary": "魅力的な村で、ジャックとジル兄妹は山頂の井戸から水を汲む旅を始めましたが、ジャックは石につまずいて山から転落し、2人は少し怪我をしましたが、探検を楽しんで続けました。", "num_names": 2}
技巧 2: 在匆忙得出结论之前,要求模型自己解决问题(原文: Instruct the model to work out its own solution before rushing to a conclusion)
示例代码,
prompt = f"""
判断该学生的解决方案是否正确。
问题:
我正在建造一个太阳能发电装置,我需要帮助解决财务问题。
- 土地成本为100美元/平方英尺
- 我可以以250美元/平方英尺的价格购买太阳能电池板
- 我协商了一份维护合同,每年的费用为10万美元,另外每平方英尺10美元。
第一年运营的总成本是多少,与平方英尺数的关系是什么。
学生的解决方案:
设x为安装的面积,单位为平方英尺。
成本:
1. 土地成本:100x
2. 太阳能电池板成本:250x
3. 维护费用:100,000 + 100x
总成本:100x + 250x + 100,000 + 100x = 450x + 100,000
"""
response = get_completion(prompt)
print(response)
输出结果如下,
该学生的解决方案是正确的。总成本与安装面积呈线性关系,即总成本随着安装面积的增加而增加。
请注意,这个学生的解决方案实际上是不正确的。
我们可以通过指示模型先算出自己的解决方案来解决这个问题。
示例代码,
prompt = f"""
你的任务是确定该学生的解决方案是否正确。
要解决这个问题,请做以下工作:
- 首先,找出你自己的解决方案。
- 然后将你的方案与学生的方案进行比较,评估学生的方案是否正确。\
在你自己做完这个问题之前,不要决定学生的解决方案是否正确。
使用以下格式:
问题:
```#
这里的问题
```#
学生的解决方案:
```#
学生的解决方案在这里
```#
实际的解决方案:
```#
解决问题的步骤和你的解决方案在这里
```#
学生的解决方案是否与刚才计算的实际解决方案相同:
```#
是或不是
```#
学生的成绩:
```#
正确或不正确
```#
问题:
```#
我正在建造一个太阳能发电装置,我需要帮助解决财务问题。
- 土地成本为100美元/平方英尺
- 我可以以250美元/平方英尺的价格购买太阳能电池板。
- 我谈好了一份维护合同,每年的费用为10万美元,另外每平方英尺增加10美元。
运营第一年的总成本是多少,与平方英尺的数量成正比。
```#
学生的解决方案:
```#
设x为安装的面积,单位为平方英尺。
成本:
1. 土地成本:100x
2. 太阳能电池板成本:250x
3. 维护费用:100,000 + 100x
总成本:100x + 250x + 100,000 + 100x = 450x + 100,000
```#
实际解决方案:
"""
response = get_completion(prompt)
print(response)
输出结果如下,
学生的解决方案与实际解决方案相同。
```#
设x为安装的面积,单位为平方英尺。
成本:
1. 土地成本:100x
2. 太阳能电池板成本:250x
3. 维护费用:100,000 + 10x
总成本:100x + 250x + 100,000 + 10x = 360x + 100,000
```#
学生的解决方案是否与刚才计算的实际解决方案相同:
是
学生的成绩:
正确
请注意,这个学生的解决方案实际上是不正确的。我用中文尝试和好几遍,都等不到正确的反馈,然后使用英文代码测试了一下。
示例代码,
prompt = f"""
Your task is to determine if the student's solution is correct or not.
To solve the problem do the following:
- First, work out your own solution to the problem.
- Then compare your solution to the student's solution and evaluate if the student's solution is correct or not.
Don't decide if the student's solution is correct until you have done the problem yourself.
Use the following format:
Question:
```#
question here
```#
Student's solution:
```#
student's solution here
```#
Actual solution:
```#
steps to work out the solution and your solution here
```#
Is the student's solution the same as actual solution just calculated:
```#
yes or no
```#
Student grade:
```#
correct or incorrect
```#
Question:
```#
I'm building a solar power installation and I need help working out the financials.
- Land costs $100 / square foot
- I can buy solar panels for $250 / square foot
- I negotiated a contract for maintenance that will cost me a flat $100k per year, and an additional $10 / square foot
What is the total cost for the first year of operations as a function of the number of square feet.
```#
Student's solution:
```#
Let x be the size of the installation in square feet.
Costs:
1. Land cost: 100x
2. Solar panel cost: 250x
3. Maintenance cost: 100,000 + 100x
Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000
```#
Actual solution:
"""
response = get_completion(prompt)
print(response)
输出结果如下,
Actual solution:
Let x be the size of the installation in square feet.
Costs:
1. Land cost: 100x
2. Solar panel cost: 250x
3. Maintenance cost: 100,000 + 10x
Total cost: 100x + 250x + 100,000 + 10x = 360x + 100,000
Is the student's solution the same as actual solution just calculated:
No
Student grade:
Incorrect
英文描述,最终 ChatGPT 给出了正确的答案,也就是这个学生的解决方案实际上是不正确的。
模型的局限性: 幻觉(原文: Model Limitations: Hallucinations)
Boie是一家真正的公司,产品名称并不真实。
代码示例,
prompt = f"""
告诉我关于 Boie 公司 AeroGlide UltraSlim Smart Toothbrush 的信息
"""
response = get_completion(prompt)
print(response)
输出结果如下,
Boie公司的AeroGlide UltraSlim Smart Toothbrush是一款智能牙刷,采用超薄设计,可以轻松进入口腔的难以到达的区域。该牙刷配备了智能传感器,可以监测刷牙的时间和压力,以确保您的刷牙习惯正确。此外,该牙刷还具有可充电电池和可拆卸刷头,方便清洁和更换。AeroGlide UltraSlim Smart Toothbrush还配备了一个智能手机应用程序,可以跟踪您的刷牙习惯,并提供个性化建议和提醒。
2. 迭代式
2-1. 迭代式提示语开发
在本课中,你将反复分析和完善你的提示,从产品说明书中生成营销文案。
2-2. 配置
安装 openai 依赖,
!pip install openai
!export OPENAI_API_KEY='sk-...'
加载API密钥和相关的Python库,
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.getenv('OPENAI_API_KEY')
在整个课程中,我们将使用 OpenAI 的 gpt-3.5-turbo 模型和聊天完成度端点(chat completions endpoint)。
这个辅助函数将使我们更容易使用提示语和查看生成的输出,
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # this is the degree of randomness of the model's output
)
return response.choices[0].message["content"]
2-3. 从产品概况表中生成营销产品描述(原文: Generate a marketing product description from a product fact sheet)
示例代码,
fact_sheet_chair = """
概述
- 这是一个美丽的中世纪办公家具系列的一部分,包括文件柜、办公桌、书柜、会议桌等等。
- 有多种外壳颜色和底座表面处理可供选择。
- 可提供10种布料和6种皮革选择的塑料背和前软垫(SWC-100)或全软垫(SWC-110)。
- 底座表面处理选项有:不锈钢、亚光黑、亮白或铬。
- 椅子有带或不带扶手可供选择。
- 适用于家庭或商业环境。
- 符合合同使用条件。
构造
- 5轮塑料涂层铝制底座。
- 椅子的气动调节装置,可以方便地提升/降低动作。
尺寸
- 宽度 53 cm | 20.87
- 深度 51 cm | 20.08
- 高度80厘米 | 31.50"
- 座椅高度 44 cm | 17.32
- 座椅深度 41 cm | 16.14
选项
- 软地板或硬地板的脚轮选择。
- 座椅泡沫密度有两种选择:
中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。
- 无臂或8位PU扶手
材料
外壳底座滑翔机
- 铸铝,带有改性尼龙PA6/PA66涂层。
- 外壳厚度:10毫米。
座椅
- HD36泡沫
原产国
- 意大利
"""
prompt = f"""
你的任务是帮助一个营销团队在技术说明书的基础上为一个零售网站创建一个产品描述。
根据用三个反斜线划定的技术说明书中提供的信息,写出一份产品描述。
技术说明书: ```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
输出结果如下,
产品描述:
我们很自豪地向您介绍我们的美丽中世纪办公家具系列,其中包括文件柜、办公桌、书柜、会议桌等等。我们提供多种外壳颜色和底座表面处理可供选择,以及10种布料和6种皮革选择的塑料背和前软垫(SWC-100)或全软垫(SWC-110)。底座表面处理选项有:不锈钢、亚光黑、亮白或铬。椅子有带或不带扶手可供选择,适用于家庭或商业环境,并符合合同使用条件。
我们的椅子采用5轮塑料涂层铝制底座,椅子的气动调节装置可以方便地提升/降低动作。尺寸方面,宽度为53 cm,深度为51 cm,高度为80厘米,座椅高度为44 cm,座椅深度为41 cm。
我们提供软地板或硬地板的脚轮选择,座椅泡沫密度有两种选择:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺),以及无臂或8位PU扶手。外壳底座滑翔机采用铸铝,带有改性尼龙PA6/PA66涂层,外壳厚度为10毫米。座椅采用HD36泡沫。
我们的产品原产国为意大利,我们相信我们的美丽中世纪办公家具系列将为您的家庭或商业环境带来优雅和舒适。
2-4. 问题1: 文本太长(原文: The text is too long )
- 限制单词/句子/字符的数量
示例代码,
prompt = f"""
你的任务是帮助一个营销团队在技术说明书的基础上为一个零售网站创建一个产品描述。
根据用三个反斜线划定的技术说明书中提供的信息,写出一份产品描述。
最多使用50个字。
技术说明书:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
输出结果如下,
美丽的中世纪办公家具系列,包括文件柜、办公桌、书柜、会议桌等等。多种颜色和底座表面处理可供选择。适用于家庭或商业环境。
示例代码,
len(response)
输出结果如下,
59
2-5. 问题 2: 文本集中在错误的细节上(原文: Text focuses on the wrong details)
- 要求它把重点放在与目标受众相关的方面
示例代码,
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)
输出结果如下,
这款中世纪办公家具系列包括文件柜、办公桌、书柜、会议桌等等,可供多种外壳颜色和底座表面处理选择。座椅可选10种布料和6种皮革,底座表面处理选项有不锈钢、亚光黑、亮白或铬。座椅有带或不带扶手可供选择,适用于家庭或商业环境。铝制底座和气动调节装置方便提升/降低动作。产品ID:SWC-100/SWC-110。
2-6. 问题3. 描述需要一个维度的表格(原文: Description needs a table of dimensions)
- 要求它提取信息并将其组织在一个表格中
示例代码,
prompt = f"""
你的任务是帮助一个营销团队在技术说明书的基础上为一个零售网站创建一个产品描述。
根据用三个反斜线划定的技术说明书中提供的信息,写出一份产品描述。
描述是为家具零售商准备的,所以应该是技术性的,重点是产品的结构材料。
在描述的最后,包括技术规范中的每一个7个字符的产品ID。
在描述之后,包括一个表格,给出产品的尺寸。该表应该有两列。
在第一栏中,包括尺寸的名称。
在第二栏中,仅包括以英寸为单位的测量值。
给该表起名为 "产品尺寸"。
将所有内容都格式化为可在网站上使用的HTML。
将描述放在一个<div>元素中。
技术说明书: ```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)
输出结果如下,
<div>
<h2>中世纪办公家具系列 - 椅子</h2>
<p>这款椅子是中世纪办公家具系列的一部分,适用于家庭或商业环境。它有多种外壳颜色和底座表面处理可供选择,可提供10种布料和6种皮革选择的塑料背和前软垫(SWC-100)或全软垫(SWC-110)。椅子有带或不带扶手可供选择,符合合同使用条件。</p>
<h3>构造</h3>
<ul>
<li>5轮塑料涂层铝制底座</li>
<li>椅子的气动调节装置,可以方便地提升/降低动作</li>
</ul>
<h3>材料</h3>
<ul>
<li>外壳底座滑翔机:铸铝,带有改性尼龙PA6/PA66涂层,外壳厚度为10毫米</li>
<li>座椅:HD36泡沫</li>
</ul>
<h3>选项</h3>
<ul>
<li>软地板或硬地板的脚轮选择</li>
<li>座椅泡沫密度有两种选择:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)</li>
<li>无臂或8位PU扶手</li>
</ul>
<h3>产品尺寸</h3>
<table>
<tr>
<td>宽度</td>
<td>20.87英寸</td>
</tr>
<tr>
<td>深度</td>
<td>20.08英寸</td>
</tr>
<tr>
<td>高度</td>
<td>31.50英寸</td>
</tr>
<tr>
<td>座椅高度</td>
<td>17.32英寸</td>
</tr>
<tr>
<td>座椅深度</td>
<td>16.14英寸</td>
</tr>
</table>
<p>产品ID:SWC-100</p>
</div>
2-7. 加载Python库以查看HTML(原文: Load Python libraries to view HTML)
示例代码,
from IPython.display import display, HTML
display(HTML(response))
输出结果如下,
3. 归纳总结
3-1. 归纳总结
在本课中,你将对文本进行总结,重点是特定的主题。
3-2. 配置
安装 openai 依赖,
!pip install openai
!export OPENAI_API_KEY='sk-...'
加载API密钥和相关的Python库,
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.getenv('OPENAI_API_KEY')
在整个课程中,我们将使用 OpenAI 的 gpt-3.5-turbo 模型和聊天完成度端点(chat completions endpoint)。
这个辅助函数将使我们更容易使用提示语和查看生成的输出,
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # this is the degree of randomness of the model's output
)
return response.choices[0].message["content"]
3-3. 归纳的文本(原文: Text to summarize)
示例代码,
prod_review = """
为我女儿的生日买了这个熊猫毛绒玩具,她很喜欢它,带着它到处跑。
它很柔软,超级可爱,而且它的脸看起来很友好。
不过对于我的花费来说,它有点小。
我想可能有其他选择,同样的价格,更大的。
它比预期早到一天,所以我在给她之前自己玩了一下。
"""
3-4. 用字/句/字数限制进行总结(原文: Summarize with a word/sentence/character limit)
示例代码,
prompt = f"""
你的任务是对一个电子商务网站的产品评论生成一个简短的摘要。
对下面用三个反斜线分隔的评论进行总结,最多 30 个字。
评论:```{prod_review}```
"""
response = get_completion(prompt)
print(response)
输出结果如下,
柔软可爱的熊猫毛绒玩具,女儿很喜欢,但有点小。提前到货。
3-5. 以运输和交付为重点进行总结(原文: Summarize with a focus on shipping and delivery)
示例代码,
prompt = f"""
你的任务是对一个电子商务网站的产品评论生成一个简短的摘要。
对下面用三个反斜线分隔的评论进行总结,最多 30 个字,\
并专注于提到产品运输和交付的任何方面。
评论:```{prod_review}```
"""
response = get_completion(prompt)
print(response)
输出结果如下,
柔软可爱的熊猫玩具,提前一天送达,但有点小。
3-6. 总结时注重价格和价值(原文: Summarize with a focus on price and value)
示例代码,
prompt = f"""
你的任务是为一个电子商务网站的产品评论生成一个简短的摘要,
以反馈给负责确定产品价格的定价部门。
对下面用三个反斜线分隔的评论进行总结,最多 30 个字,\
并专注于与价格和感知价值有关的任何方面。
评论:```{prod_review}```
"""
response = get_completion(prompt)
print(response)
输出结果如下,
柔软可爱,但价值不高。更大的选择可能更好。
3-7. 尝试 “提取” 而不是 “总结”(原文: Try “extract” instead of “summarize”)
示例代码,
prompt = f"""
你的任务是对一个电子商务网站的产品评论生成一个简短的摘要。
从下面用三个反斜线分隔的评论中提取与运输和交货有关的信息,
最多 30 个字。
评论:```{prod_review}```
"""
response = get_completion(prompt)
print(response)
输出结果如下,
运输快,提前一天到达。
3-8. 总结多个产品评论(原文: Summarize multiple product reviews)
示例代码,
review_1 = prod_review
# review for a standing lamp
review_2 = """
我的卧室需要一盏漂亮的灯,这盏灯有额外的存储空间,而且价格不高。
买得很快--2天就到了。
在运输过程中,灯的绳子断了,公司很高兴地送来了一个新的。
也是在几天内送到的。它很容易装起来。
然后我发现缺少一个零件,于是我联系了他们的支持部门,
他们很快就给我找到了缺少的零件!
在我看来,这是一家关心客户和产品的伟大公司。
"""
# review for an electric toothbrush
review_3 = """
我的牙科保健师推荐了一个电动牙刷,这就是我买这个的原因。
到目前为止,电池寿命似乎相当可观。
初次充电后,第一周让充电器插着以调节电池,我已经拔掉了充电器,
在过去3周里每天用它刷两次牙,都是用同一次充电。
但是牙刷头太小了。
我见过的婴儿牙刷比这个大。
我希望牙刷头能更大,有不同长度的刷毛,
以便更好地进入牙齿之间,因为这个牙刷没有。
总的来说,如果你能在50美元左右买到这支牙刷,那就很划算。
制造商的替换头相当昂贵,但你可以得到价格更合理的通用头。
这把牙刷让我感觉每天都在看牙医。我的牙齿感觉闪闪发光的干净!
"""
# review for a blender
review_4 = """
所以,他们在11月仍有17件套系统的季节性销售,价格约为49美元,
大约是半价,但由于某种原因(称之为价格欺诈),
在12月的第二周,同一系统的价格都涨到了约70-89美元之间。
因此,它看起来还不错,但如果你看一下底座,
刀片锁定的部分看起来没有几年前的版本那么好,
但我打算对它非常温柔 \
(例如,我把非常硬的东西,如豆子、冰块、大米等,先在搅拌机中粉碎,
然后再粉碎。例如,我先在搅拌器中粉碎非常坚硬的物品,
如豆类、冰块、大米等,然后在搅拌器中把它们粉碎成我想要的大小
,再换成打发刀片来制作更细的面粉,制作冰沙时先使用横切刀片,
如果我需要更细/更少的浆状,就使用平切刀片)。
制作冰沙时的特别提示,将水果和蔬菜切得很细并冷冻起来 \
(如果使用菠菜--轻度炖软菠菜,然后冷冻直到准备使用--如果制作冰沙,
使用中小型食品加工机)。
如果你打算使用这种方式,你可以避免在制作冰沙时加入那么多冰块。
大约一年后,电机发出了奇怪的噪音。我给客户服务部打电话,
但保修期已经过了,所以我不得不再买一台。
参考:这类产品的整体质量已经下降,
所以他们有点指望品牌知名度和消费者忠诚度来维持销售。
大约两天后就收到了。
"""
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")
输出结果如下,
0 柔软可爱的熊猫玩具,稍小于预期,但送货速度快。
1 漂亮灯具,额外存储,快速送达,优质客服。
2 电动牙刷电池寿命长,性价比高,但刷头太小。
3 价格欺诈,质量下降,需温柔使用。
4. 推断
4-1. 推断
在本课中,你将从产品评论和新闻文章中推断出情绪和主题。
4-2. 配置
安装 openai 依赖,
!pip install openai
!export OPENAI_API_KEY='sk-...'
加载API密钥和相关的Python库,
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.getenv('OPENAI_API_KEY')
在整个课程中,我们将使用 OpenAI 的 gpt-3.5-turbo 模型和聊天完成度端点(chat completions endpoint)。
这个辅助函数将使我们更容易使用提示语和查看生成的输出,
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # this is the degree of randomness of the model's output
)
return response.choices[0].message["content"]
4-3. 产品评论内容(原文: Product review text)
示例代码,
lamp_review = """
我的卧室需要一盏漂亮的灯,这盏灯有额外的存储空间,价格也不高。
很快就收到了。
我们的灯的绳子在运输过程中断了,公司很高兴地送来了一个新的。
也是在几天内送到的。它很容易装起来。
我有一个缺失的部分,所以我联系了他们的支持,
他们很快就给我弄到了缺失的部分!!
在我看来,Lumina是一家伟大的公司,它关心他们的客户和产品!
"""
4-4. 情感(正面/负面)(原文: Sentiment (positive/negative))
示例代码,
prompt = f"""
下面的产品评论是以三条反斜线为界限的,它的情绪是什么?
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
输出结果如下,
情绪是积极的,对产品和公司都有好评。
示例代码,
prompt = f"""
下面的产品评论是以三条反斜线为界限的,它的情绪是什么?
用一个词来回答,可以是 "正面",也可以是 "负面"。
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
输出结果如下,
正面
4-5. 识别情感的类型(原文: Identify types of emotions)
示例代码,
prompt = f"""
找出以下评论的作者所表达的情感清单。
列表中包括不超过五个项目。
将你的答案格式化为由逗号隔开的小写单词列表。
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
输出结果如下,
高兴, 满意, 赞赏, 感激, 信任
4-6. 识别愤怒(原文: Identify anger)
示例代码,
prompt = f"""
以下评论的作者是在表达愤怒吗?
该评论用三个反斜线划定。
请给出您的答案,是或不是。
Review text: '''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
输出结果如下,
不是。
4-7. 从客户评论中提取产品和公司名称(原文: Extract product and company name from customer reviews)
示例代码,
prompt = f"""
从评论文本中找出以下物品:
- 评论者购买的物品
- 制造该物品的公司
该评论以三条反斜线为界。
将你的回应格式化为JSON对象,以 "项目 "和 "品牌 "为键。
如果该信息不存在,使用 "未知 "作为值。
使你的回应尽可能简短。
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
输出结果如下,
{
"项目": "灯",
"品牌": "Lumina"
}
4-8: 一次性完成多项任务(原文: Doing multiple tasks at once)
示例代码,
prompt = f"""
从评论文本中找出以下项目:
- 情绪(积极或消极)
- 评论者是否在表达愤怒?(真或假)
- 评论者购买的物品
- 制造该物品的公司
评论是以三条反斜线为界的。
将您的回复格式化为JSON对象,以 "情绪"、"愤怒"、"物品 "和 "品牌 "为键。
如果信息不存在,使用 "未知 "作为值。
使你的响应尽可能的短。
将 "愤怒 "的值格式化为一个布尔值。
评论文本: '''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)
输出结果如下,
{
"情绪": "积极",
"愤怒": false,
"物品": "灯",
"品牌": "Lumina"
}
4-9: 推断主题(原文: Inferring topics)
示例代码,
story = """
在政府最近进行的一项调查中,
公共部门的雇员被要求对他们所工作的部门的满意程度进行评分。
结果显示,美国国家航空航天局是最受欢迎的部门,满意度为95%。
美国国家航空航天局的一名员工约翰-史密斯对调查结果发表了评论,
他说:"我对美国国家航空航天局名列前茅并不感到惊讶。
这是一个伟大的工作场所,有了不起的人和难以置信的机会。
我很自豪能成为这样一个创新组织的一部分。"
这一结果也受到美国国家航空航天局管理团队的欢迎,
局长汤姆-约翰逊说:
"我们很高兴听到我们的员工对他们在美国国家航空航天局的工作感到满意。
我们有一个才华横溢、尽职尽责的团队,他们为实现我们的目标而不懈努力,
看到他们的努力工作得到了回报,这真是太棒了"。
调查还显示,社会安全局的满意度最低,
只有45%的员工表示他们对自己的工作感到满意。
政府已承诺解决员工在调查中提出的问题,并努力提高所有部门的工作满意度。
"""
4-10. 推断出5个主题(原文: Infer 5 topics)
示例代码,
prompt = f"""
确定在以下文本中讨论的五个主题。下面的文字是由三个反斜线划定的。
使每个项目有一到两个字的长度。
将你的回答格式化为用逗号分隔的项目列表。
文本样本: '''{story}'''
"""
response = get_completion(prompt)
print(response)
输出结果如下,
主题:政府部门调查结果
- 美国国家航空航天局是最受欢迎的部门,满意度为95%。
- 社会安全局的满意度最低,只有45%的员工表示他们对自己的工作感到满意。
- 美国国家航空航天局员工对工作感到自豪和满意。
- 美国国家航空航天局管理团队对员工满意度的结果感到欢迎。
- 政府承诺解决员工在调查中提出的问题,并努力提高所有部门的工作满意度。
示例代码,
response.split(sep=',')
输出结果如下,
['主题:政府部门调查结果\n\n- 美国国家航空航天局是最受欢迎的部门,满意度为95%。\n- 社会安全局的满意度最低,只有45%的员工表示他们对自己的工作感到满意。\n- 美国国家航空航天局员工对工作感到自豪和满意。\n- 美国国家航空航天局管理团队对员工满意度的结果感到欢迎。\n- 政府承诺解决员工在调查中提出的问题,并努力提高所有部门的工作满意度。']
4-11. 为某些主题制作新闻提醒(原文: Make a news alert for certain topics)
示例代码,
topic_list = [
"NASA", "地方政府", "工程", "员工满意度", "联邦政府"
]
示例代码,
prompt = f"""
判断下面的主题列表中的每一项是否是下面文本中的一个主题,
该文本用三条反斜线划定。
以列表的形式给出你的答案,每个主题的答案为0或1。
主题清单: {", ".join(topic_list)}
文本样本: '''{story}'''
"""
response = get_completion(prompt)
print(response)
输出结果如下,
1. NASA - 1
2. 地方政府 - 0
3. 工程 - 0
4. 员工满意度 - 1
5. 联邦政府 - 1
示例代码,
topic_dict = {i.split(' - ')[0]: int(i.split(' - ')[1]) for i in response.split(sep='\n')}
if topic_dict['1. NASA'] == 1:
print("ALERT: New NASA story!")
输出结果如下,
ALERT: New NASA story!
5. 转化
5-1. 转化
在本课中,我们将探讨如何将大型语言模型用于文本转换任务,如语言翻译、拼写和语法检查、语气调整和格式转换。
5-2. 配置
安装 openai 依赖,
!pip install openai
!export OPENAI_API_KEY='sk-...'
加载API密钥和相关的Python库,
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.getenv('OPENAI_API_KEY')
在整个课程中,我们将使用 OpenAI 的 gpt-3.5-turbo 模型和聊天完成度端点(chat completions endpoint)。
这个辅助函数将使我们更容易使用提示语和查看生成的输出,
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # this is the degree of randomness of the model's output
)
return response.choices[0].message["content"]
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
示例代码,
输出结果如下,
未完待续!
refer: https://learn.deeplearning.ai/