面向开发人员的 ChatGPT 提示词教程中文版

面向开发人员的 ChatGPT 提示词教程中文版

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: 写出清晰而具体的指示

技巧 1: 使用分隔符来清楚地表明输入的不同部分

  • 分隔符可以是任何东西,例如: ```, """, < >, <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)

输出结果如下,

[
  {
    "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: 要求模型检查条件是否得到满足

示例代码 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: "少许样本"提示

举出完成任务的成功例子,然后要求模型执行任务。

示例代码,

prompt = f"""
你的任务是以一致的风格来回答。

<孩子>:教我耐心。

<祖父母>:雕琢最深山谷的河流从一个小小的泉眼流过;\
最宏伟的交响乐源于一个音符;最复杂的织锦从一根线开始。

<孩子>:教我如何坚韧不拔。
"""
response = get_completion(prompt)
print(response)

输出结果如下,

<祖父母>:坚韧不拔的力量来自于内心的信念和毅力。要有目标,有计划,有毅力,不断努力,不轻易放弃,才能走向成功的道路。

原则 2: 给模型 "思考 "的时间

技巧 1: 具体说明完成一项任务所需的步骤

示例代码,

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: 在匆忙得出结论之前,要求模型自己解决问题

示例代码,

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 给出了正确的答案,也就是这个学生的解决方案实际上是不正确的。

模型的局限性: 幻觉

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. 从产品概况表中生成营销产品描述

示例代码,

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: 文本太长

  • 限制单词/句子/字符的数量

示例代码,

prompt = f"""
你的任务是帮助一个营销团队在技术说明书的基础上为一个零售网站创建一个产品描述。

根据用三个反斜线划定的技术说明书中提供的信息,写出一份产品描述。

最多使用50个字。

技术说明书:```{fact_sheet_chair}```
"""
response = get_completion(prompt)
print(response)

输出结果如下,

美丽的中世纪办公家具系列,包括文件柜、办公桌、书柜、会议桌等等。多种颜色和底座表面处理可供选择。适用于家庭或商业环境。

示例代码,

len(response)

输出结果如下,

59

2-5. 问题 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)

输出结果如下,

这款中世纪办公家具系列包括文件柜、办公桌、书柜、会议桌等等,可供多种外壳颜色和底座表面处理选择。座椅可选10种布料和6种皮革,底座表面处理选项有不锈钢、亚光黑、亮白或铬。座椅有带或不带扶手可供选择,适用于家庭或商业环境。铝制底座和气动调节装置方便提升/降低动作。产品ID:SWC-100/SWC-110。

2-6. 问题 3. 描述需要一个维度的表格

  • 要求它提取信息并将其组织在一个表格中

示例代码,

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

示例代码,

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. 归纳的文本

示例代码,

prod_review = """
为我女儿的生日买了这个熊猫毛绒玩具,她很喜欢它,带着它到处跑。
它很柔软,超级可爱,而且它的脸看起来很友好。
不过对于我的花费来说,它有点小。
我想可能有其他选择,同样的价格,更大的。
它比预期早到一天,所以我在给她之前自己玩了一下。
"""

3-4. 用字/句/字数限制进行总结

示例代码,

prompt = f"""
你的任务是对一个电子商务网站的产品评论生成一个简短的摘要。

对下面用三个反斜线分隔的评论进行总结,最多 30 个字。

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

response = get_completion(prompt)
print(response)

输出结果如下,

柔软可爱的熊猫毛绒玩具,女儿很喜欢,但有点小。提前到货。

3-5. 以运输和交付为重点进行总结

示例代码,

prompt = f"""
你的任务是对一个电子商务网站的产品评论生成一个简短的摘要。

对下面用三个反斜线分隔的评论进行总结,最多 30 个字,\
并专注于提到产品运输和交付的任何方面。

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

response = get_completion(prompt)
print(response)

输出结果如下,

柔软可爱的熊猫玩具,提前一天送达,但有点小。

3-6. 总结时注重价格和价值

示例代码,

prompt = f"""
你的任务是为一个电子商务网站的产品评论生成一个简短的摘要,
以反馈给负责确定产品价格的定价部门。

对下面用三个反斜线分隔的评论进行总结,最多 30 个字,\
并专注于与价格和感知价值有关的任何方面。

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

response = get_completion(prompt)
print(response)

输出结果如下,

柔软可爱,但价值不高。更大的选择可能更好。

3-7. 尝试 “提取” 而不是 “总结”

示例代码,

prompt = f"""
你的任务是对一个电子商务网站的产品评论生成一个简短的摘要。

从下面用三个反斜线分隔的评论中提取与运输和交货有关的信息,
最多 30 个字。

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

response = get_completion(prompt)
print(response)

输出结果如下,

运输快,提前一天到达。

3-8. 总结多个产品评论

示例代码,

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. 产品评论内容

示例代码,

lamp_review = """
我的卧室需要一盏漂亮的灯,这盏灯有额外的存储空间,价格也不高。
很快就收到了。 
我们的灯的绳子在运输过程中断了,公司很高兴地送来了一个新的。
也是在几天内送到的。它很容易装起来。 
我有一个缺失的部分,所以我联系了他们的支持,
他们很快就给我弄到了缺失的部分!!
在我看来,Lumina是一家伟大的公司,它关心他们的客户和产品!
"""

4-4. 情感(正面/负面)

示例代码,

prompt = f"""
下面的产品评论是以三条反斜线为界限的,它的情绪是什么?

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

输出结果如下,

情绪是积极的,对产品和公司都有好评。

示例代码,

prompt = f"""
下面的产品评论是以三条反斜线为界限的,它的情绪是什么?

用一个词来回答,可以是 "正面",也可以是 "负面"。

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

输出结果如下,

正面

4-5. 识别情感的类型

示例代码,

prompt = f"""
找出以下评论的作者所表达的情感清单。
列表中包括不超过五个项目。
将你的答案格式化为由逗号隔开的小写单词列表。

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

输出结果如下,

高兴, 满意, 赞赏, 感激, 信任

4-6. 识别愤怒

示例代码,

prompt = f"""
以下评论的作者是在表达愤怒吗?
该评论用三个反斜线划定。
请给出您的答案,是或不是。

Review text: '''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

输出结果如下,

不是。

4-7. 从客户评论中提取产品和公司名称

示例代码,

prompt = f"""
从评论文本中找出以下物品: 
- 评论者购买的物品
- 制造该物品的公司

该评论以三条反斜线为界。
将你的回应格式化为JSON对象,以 "项目 "和 "品牌 "为键。
如果该信息不存在,使用 "未知 "作为值。
使你的回应尽可能简短。
  
评论文本:'''{lamp_review}'''
"""
response = get_completion(prompt)
print(response)

输出结果如下,

{
  "项目": "灯",
  "品牌": "Lumina"
}

4-8: 一次性完成多项任务

示例代码,

prompt = f"""
从评论文本中找出以下项目: 
- 情绪(积极或消极)
- 评论者是否在表达愤怒?(真或假)
- 评论者购买的物品
- 制造该物品的公司

评论是以三条反斜线为界的。
将您的回复格式化为JSON对象,以 "情绪"、"愤怒"、"物品 "和 "品牌 "为键。
如果信息不存在,使用 "未知 "作为值。
使你的响应尽可能的短。
将 "愤怒 "的值格式化为一个布尔值。

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

输出结果如下,

{
  "情绪": "积极",
  "愤怒": false,
  "物品": "灯",
  "品牌": "Lumina"
}

4-9: 推断主题

示例代码,

story = """
在政府最近进行的一项调查中,
公共部门的雇员被要求对他们所工作的部门的满意程度进行评分。
结果显示,美国国家航空航天局是最受欢迎的部门,满意度为95%。

美国国家航空航天局的一名员工约翰-史密斯对调查结果发表了评论,
他说:"我对美国国家航空航天局名列前茅并不感到惊讶。
这是一个伟大的工作场所,有了不起的人和难以置信的机会。
我很自豪能成为这样一个创新组织的一部分。"

这一结果也受到美国国家航空航天局管理团队的欢迎,
局长汤姆-约翰逊说:
"我们很高兴听到我们的员工对他们在美国国家航空航天局的工作感到满意。
我们有一个才华横溢、尽职尽责的团队,他们为实现我们的目标而不懈努力,
看到他们的努力工作得到了回报,这真是太棒了"。

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

4-10. 推断出5个主题

示例代码,

prompt = f"""
确定在以下文本中讨论的五个主题。下面的文字是由三个反斜线划定的。

使每个项目有一到两个字的长度。

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

文本样本: '''{story}'''
"""
response = get_completion(prompt)
print(response)

输出结果如下,

主题:政府部门调查结果

- 美国国家航空航天局是最受欢迎的部门,满意度为95%。
- 社会安全局的满意度最低,只有45%的员工表示他们对自己的工作感到满意。
- 美国国家航空航天局员工对工作感到自豪和满意。
- 美国国家航空航天局管理团队对员工满意度的结果感到欢迎。
- 政府承诺解决员工在调查中提出的问题,并努力提高所有部门的工作满意度。

示例代码,

response.split(sep=',')

输出结果如下,

['主题:政府部门调查结果\n\n- 美国国家航空航天局是最受欢迎的部门,满意度为95%。\n- 社会安全局的满意度最低,只有45%的员工表示他们对自己的工作感到满意。\n- 美国国家航空航天局员工对工作感到自豪和满意。\n- 美国国家航空航天局管理团队对员工满意度的结果感到欢迎。\n- 政府承诺解决员工在调查中提出的问题,并努力提高所有部门的工作满意度。']

4-11. 为某些主题制作新闻提醒

示例代码,

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"]

5-3. 翻译

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)

输出结果如下,

法语:Je veux commander un ballon de basket
西班牙语:Quiero ordenar una pelota de baloncesto
中文:我想订购一个篮球

示例代码,

prompt = f"""
将以下文字以正式和非正式的形式翻译成日语: 
'Would you like to order a pillow?'
"""
response = get_completion(prompt)
print(response)

输出结果如下,

正式: 枕をご注文になりますか?
非正式: 枕欲しい?

5-4. 通用翻译机

想象一下,你是一家大型跨国电子商务公司的IT负责人。用户用他们所有的母语向你发送IT问题的信息。你的员工来自世界各地,只说他们的母语。你需要一个万能的翻译器!

示例代码,

user_messages = [
  "La performance du système est plus lente que d'habitude.",  # System performance is slower than normal         
  "Mi monitor tiene píxeles que no se iluminan.",              # My monitor has pixels that are not lighting
  "Il mio mouse non funziona",                                 # My mouse is not working
  "Mój klawisz Ctrl jest zepsuty",                             # My keyboard has a broken control key
  "我的屏幕在闪烁"                                               # My screen is flashing
] 

示例代码,

for issue in user_messages:
    prompt = f"Tell me what language this is: ```{issue}```"
    lang = get_completion(prompt)
    print(f"Original message ({lang}): {issue}")

    prompt = f"""
    Translate the following  text to English \
    and Chinese: ```{issue}```
    """
    response = get_completion(prompt)
    print(response, "\n")

输出结果如下,

Original message (This is French.): La performance du système est plus lente que d'habitude.
English: The system performance is slower than usual.
Chinese: 系统性能比平常慢。 

Original message (This is Spanish.): Mi monitor tiene píxeles que no se iluminan.
My monitor has pixels that do not light up.
我的显示器有不亮的像素。 

Original message (This is Italian.): Il mio mouse non funziona
English: My mouse is not working
Chinese: 我的鼠标不工作 

Original message (This is Polish.): Mój klawisz Ctrl jest zepsuty
English: My Ctrl key is broken.
Chinese: 我的Ctrl键坏了。 

Original message (This is Chinese (Simplified).): 我的屏幕在闪烁
English: My screen is flickering.
Chinese: 我的屏幕在闪烁。 

5-5. 语气转换

写作可以根据目标受众而变化。ChatGPT可以产生不同的音调。

示例代码,

prompt = f"""
将以下内容从俚语翻译成商业信函: 
'Dude, This is Joe, check out this spec on this standing lamp.'
"""
response = get_completion(prompt)
print(response)

输出结果如下,

Dear Sir/Madam,

I am writing to bring your attention to a standing lamp that I believe may be of interest to you. The specifications of this lamp are as follows:

[Insert specifications here]

Thank you for your time and consideration.

Sincerely,

Joe

5-6. 格式转换

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)

输出结果如下,

<table>
  <thead>
    <tr>
      <th>resturant employees</th>
      <th>name</th>
      <th>email</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Shyam</td>
      <td>[email protected]</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Bob</td>
      <td>[email protected]</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Jai</td>
      <td>[email protected]</td>
    </tr>
  </tbody>
</table>

示例代码,

from IPython.display import display, Markdown, Latex, HTML, JSON
display(HTML(response))

在这里插入图片描述

5-7. 拼写检查/语法检查

下面是一些常见的语法和拼写问题的例子以及LLM的反应。

为了向LLM发出信号,表明你希望它校对你的文本,你可以指示模型 “校对” 或 “校对和纠正”(‘proofread’ or ‘proofread and correct’)。

示例代码,

text = [ 
  "The girl with the black and white puppies have a ball.",  # The girl has a ball.
  "Yolanda has her notebook.", # ok
  "Its going to be a long day. Does the car need it’s oil changed?",  # Homonyms
  "Their goes my freedom. There going to bring they’re suitcases.",  # Homonyms
  "Your going to need you’re notebook.",  # Homonyms
  "That medicine effects my ability to sleep. Have you heard of the butterfly affect?", # Homonyms
  "This phrase is to cherck chatGPT for speling abilitty"  # spelling
]
for t in text:
    prompt = f"""Proofread and correct the following text
    and rewrite the corrected version. If you don't find
    and errors, just say "No errors found". Don't use 
    any punctuation around the text:
    ```{t}```"""
    response = get_completion(prompt)
    print(response)

输出结果如下,

The girl with the black and white puppies has a ball.
No errors found.
It's going to be a long day. Does the car need its oil changed?
Their goes my freedom. There going to bring they're suitcases.

Corrected version: 
There goes my freedom. They're going to bring their suitcases.
You're going to need your notebook.
That medicine affects my ability to sleep. Have you heard of the butterfly effect?
This phrase is to check ChatGPT for spelling ability.

示例代码,

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"proofread and correct this review: ```{text}```"
response = get_completion(prompt)
print(response)

输出结果如下,

I got this for my daughter's birthday because 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. However, one of the ears is a bit lower than the other, and I don't think that was designed to be asymmetrical. Additionally, it's a bit small for what I paid for it. I think there might be other options that are bigger for the same price. On the positive side, it arrived a day earlier than expected, so I got to play with it myself before I gave it to my daughter.

示例代码,

from redlines import Redlines

diff = Redlines(text,response)
display(Markdown(diff.output_markdown))

在这里插入图片描述

示例代码,

prompt = f"""
proofread and correct this review. Make it more compelling. 
Ensure it follows APA style guide and targets an advanced reader. 
Output in markdown format.
Text: ```{text}```
"""
response = get_completion(prompt)
display(Markdown(response))

输出结果如下,

Title: A Soft and Cute Panda Plushie for All Ages

As an adult, I can attest that pandas are not just for kids. That's why I got this adorable panda plushie for my daughter's birthday, after she kept taking mine from my room. And let me tell you, it was a hit!

The plushie is super soft and cuddly, making it the perfect companion for my daughter. She takes it everywhere with her, and it has quickly become her favorite toy. However, I did notice that one of the ears is a bit lower than the other, which I don't think was designed to be asymmetrical. But that doesn't take away from its cuteness.

The only downside is that it's a bit small for the price I paid. I think there might be other options that are bigger for the same price. But overall, I'm happy with my purchase.

One thing that surprised me was that it arrived a day earlier than expected. This gave me the chance to play with it myself before giving it to my daughter. And I have to say, I was impressed with the quality and attention to detail.

In conclusion, if you're looking for a soft and cute panda plushie for yourself or a loved one, this is definitely a great option. Just be aware that it might be a bit smaller than expected.

6. 展开

6-1. 展开

在这一课中,你将根据每个客户的评论来生成客户服务电子邮件。

6-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"]

6-3. 自定义对客户电子邮件的自动回复

示例代码,

# 给出 "推断 "一课中的情绪,以及客户的原始信息,定制电子邮件
sentiment = "负面"

# 搅拌器的评论
review = f"""
因此,他们在11月仍有17件系统的季节性销售,价格约为49美元,
约为半价,但由于某种原因(称之为价格欺诈),
在12月的第二周,同一系统的价格都涨到了约70-89美元之间的地方。
因此,它看起来还不错,但如果你看一下底座,
刀片锁定的部分看起来没有几年前的版本那么好,
但我打算对它非常温柔
(例如,我把非常硬的东西,如豆子、冰块、大米等,先在搅拌机中粉碎,
然后再粉碎。例如,我先在搅拌器中粉碎非常坚硬的物品,
如豆类、冰块、大米等,然后在搅拌器中把它们粉碎成我想要的大小,
再换成打发刀片来制作更细的面粉,制作冰沙时先使用横切刀片,
如果我需要更细/更少的浆状,就使用平切刀片)。
制作冰沙时的特别提示,将水果和蔬菜切得很细并冷冻起来
(如果使用菠菜--轻度炖软菠菜,然后冷冻直到准备使用--如果制作冰沙,
使用中小型食品加工机)。
如果你打算使用这种方式,
你可以避免在制作冰沙时加入那么多冰块。
大约一年后,电机发出了奇怪的噪音。
我给客户服务部打电话,但保修期已经过了,
所以我不得不再买一台。
参考:这类产品的整体质量已经下降,
所以他们有点指望品牌知名度和消费者忠诚度来维持销售。
大约两天后就收到了。
"""

示例代码,

prompt = f"""
你是一个客户服务的AI助理。
你的任务是给一个有价值的客户发送电子邮件回复。
给出以"```"为界的客户电子邮件,生成一个回复以感谢客户的评论。
如果情绪是积极的或中性的,感谢他们的评论。
如果评价是负面的,则表示歉意,并建议他们可以联系客服人员。
确保使用评论中的具体细节。
用简明和专业的语气来写。
在电子邮件中署名为 "AI客户代理"。
Customer review: ```{review}```
Review sentiment: {sentiment}
"""
response = get_completion(prompt)
print(response)

输出结果如下,

尊敬的客户,

非常感谢您对我们产品的评论。我们非常抱歉您在使用过程中遇到了问题。我们理解您的不满和失望,并为此向您道歉。

我们建议您联系我们的客服人员,以便我们能够更好地了解您的问题,并为您提供更好的解决方案。我们将竭尽全力为您提供最好的服务,以确保您的满意度。

再次感谢您对我们产品的支持和反馈。

祝您一切顺利!

AI客户代理

6-4. 提醒模型使用客户电子邮件中的详细信息

示例代码,

prompt = f"""
你是一个客户服务的AI助理。
你的任务是给一个有价值的客户发送电子邮件回复。
给出以"```"为界的客户电子邮件,生成一个回复以感谢客户的评论。
如果情绪是积极的或中性的,感谢他们的评论。
如果评价是负面的,则表示歉意,并建议他们可以联系客服人员。
确保使用评论中的具体细节。
用简明和专业的语气来写。
在电子邮件中署名为 "AI客户代理"。
Customer review: ```{review}```
Review sentiment: {sentiment}
"""
response = get_completion(prompt, temperature=0.7)
print(response)

输出结果如下,

尊敬的客户,

非常感谢您分享您的经验和反馈,我很遗憾听到您的不满。
我们对我们的产品的品质非常注重,我们感到非常抱歉,您的搅拌机出现问题。
由于您的保修期已过,我们建议您联系我们的客户服务团队,以便他们能够为您提供更多的帮助和支持。
如果您需要任何进一步的帮助或支持,请随时联系我们。

谢谢您的支持和反馈。

AI客户代理

7. Chatbot

7-1. 聊天格式

在本课中,你将探索如何利用聊天格式与聊天机器人进行扩展对话,为特定的任务或行为提供个性化或专业化服务。

7-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"]

def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, # this is the degree of randomness of the model's output
    )
#     print(str(response.choices[0].message))
    return response.choices[0].message["content"]

7-3. 使用聊天格式

示例代码,

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)

输出结果如下,

你好,Isa!很高兴见到你。有什么我可以帮你的吗?

示例代码,

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)

输出结果如下,

当然!您的名字是Isa。

7-4. 订单机器人

我们可以自动收集用户的提示和助手的回应,建立一个OrderBot。OrderBot将在一家披萨店接受订单。

示例代码,

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,一个为披萨店收集订单的自动化服务。
你首先问候顾客,然后收集订单,再询问是取货还是送货。
你等待收集整个订单,然后进行总结,并最后一次检查顾客是否想添加其他东西。
如果是送货,你就要求提供地址。
最后你收取付款。
确保澄清所有的选项、额外的东西和尺寸,以便从菜单上唯一地识别该项目。
你要用简短的、非常对话式的友好风格来回答。
该菜单包括:
意大利香肠比萨饼 12.95,10.00,7.00 
奶酪比萨 10.95, 9.25, 6.50 
茄子比萨11.95, 9.75, 6.75 
薯条 4.50, 3.50 
希腊沙拉 7.25 
浇头: 
额外奶酪 2.00、 
蘑菇 1.50 
香肠 3.00 
加拿大培根 3.50 
AI酱 1.50 
辣椒 1.00 
饮料: 
可乐 3.00, 2.00, 1.00 
雪碧 3.00, 2.00, 1.00 
瓶装水 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

输出结果如下,输入 “香肠 2”,

在这里插入图片描述
输入 “大号”,

在这里插入图片描述
输入 “取货”,
在这里插入图片描述
输入 “不需要”,
在这里插入图片描述

输入 “不需要”,

在这里插入图片描述
聊天结束,
在这里插入图片描述

示例代码,

messages =  context.copy()
messages.append(
{'role':'system', 'content':'创建一个前一个食品订单的json摘要。逐项列出每个项目的价格、  字段应该是:1)比萨饼,包括尺寸 2)配料列表 3)饮料列表,包括尺寸 4)配菜列表,包括尺寸 5)总价 '},    
)
 #The fields should be 1) pizza, price 2) list of toppings 3) list of drinks, include size include price  4) list of sides include size include price, 5)total price '},    

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

输出结果如下,


{
    "order": {
        "pizza": {
            "size": "large",
            "type": "Italian Sausage",
            "price": 12.95
        },
        "toppings": [],
        "drinks": [],
        "sides": [],
        "total_price": 12.95
    }
}

完结!

refer: https://learn.deeplearning.ai/

猜你喜欢

转载自blog.csdn.net/engchina/article/details/130543841