upload files

This commit is contained in:
Logan Zou
2023-04-28 22:41:45 +08:00
committed by GitHub
parent cfabd60001
commit 45edfa360c
4 changed files with 2461 additions and 0 deletions

21
content/1. 简介.md Normal file
View File

@ -0,0 +1,21 @@
# 简介
**作者 吴恩达教授**
欢迎来到本课程,我们将为开发人员介绍 ChatGPT 提示工程。本课程由 Isa Fulford 教授和我一起授课。Isa Fulford 是 OpenAI 的技术团队成员,曾开发过受欢迎的 ChatGPT 检索插件,并且在教授人们如何在产品中使用 LLM 或 LLM 技术方面做出了很大贡献。她还参与编写了教授人们使用 Prompt 的 OpenAI cookbook。
互联网上有很多有关提示的材料例如《30 prompts everyone has to know》之类的文章。这些文章主要集中在 ChatGPT Web 用户界面上,许多人在使用它执行特定的、通常是一次性的任务。但是,我认为 LLM 或大型语言模型作为开发人员的更强大功能是使用 API 调用到 LLM以快速构建软件应用程序。我认为这方面还没有得到充分的重视。实际上我们在 DeepLearning.AI 的姊妹公司 AI Fund 的团队一直在与许多初创公司合作,将这些技术应用于许多不同的应用程序上。看到 LLM API 能够让开发人员非常快速地构建应用程序,这真是令人兴奋。
在本课程中,我们将与您分享一些可能性以及如何实现它们的最佳实践。
随着大型语言模型LLM的发展LLM 大致可以分为两种类型即基础LLM和指令微调LLM。基础LLM是基于文本训练数据训练出预测下一个单词能力的模型其通常是在互联网和其他来源的大量数据上训练的。例如如果你以“从前有一只独角兽”作为提示基础LLM可能会继续预测“生活在一个与所有独角兽朋友的神奇森林中”。但是如果你以“法国的首都是什么”为提示则基础LLM可能会根据互联网上的文章将答案预测为“法国最大的城市是什么法国的人口是多少因为互联网上的文章很可能是有关法国国家的问答题目列表。
许多 LLMs 的研究和实践的动力正在指令调整的 LLMs 上。指令调整的 LLMs 已经被训练来遵循指令。因此,如果你问它,“法国的首都是什么?”,它更有可能输出“法国的首都是巴黎”。指令调整的 LLMs 的训练通常是从已经训练好的基本 LLMs 开始,该模型已经在大量文本数据上进行了训练。然后,使用输入是指令、输出是其应该返回的结果的数据集来对其进行微调,要求它遵循这些指令。然后通常使用一种称为 RLHFreinforcement learning from human feedback人类反馈强化学习的技术进行进一步改进使系统更能够有帮助地遵循指令。
因为指令调整的 LLMs 已经被训练成有益、诚实和无害的所以与基础LLMs相比它们更不可能输出有问题的文本如有害输出。许多实际使用场景已经转向指令调整的LLMs。您在互联网上找到的一些最佳实践可能更适用于基础LLMs但对于今天的大多数实际应用我们建议将注意力集中在指令调整的LLMs上这些LLMs更容易使用而且由于OpenAI和其他LLM公司的工作它们变得更加安全和更加协调。
因此,本课程将重点介绍针对指令调整 LLM 的最佳实践,这是我们建议您用于大多数应用程序的。在继续之前,我想感谢 OpenAI 和 DeepLearning.ai 团队为 Izzy 和我所提供的材料作出的贡献。我非常感激 OpenAI 的 Andrew Main、Joe Palermo、Boris Power、Ted Sanders 和 Lillian Weng他们参与了我们的头脑风暴材料的制定和审核为这个短期课程编制了课程大纲。我也感激 Deep Learning 方面的 Geoff Ladwig、Eddy Shyu 和 Tommy Nelson 的工作。
当您使用指令调整 LLM 时,请类似于考虑向另一个人提供指令,假设它是一个聪明但不知道您任务的具体细节的人。当 LLM 无法正常工作时,有时是因为指令不够清晰。例如,如果您说“请为我写一些关于阿兰·图灵的东西”,清楚表明您希望文本专注于他的科学工作、个人生活、历史角色或其他方面可能会更有帮助。更多的,您还可以指定文本采取像专业记者写作的语调,或者更像是您向朋友写的随笔。
当然,如果你想象一下让一位新毕业的大学生为你完成这个任务,你甚至可以提前指定他们应该阅读哪些文本片段来写关于 Alan Turing的文本那么这能够帮助这位新毕业的大学生更好地成功完成这项任务。下一章你会看到如何让提示清晰明确创建提示的一个重要原则你还会从提示的第二个原则中学到给LLM时间去思考。

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,837 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 迭代式提示开发\n",
"\n",
"当使用 LLM 构建应用程序时,我从来没有在第一次尝试中就成功使用最终应用程序中所需的 Prompt。但这并不重要只要您有一个好的迭代过程来不断改进您的 Prompt那么你就能够得到一个适合任务的 Prompt。我认为在提示方面第一次成功的几率可能会高一些但正如上所说第一个提示是否有效并不重要。最重要的是为您的应用程序找到有效提示的过程。\n",
"\n",
"因此,在本章中,我们将以从产品说明书中生成营销文案这一示例,展示一些框架,以提示你思考如何迭代地分析和完善你的 Prompt。\n",
"\n",
"如果您之前与我一起上过机器学习课程,您可能见过我使用的一张图表,说明了机器学习开发的流程。通常是先有一个想法,然后再实现它:编写代码,获取数据,训练模型,这会给您一个实验结果。然后您可以查看输出结果,进行错误分析,找出它在哪里起作用或不起作用,甚至可以更改您想要解决的问题的确切思路或方法,然后更改实现并运行另一个实验等等,反复迭代,以获得有效的机器学习模型。在编写 Prompt 以使用 LLM 开发应用程序时,这个过程可能非常相似,您有一个关于要完成的任务的想法,可以尝试编写第一个 Prompt满足上一章说过的两个原则清晰明确并且给系统足够的时间思考。然后您可以运行它并查看结果。如果第一次效果不好那么迭代的过程就是找出为什么指令不够清晰或为什么没有给算法足够的时间思考以便改进想法、改进提示等等循环多次直到找到适合您的应用程序的 Prompt。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 环境配置\n",
"\n",
"同上一章,我们首先需要配置使用 OpenAI API 的环境"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import openai\n",
"import os\n",
"from dotenv import load_dotenv, find_dotenv\n",
"# 导入第三方库\n",
"\n",
"_ = load_dotenv(find_dotenv())\n",
"# 读取系统中的环境变量\n",
"\n",
"openai.api_key = os.getenv('OPENAI_API_KEY')\n",
"# 设置 API_KEY"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# 一个封装 OpenAI 接口的函数,参数为 Prompt返回对应结果\n",
"def get_completion(prompt, model=\"gpt-3.5-turbo\"):\n",
" '''\n",
" prompt: 对应的提示\n",
" model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户可以选择 gpt-4\n",
" '''\n",
" messages = [{\"role\": \"user\", \"content\": prompt}]\n",
" response = openai.ChatCompletion.create(\n",
" model=model,\n",
" messages=messages,\n",
" temperature=0, # 模型输出的温度系数,控制输出的随机程度\n",
" )\n",
" # 调用 OpenAI 的 ChatCompletion 接口\n",
" return response.choices[0].message[\"content\"]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 任务——从产品说明书生成一份营销产品描述"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"这里有一个椅子的产品说明书,描述说它是一个中世纪灵感家族的一部分,讨论了构造、尺寸、椅子选项、材料等等,产地是意大利。假设您想要使用这份说明书帮助营销团队为在线零售网站撰写营销式描述"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# 示例:产品说明书\n",
"fact_sheet_chair = \"\"\"\n",
"OVERVIEW\n",
"- Part of a beautiful family of mid-century inspired office furniture, \n",
"including filing cabinets, desks, bookcases, meeting tables, and more.\n",
"- Several options of shell color and base finishes.\n",
"- Available with plastic back and front upholstery (SWC-100) \n",
"or full upholstery (SWC-110) in 10 fabric and 6 leather options.\n",
"- Base finish options are: stainless steel, matte black, \n",
"gloss white, or chrome.\n",
"- Chair is available with or without armrests.\n",
"- Suitable for home or business settings.\n",
"- Qualified for contract use.\n",
"\n",
"CONSTRUCTION\n",
"- 5-wheel plastic coated aluminum base.\n",
"- Pneumatic chair adjust for easy raise/lower action.\n",
"\n",
"DIMENSIONS\n",
"- WIDTH 53 CM | 20.87”\n",
"- DEPTH 51 CM | 20.08”\n",
"- HEIGHT 80 CM | 31.50”\n",
"- SEAT HEIGHT 44 CM | 17.32”\n",
"- SEAT DEPTH 41 CM | 16.14”\n",
"\n",
"OPTIONS\n",
"- Soft or hard-floor caster options.\n",
"- Two choices of seat foam densities: \n",
"medium (1.8 lb/ft3) or high (2.8 lb/ft3)\n",
"- Armless or 8 position PU armrests \n",
"\n",
"MATERIALS\n",
"SHELL BASE GLIDER\n",
"- Cast Aluminum with modified nylon PA6/PA66 coating.\n",
"- Shell thickness: 10 mm.\n",
"SEAT\n",
"- HD36 foam\n",
"\n",
"COUNTRY OF ORIGIN\n",
"- Italy\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Introducing our stunning mid-century inspired office chair, the perfect addition to any home or business setting. Part of a beautiful family of office furniture, including filing cabinets, desks, bookcases, meeting tables, and more, this chair is available in several options of shell color and base finishes to suit your style. Choose from plastic back and front upholstery (SWC-100) or full upholstery (SWC-110) in 10 fabric and 6 leather options.\n",
"\n",
"The chair is constructed with a 5-wheel plastic coated aluminum base and features a pneumatic chair adjust for easy raise/lower action. It is available with or without armrests and is qualified for contract use. The base finish options are stainless steel, matte black, gloss white, or chrome.\n",
"\n",
"Measuring at a width of 53 cm, depth of 51 cm, and height of 80 cm, with a seat height of 44 cm and seat depth of 41 cm, this chair is designed for ultimate comfort. You can also choose between soft or hard-floor caster options and two choices of seat foam densities: medium (1.8 lb/ft3) or high (2.8 lb/ft3). The armrests are available in either an armless or 8 position PU option.\n",
"\n",
"The materials used in the construction of this chair are of the highest quality. The shell base glider is made of cast aluminum with modified nylon PA6/PA66 coating and has a shell thickness of 10 mm. The seat is made of HD36 foam, ensuring maximum comfort and durability.\n",
"\n",
"This chair is made in Italy and is the perfect combination of style and functionality. Upgrade your workspace with our mid-century inspired office chair today!\n"
]
}
],
"source": [
"# 提示:基于说明书生成营销描述\n",
"prompt = f\"\"\"\n",
"Your task is to help a marketing team create a \n",
"description for a retail website of a product based \n",
"on a technical fact sheet.\n",
"\n",
"Write a product description based on the information \n",
"provided in the technical specifications delimited by \n",
"triple backticks.\n",
"\n",
"Technical specifications: ```{fact_sheet_chair}```\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# 示例:产品说明书\n",
"fact_sheet_chair = \"\"\"\n",
"概述\n",
"\n",
" 美丽的中世纪风格办公家具系列的一部分,包括文件柜、办公桌、书柜、会议桌等。\n",
" 多种外壳颜色和底座涂层可选。\n",
" 可选塑料前后靠背装饰SWC-100或10种面料和6种皮革的全面装饰SWC-110。\n",
" 底座涂层选项为:不锈钢、哑光黑色、光泽白色或铬。\n",
" 椅子可带或不带扶手。\n",
" 适用于家庭或商业场所。\n",
" 符合合同使用资格。\n",
"\n",
"结构\n",
"\n",
" 五个轮子的塑料涂层铝底座。\n",
" 气动椅子调节,方便升降。\n",
"\n",
"尺寸\n",
"\n",
" 宽度53厘米|20.87英寸\n",
" 深度51厘米|20.08英寸\n",
" 高度80厘米|31.50英寸\n",
" 座椅高度44厘米|17.32英寸\n",
" 座椅深度41厘米|16.14英寸\n",
"\n",
"选项\n",
"\n",
" 软地板或硬地板滚轮选项。\n",
" 两种座椅泡沫密度可选中等1.8磅/立方英尺或高2.8磅/立方英尺)。\n",
" 无扶手或8个位置PU扶手。\n",
"\n",
"材料\n",
"外壳底座滑动件\n",
"\n",
" 改性尼龙PA6/PA66涂层的铸铝。\n",
" 外壳厚度10毫米。\n",
" 座椅\n",
" HD36泡沫\n",
"\n",
"原产国\n",
"\n",
" 意大利\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"产品描述:\n",
"\n",
"我们自豪地推出美丽的中世纪风格办公家具系列其中包括文件柜、办公桌、书柜、会议桌等。我们的产品采用多种外壳颜色和底座涂层以满足您的个性化需求。您可以选择塑料前后靠背装饰SWC-100或10种面料和6种皮革的全面装饰SWC-110以使您的办公室更加舒适和时尚。\n",
"\n",
"我们的底座涂层选项包括不锈钢、哑光黑色、光泽白色或铬,以满足您的不同需求。椅子可带或不带扶手,适用于家庭或商业场所。我们的产品符合合同使用资格,为您提供更加可靠的保障。\n",
"\n",
"我们的产品采用五个轮子的塑料涂层铝底座气动椅子调节方便升降。尺寸为宽度53厘米|20.87英寸深度51厘米|20.08英寸高度80厘米|31.50英寸座椅高度44厘米|17.32英寸座椅深度41厘米|16.14英寸,为您提供舒适的使用体验。\n",
"\n",
"我们的产品还提供软地板或硬地板滚轮选项两种座椅泡沫密度可选中等1.8磅/立方英尺或高2.8磅/立方英尺以及无扶手或8个位置PU扶手以满足您的不同需求。\n",
"\n",
"我们的产品采用改性尼龙PA6/PA66涂层的铸铝外壳底座滑动件外壳厚度为10毫米座椅采用HD36泡沫为您提供更加舒适的使用体验。我们的产品原产国为意大利为您提供更加优质的品质保证。\n"
]
}
],
"source": [
"# 提示:基于说明书创建营销描述\n",
"prompt = f\"\"\"\n",
"你的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。\n",
"\n",
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n",
"\n",
"技术说明: {fact_sheet_chair}\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 问题一:生成文本太长\n",
"\n",
"它似乎很好地写了一个描述,介绍了一个惊人的中世纪灵感办公椅,很好地完成了要求,即从技术说明书开始编写产品描述。但是当我看到这个时,我会觉得这个太长了。\n",
"\n",
"所以我有了一个想法。我写了一个提示得到了结果。但是我对它不是很满意因为它太长了所以我会澄清我的提示并说最多使用50个字。\n",
"\n",
"因此,我通过要求它限制生成文本长度来解决这一问题"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Introducing our beautiful medieval-style office furniture collection, including filing cabinets, desks, bookcases, and conference tables. Choose from a variety of shell colors and base coatings, with optional plastic or fabric/leather decoration. The chair features a plastic-coated aluminum base with five wheels and pneumatic height adjustment. Perfect for home or commercial use. Made in Italy.\n"
]
}
],
"source": [
"# 优化后的 Prompt要求生成描述不多于 50 词\n",
"prompt = f\"\"\"\n",
"Your task is to help a marketing team create a \n",
"description for a retail website of a product based \n",
"on a technical fact sheet.\n",
"\n",
"Write a product description based on the information \n",
"provided in the technical specifications delimited by \n",
"triple backticks.\n",
"\n",
"Use at most 50 words.\n",
"\n",
"Technical specifications: ```{fact_sheet_chair}```\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"取出回答并根据空格拆分答案为54个字较好地完成了我的要求"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"54\n"
]
}
],
"source": [
"lst = response.split()\n",
"print(len(lst))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"中世纪风格办公家具系列,包括文件柜、办公桌、书柜、会议桌等。多种颜色和涂层可选,可带或不带扶手。底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。适用于家庭或商业场所,符合合同使用资格。意大利制造。\n"
]
}
],
"source": [
"# 优化后的 Prompt要求生成描述不多于 50 词\n",
"prompt = f\"\"\"\n",
"您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。\n",
"\n",
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n",
"\n",
"使用最多50个词。\n",
"\n",
"技术规格:```{fact_sheet_chair}```\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"97"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 由于中文需要分词,此处直接计算整体长度\n",
"len(response)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"LLM在遵循非常精确的字数限制方面表现得还可以但并不那么出色。有时它会输出60或65个单词的内容但这还算是合理的。这原因是 LLM 解释文本使用一种叫做分词器的东西,但它们往往在计算字符方面表现一般般。有很多不同的方法来尝试控制你得到的输出的长度。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 问题二:文本关注在错误的细节上\n",
"\n",
"我们会发现的第二个问题是,这个网站并不是直接向消费者销售,它实际上旨在向家具零售商销售家具,他们会更关心椅子的技术细节和材料。在这种情况下,你可以修改这个提示,让它更精确地描述椅子的技术细节。\n",
"\n",
"解决方法:要求它专注于与目标受众相关的方面。"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Introducing our beautiful medieval-style office furniture collection, including file cabinets, desks, bookcases, and conference tables. Available in multiple shell colors and base coatings, with optional plastic or fabric/leather upholstery. Features a plastic-coated aluminum base with five wheels and pneumatic chair adjustment. Suitable for home or commercial use and made with high-quality materials, including cast aluminum with a modified nylon coating and HD36 foam. Made in Italy.\n"
]
}
],
"source": [
"# 优化后的 Prompt说明面向对象应具有什么性质且侧重于什么方面\n",
"prompt = f\"\"\"\n",
"Your task is to help a marketing team create a \n",
"description for a retail website of a product based \n",
"on a technical fact sheet.\n",
"\n",
"Write a product description based on the information \n",
"provided in the technical specifications delimited by \n",
"triple backticks.\n",
"\n",
"The description is intended for furniture retailers, \n",
"so should be technical in nature and focus on the \n",
"materials the product is constructed from.\n",
"\n",
"Use at most 50 words.\n",
"\n",
"Technical specifications: ```{fact_sheet_chair}```\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"这款中世纪风格办公家具系列包括文件柜、办公桌、书柜和会议桌等适用于家庭或商业场所。可选多种外壳颜色和底座涂层底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。椅子可带或不带扶手可选软地板或硬地板滚轮两种座椅泡沫密度可选。外壳底座滑动件采用改性尼龙PA6/PA66涂层的铸铝座椅采用HD36泡沫。原产国为意大利。\n"
]
}
],
"source": [
"# 优化后的 Prompt说明面向对象应具有什么性质且侧重于什么方面\n",
"prompt = f\"\"\"\n",
"您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。\n",
"\n",
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n",
"\n",
"该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。\n",
"\n",
"使用最多50个单词。\n",
"\n",
"技术规格: ```{fact_sheet_chair}```\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我可能进一步想要在描述的结尾包括产品ID。因此我可以进一步改进这个提示要求在描述的结尾包括在技术说明中的每个7个字符产品ID。"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Introducing our beautiful medieval-style office furniture collection, featuring file cabinets, desks, bookshelves, and conference tables. Available in multiple shell colors and base coatings, with optional plastic or fabric/leather decorations. The chair comes with or without armrests and has a plastic-coated aluminum base with five wheels and pneumatic height adjustment. Suitable for home or commercial use. Made in Italy.\n",
"\n",
"Product IDs: SWC-100, SWC-110\n"
]
}
],
"source": [
"# 更进一步,要求在描述末尾包含 7个字符的产品ID\n",
"prompt = f\"\"\"\n",
"Your task is to help a marketing team create a \n",
"description for a retail website of a product based \n",
"on a technical fact sheet.\n",
"\n",
"Write a product description based on the information \n",
"provided in the technical specifications delimited by \n",
"triple backticks.\n",
"\n",
"The description is intended for furniture retailers, \n",
"so should be technical in nature and focus on the \n",
"materials the product is constructed from.\n",
"\n",
"At the end of the description, include every 7-character \n",
"Product ID in the technical specification.\n",
"\n",
"Use at most 50 words.\n",
"\n",
"Technical specifications: ```{fact_sheet_chair}```\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"这款中世纪风格的办公家具系列包括文件柜、办公桌、书柜和会议桌等适用于家庭或商业场所。可选多种外壳颜色和底座涂层底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。椅子可带或不带扶手可选塑料前后靠背装饰或10种面料和6种皮革的全面装饰。座椅采用HD36泡沫可选中等或高密度座椅高度44厘米深度41厘米。外壳底座滑动件采用改性尼龙PA6/PA66涂层的铸铝外壳厚度为10毫米。原产国为意大利。产品IDSWC-100/SWC-110。\n"
]
}
],
"source": [
"# 更进一步\n",
"prompt = f\"\"\"\n",
"您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。\n",
"\n",
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n",
"\n",
"该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。\n",
"\n",
"在描述末尾包括技术规格中每个7个字符的产品ID。\n",
"\n",
"使用最多50个单词。\n",
"\n",
"技术规格: ```{fact_sheet_chair}```\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 问题三:需要一个表格形式的描述\n",
"\n",
"以上是许多开发人员通常会经历的迭代提示开发的简短示例。我的建议是像上一章中所演示的那样Prompt 应该保持清晰和明确,并在必要时给模型一些思考时间。在这些要求的基础上,通常值得首先尝试编写 Prompt ,看看会发生什么,然后从那里开始迭代地完善 Prompt以逐渐接近所需的结果。因此许多成功的提示都是通过这种迭代过程得出的。我将向您展示一个更复杂的提示示例可能会让您对ChatGPT的能力有更深入的了解。\n",
"\n",
"这里我添加了一些额外的说明,要求它抽取信息并组织成表格,并指定表格的列、表名和格式,还要求它将所有内容格式化为可以在网页使用的 HTML。"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<div>\n",
" <p>Introducing our beautiful collection of medieval-style office furniture, including file cabinets, desks, bookcases, and conference tables. Choose from a variety of shell colors and base coatings. You can opt for plastic front and backrest decoration (SWC-100) or full decoration with 10 fabrics and 6 leathers (SWC-110). Base coating options include stainless steel, matte black, glossy white, or chrome. The chair is available with or without armrests and is suitable for both home and commercial settings. It is contract eligible.</p>\n",
" <p>The structure features a plastic-coated aluminum base with five wheels. The chair is pneumatically adjustable for easy height adjustment.</p>\n",
" <p>Product IDs: SWC-100, SWC-110</p>\n",
" <table>\n",
" <caption>Product Dimensions</caption>\n",
" <tr>\n",
" <td>Width</td>\n",
" <td>20.87 inches</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Depth</td>\n",
" <td>20.08 inches</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Height</td>\n",
" <td>31.50 inches</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Seat Height</td>\n",
" <td>17.32 inches</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Seat Depth</td>\n",
" <td>16.14 inches</td>\n",
" </tr>\n",
" </table>\n",
" <p>Options include soft or hard floor casters. You can choose from two seat foam densities: medium (1.8 pounds/cubic foot) or high (2.8 pounds/cubic foot). The chair is available with or without 8-position PU armrests.</p>\n",
" <p>Materials:</p>\n",
" <ul>\n",
" <li>Shell, base, and sliding parts: cast aluminum coated with modified nylon PA6/PA66. Shell thickness: 10mm.</li>\n",
" <li>Seat: HD36 foam</li>\n",
" </ul>\n",
" <p>Made in Italy.</p>\n",
"</div>\n"
]
}
],
"source": [
"# 要求它抽取信息并组织成表格,并指定表格的列、表名和格式\n",
"prompt = f\"\"\"\n",
"Your task is to help a marketing team create a \n",
"description for a retail website of a product based \n",
"on a technical fact sheet.\n",
"\n",
"Write a product description based on the information \n",
"provided in the technical specifications delimited by \n",
"triple backticks.\n",
"\n",
"The description is intended for furniture retailers, \n",
"so should be technical in nature and focus on the \n",
"materials the product is constructed from.\n",
"\n",
"At the end of the description, include every 7-character \n",
"Product ID in the technical specification.\n",
"\n",
"After the description, include a table that gives the \n",
"product's dimensions. The table should have two columns.\n",
"In the first column include the name of the dimension. \n",
"In the second column include the measurements in inches only.\n",
"\n",
"Give the table the title 'Product Dimensions'.\n",
"\n",
"Format everything as HTML that can be used in a website. \n",
"Place the description in a <div> element.\n",
"\n",
"Technical specifications: ```{fact_sheet_chair}```\n",
"\"\"\"\n",
"\n",
"response = get_completion(prompt)\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
" <p>Introducing our beautiful collection of medieval-style office furniture, including file cabinets, desks, bookcases, and conference tables. Choose from a variety of shell colors and base coatings. You can opt for plastic front and backrest decoration (SWC-100) or full decoration with 10 fabrics and 6 leathers (SWC-110). Base coating options include stainless steel, matte black, glossy white, or chrome. The chair is available with or without armrests and is suitable for both home and commercial settings. It is contract eligible.</p>\n",
" <p>The structure features a plastic-coated aluminum base with five wheels. The chair is pneumatically adjustable for easy height adjustment.</p>\n",
" <p>Product IDs: SWC-100, SWC-110</p>\n",
" <table>\n",
" <caption>Product Dimensions</caption>\n",
" <tr>\n",
" <td>Width</td>\n",
" <td>20.87 inches</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Depth</td>\n",
" <td>20.08 inches</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Height</td>\n",
" <td>31.50 inches</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Seat Height</td>\n",
" <td>17.32 inches</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Seat Depth</td>\n",
" <td>16.14 inches</td>\n",
" </tr>\n",
" </table>\n",
" <p>Options include soft or hard floor casters. You can choose from two seat foam densities: medium (1.8 pounds/cubic foot) or high (2.8 pounds/cubic foot). The chair is available with or without 8-position PU armrests.</p>\n",
" <p>Materials:</p>\n",
" <ul>\n",
" <li>Shell, base, and sliding parts: cast aluminum coated with modified nylon PA6/PA66. Shell thickness: 10mm.</li>\n",
" <li>Seat: HD36 foam</li>\n",
" </ul>\n",
" <p>Made in Italy.</p>\n",
"</div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 表格是以 HTML 格式呈现的,加载出来\n",
"from IPython.display import display, HTML\n",
"\n",
"display(HTML(response))"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<div>\n",
"<h2>中世纪风格办公家具系列椅子</h2>\n",
"<p>这款椅子是中世纪风格办公家具系列的一部分适用于家庭或商业场所。它有多种外壳颜色和底座涂层可选包括不锈钢、哑光黑色、光泽白色或铬。您可以选择带或不带扶手的椅子以及软地板或硬地板滚轮选项。此外您可以选择两种座椅泡沫密度中等1.8磅/立方英尺或高2.8磅/立方英尺)。</p>\n",
"<p>椅子的外壳底座滑动件是改性尼龙PA6/PA66涂层的铸铝外壳厚度为10毫米。座椅采用HD36泡沫底座是五个轮子的塑料涂层铝底座可以进行气动椅子调节方便升降。此外椅子符合合同使用资格是您理想的选择。</p>\n",
"<p>产品IDSWC-100</p>\n",
"</div>\n",
"\n",
"<table>\n",
" <caption>产品尺寸</caption>\n",
" <tr>\n",
" <th>宽度</th>\n",
" <td>20.87英寸</td>\n",
" </tr>\n",
" <tr>\n",
" <th>深度</th>\n",
" <td>20.08英寸</td>\n",
" </tr>\n",
" <tr>\n",
" <th>高度</th>\n",
" <td>31.50英寸</td>\n",
" </tr>\n",
" <tr>\n",
" <th>座椅高度</th>\n",
" <td>17.32英寸</td>\n",
" </tr>\n",
" <tr>\n",
" <th>座椅深度</th>\n",
" <td>16.14英寸</td>\n",
" </tr>\n",
"</table>\n"
]
}
],
"source": [
"# 要求它抽取信息并组织成表格,并指定表格的列、表名和格式\n",
"prompt = f\"\"\"\n",
"您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。\n",
"\n",
"根据```标记的技术说明书中提供的信息,编写一个产品描述。\n",
"\n",
"该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。\n",
"\n",
"在描述末尾包括技术规格中每个7个字符的产品ID。\n",
"\n",
"在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的测量值。\n",
"\n",
"给表格命名为“产品尺寸”。\n",
"\n",
"将所有内容格式化为可用于网站的HTML格式。将描述放在<div>元素中。\n",
"\n",
"技术规格:```{fact_sheet_chair}```\n",
"\"\"\"\n",
"\n",
"response = get_completion(prompt)\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<h2>中世纪风格办公家具系列椅子</h2>\n",
"<p>这款椅子是中世纪风格办公家具系列的一部分适用于家庭或商业场所。它有多种外壳颜色和底座涂层可选包括不锈钢、哑光黑色、光泽白色或铬。您可以选择带或不带扶手的椅子以及软地板或硬地板滚轮选项。此外您可以选择两种座椅泡沫密度中等1.8磅/立方英尺或高2.8磅/立方英尺)。</p>\n",
"<p>椅子的外壳底座滑动件是改性尼龙PA6/PA66涂层的铸铝外壳厚度为10毫米。座椅采用HD36泡沫底座是五个轮子的塑料涂层铝底座可以进行气动椅子调节方便升降。此外椅子符合合同使用资格是您理想的选择。</p>\n",
"<p>产品IDSWC-100</p>\n",
"</div>\n",
"\n",
"<table>\n",
" <caption>产品尺寸</caption>\n",
" <tr>\n",
" <th>宽度</th>\n",
" <td>20.87英寸</td>\n",
" </tr>\n",
" <tr>\n",
" <th>深度</th>\n",
" <td>20.08英寸</td>\n",
" </tr>\n",
" <tr>\n",
" <th>高度</th>\n",
" <td>31.50英寸</td>\n",
" </tr>\n",
" <tr>\n",
" <th>座椅高度</th>\n",
" <td>17.32英寸</td>\n",
" </tr>\n",
" <tr>\n",
" <th>座椅深度</th>\n",
" <td>16.14英寸</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 表格是以 HTML 格式呈现的,加载出来\n",
"from IPython.display import display, HTML\n",
"\n",
"display(HTML(response))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"本章的主要内容是 LLM 在开发应用程序中的迭代式提示开发过程。开发者需要先尝试编写提示,然后通过迭代逐步完善它,直至得到需要的结果。关键在于拥有一种有效的开发提示的过程,而不是知道完美的提示。对于一些更复杂的应用程序,可以对多个样本进行迭代开发提示并进行评估。最后,可以在更成熟的应用程序中测试多个提示在多个样本上的平均或最差性能。在使用 Jupyter 代码笔记本示例时,请尝试不同的变化并查看结果。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

View File

@ -0,0 +1,441 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 第七章 扩展\n",
"\n",
"扩展是将短文本,例如一组说明或主题列表,输入到大型语言模型中,让模型生成更长的文本,例如基于某个主题的电子邮件或论文。这样做有一些很好的用途,例如将大型语言模型用作头脑风暴的伙伴。但这种做法也存在一些问题,例如某人可能会使用它来生成大量垃圾邮件。因此,当你使用大型语言模型的这些功能时,请仅以负责任的方式和有益于人们的方式使用它们。\n",
"\n",
"在本章中,你将学会如何基于 OpenAI API 生成适用于每个客户评价的客户服务电子邮件。我们还将使用模型的另一个输入参数称为温度,这种参数允许您在模型响应中变化探索的程度和多样性。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 一、环境配置\n",
"\n",
"同以上几章,你需要类似的代码来配置一个可以使用 OpenAI API 的环境"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 将自己的 API-KEY 导入系统环境变量\n",
"!export OPENAI_API_KEY='api-key'"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import openai\n",
"import os\n",
"from dotenv import load_dotenv, find_dotenv\n",
"# 导入第三方库\n",
"\n",
"_ = load_dotenv(find_dotenv())\n",
"# 读取系统中的环境变量\n",
"\n",
"openai.api_key = os.getenv('OPENAI_API_KEY')\n",
"# 设置 API_KEY"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# 一个封装 OpenAI 接口的函数,参数为 Prompt返回对应结果\n",
"def get_completion(prompt, model=\"gpt-3.5-turbo\", temperature=0):\n",
" '''\n",
" prompt: 对应的提示\n",
" model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户可以选择 gpt-4\n",
" temperature: 温度系数\n",
" '''\n",
" messages = [{\"role\": \"user\", \"content\": prompt}]\n",
" response = openai.ChatCompletion.create(\n",
" model=model,\n",
" messages=messages,\n",
" temperature=temperature, # 模型输出的温度系数,控制输出的随机程度\n",
" )\n",
" # 调用 OpenAI 的 ChatCompletion 接口\n",
" return response.choices[0].message[\"content\"]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 二、定制客户邮件"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们将根据客户评价和情感撰写自定义电子邮件响应。因此,我们将给定客户评价和情感,并生成自定义响应即使用 LLM 根据客户评价和评论情感生成定制电子邮件。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们首先给出一个示例,包括一个评论及对应的情感"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# given the sentiment from the lesson on \"inferring\",\n",
"# and the original customer message, customize the email\n",
"sentiment = \"negative\"\n",
"\n",
"# review for a blender\n",
"review = f\"\"\"\n",
"So, they still had the 17 piece system on seasonal \\\n",
"sale for around $49 in the month of November, about \\\n",
"half off, but for some reason (call it price gouging) \\\n",
"around the second week of December the prices all went \\\n",
"up to about anywhere from between $70-$89 for the same \\\n",
"system. And the 11 piece system went up around $10 or \\\n",
"so in price also from the earlier sale price of $29. \\\n",
"So it looks okay, but if you look at the base, the part \\\n",
"where the blade locks into place doesnt look as good \\\n",
"as in previous editions from a few years ago, but I \\\n",
"plan to be very gentle with it (example, I crush \\\n",
"very hard items like beans, ice, rice, etc. in the \\ \n",
"blender first then pulverize them in the serving size \\\n",
"I want in the blender then switch to the whipping \\\n",
"blade for a finer flour, and use the cross cutting blade \\\n",
"first when making smoothies, then use the flat blade \\\n",
"if I need them finer/less pulpy). Special tip when making \\\n",
"smoothies, finely cut and freeze the fruits and \\\n",
"vegetables (if using spinach-lightly stew soften the \\ \n",
"spinach then freeze until ready for use-and if making \\\n",
"sorbet, use a small to medium sized food processor) \\ \n",
"that you plan to use that way you can avoid adding so \\\n",
"much ice if at all-when making your smoothie. \\\n",
"After about a year, the motor was making a funny noise. \\\n",
"I called customer service but the warranty expired \\\n",
"already, so I had to buy another one. FYI: The overall \\\n",
"quality has gone done in these types of products, so \\\n",
"they are kind of counting on brand recognition and \\\n",
"consumer loyalty to maintain sales. Got it in about \\\n",
"two days.\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# 我们可以在推理那章学习到如何对一个评论判断其情感倾向\n",
"sentiment = \"negative\"\n",
"\n",
"# 一个产品的评价\n",
"review = f\"\"\"\n",
"他们在11月份的季节性销售期间以约49美元的价格出售17件套装折扣约为一半。\\\n",
"但由于某些原因可能是价格欺诈到了12月第二周同样的套装价格全都涨到了70美元到89美元不等。\\\n",
"11件套装的价格也上涨了大约10美元左右。\\\n",
"虽然外观看起来还可以,但基座上锁定刀片的部分看起来不如几年前的早期版本那么好。\\\n",
"不过我打算非常温柔地使用它,例如,\\\n",
"我会先在搅拌机中将像豆子、冰、米饭等硬物研磨,然后再制成所需的份量,\\\n",
"切换到打蛋器制作更细的面粉,或者在制作冰沙时先使用交叉切割刀片,然后使用平面刀片制作更细/不粘的效果。\\\n",
"制作冰沙时,特别提示:\\\n",
"将水果和蔬菜切碎并冷冻(如果使用菠菜,则轻轻煮软菠菜,然后冷冻直到使用;\\\n",
"如果制作果酱,则使用小到中号的食品处理器),这样可以避免在制作冰沙时添加太多冰块。\\\n",
"大约一年后,电机发出奇怪的噪音,我打电话给客服,但保修已经过期了,所以我不得不再买一个。\\\n",
"总的来说,这些产品的总体质量已经下降,因此它们依靠品牌认可和消费者忠诚度来维持销售。\\\n",
"货物在两天内到达。\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们已经使用推断课程中学到的提取了情感,这是一个关于搅拌机的客户评价,现在我们将根据情感定制回复。\n",
"\n",
"这里的指令是假设你是一个客户服务AI助手你的任务是为客户发送电子邮件回复根据通过三个反引号分隔的客户电子邮件生成一封回复以感谢客户的评价。"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dear Valued Customer,\n",
"\n",
"Thank you for taking the time to leave a review about our product. We are sorry to hear that you experienced an increase in price and that the quality of the product did not meet your expectations. We apologize for any inconvenience this may have caused you.\n",
"\n",
"We would like to assure you that we take all feedback seriously and we will be sure to pass your comments along to our team. If you have any further concerns, please do not hesitate to reach out to our customer service team for assistance.\n",
"\n",
"Thank you again for your review and for choosing our product. We hope to have the opportunity to serve you better in the future.\n",
"\n",
"Best regards,\n",
"\n",
"AI customer agent\n"
]
}
],
"source": [
"prompt = f\"\"\"\n",
"You are a customer service AI assistant.\n",
"Your task is to send an email reply to a valued customer.\n",
"Given the customer email delimited by ```, \\\n",
"Generate a reply to thank the customer for their review.\n",
"If the sentiment is positive or neutral, thank them for \\\n",
"their review.\n",
"If the sentiment is negative, apologize and suggest that \\\n",
"they can reach out to customer service. \n",
"Make sure to use specific details from the review.\n",
"Write in a concise and professional tone.\n",
"Sign the email as `AI customer agent`.\n",
"Customer review: ```{review}```\n",
"Review sentiment: {sentiment}\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"尊敬的客户,\n",
"\n",
"非常感谢您对我们产品的评价。我们非常抱歉您在购买过程中遇到了价格上涨的问题。我们一直致力于为客户提供最优惠的价格,但由于市场波动,价格可能会有所变化。我们深表歉意,如果您需要任何帮助,请随时联系我们的客户服务团队。\n",
"\n",
"我们非常感谢您对我们产品的详细评价和使用技巧。我们将会把您的反馈传达给我们的产品团队,以便改进我们的产品质量和性能。\n",
"\n",
"再次感谢您对我们的支持和反馈。如果您需要任何帮助或有任何疑问,请随时联系我们的客户服务团队。\n",
"\n",
"祝您一切顺利!\n",
"\n",
"AI客户代理\n"
]
}
],
"source": [
"prompt = f\"\"\"\n",
"你是一位客户服务的AI助手。\n",
"你的任务是给一位重要客户发送邮件回复。\n",
"根据客户通过“```”分隔的评价,生成回复以感谢客户的评价。提醒模型使用评价中的具体细节\n",
"用简明而专业的语气写信。\n",
"作为“AI客户代理”签署电子邮件。\n",
"客户评论:\n",
"```{review}```\n",
"评论情感:{sentiment}\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 三、使用温度系数\n",
"\n",
"接下来,我们将使用语言模型的一个称为“温度”的参数,它将允许我们改变模型响应的多样性。您可以将温度视为模型探索或随机性的程度。\n",
"\n",
"例如,在一个特定的短语中,“我的最爱食品”最有可能的下一个词是“比萨”,其次最有可能的是“寿司”和“塔可”。因此,在温度为零时,模型将总是选择最有可能的下一个词,而在较高的温度下,它还将选择其中一个不太可能的词,在更高的温度下,它甚至可能选择塔可,而这种可能性仅为五分之一。您可以想象,随着模型继续生成更多单词的最终响应,“我的最爱食品是比萨”将会与第一个响应“我的最爱食品是塔可”产生差异。因此,随着模型的继续,这两个响应将变得越来越不同。\n",
"\n",
"一般来说,在构建需要可预测响应的应用程序时,我建议使用温度为零。在所有课程中,我们一直设置温度为零,如果您正在尝试构建一个可靠和可预测的系统,我认为您应该选择这个温度。如果您尝试以更具创意的方式使用模型,可能需要更广泛地输出不同的结果,那么您可能需要使用更高的温度。"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# given the sentiment from the lesson on \"inferring\",\n",
"# and the original customer message, customize the email\n",
"sentiment = \"negative\"\n",
"\n",
"# review for a blender\n",
"review = f\"\"\"\n",
"So, they still had the 17 piece system on seasonal \\\n",
"sale for around $49 in the month of November, about \\\n",
"half off, but for some reason (call it price gouging) \\\n",
"around the second week of December the prices all went \\\n",
"up to about anywhere from between $70-$89 for the same \\\n",
"system. And the 11 piece system went up around $10 or \\\n",
"so in price also from the earlier sale price of $29. \\\n",
"So it looks okay, but if you look at the base, the part \\\n",
"where the blade locks into place doesnt look as good \\\n",
"as in previous editions from a few years ago, but I \\\n",
"plan to be very gentle with it (example, I crush \\\n",
"very hard items like beans, ice, rice, etc. in the \\ \n",
"blender first then pulverize them in the serving size \\\n",
"I want in the blender then switch to the whipping \\\n",
"blade for a finer flour, and use the cross cutting blade \\\n",
"first when making smoothies, then use the flat blade \\\n",
"if I need them finer/less pulpy). Special tip when making \\\n",
"smoothies, finely cut and freeze the fruits and \\\n",
"vegetables (if using spinach-lightly stew soften the \\ \n",
"spinach then freeze until ready for use-and if making \\\n",
"sorbet, use a small to medium sized food processor) \\ \n",
"that you plan to use that way you can avoid adding so \\\n",
"much ice if at all-when making your smoothie. \\\n",
"After about a year, the motor was making a funny noise. \\\n",
"I called customer service but the warranty expired \\\n",
"already, so I had to buy another one. FYI: The overall \\\n",
"quality has gone done in these types of products, so \\\n",
"they are kind of counting on brand recognition and \\\n",
"consumer loyalty to maintain sales. Got it in about \\\n",
"two days.\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dear valued customer,\n",
"\n",
"Thank you for taking the time to share your review with us. We are sorry to hear that you were disappointed with the prices of our products and the quality of our blender. We apologize for any inconvenience this may have caused you.\n",
"\n",
"We value your feedback and would like to make things right for you. Please feel free to contact our customer service team so we can assist you with any concerns or issues you may have. We are committed to providing you with the best possible service and products.\n",
"\n",
"Thank you again for your review and for being a loyal customer. We hope to have the opportunity to serve you better in the future.\n",
"\n",
"Sincerely,\n",
"AI customer agent\n"
]
}
],
"source": [
"prompt = f\"\"\"\n",
"You are a customer service AI assistant.\n",
"Your task is to send an email reply to a valued customer.\n",
"Given the customer email delimited by ```, \\\n",
"Generate a reply to thank the customer for their review.\n",
"If the sentiment is positive or neutral, thank them for \\\n",
"their review.\n",
"If the sentiment is negative, apologize and suggest that \\\n",
"they can reach out to customer service. \n",
"Make sure to use specific details from the review.\n",
"Write in a concise and professional tone.\n",
"Sign the email as `AI customer agent`.\n",
"Customer review: ```{review}```\n",
"Review sentiment: {sentiment}\n",
"\"\"\"\n",
"response = get_completion(prompt, temperature=0.7)\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"尊敬的客户,\n",
"\n",
"非常感谢您对我们产品的评价。我们由衷地为您在购买过程中遇到的问题表示抱歉。我们确实在12月份的第二周调整了价格但这是由于市场因素所致并非价格欺诈。我们深刻意识到您对产品质量的担忧我们将尽一切努力改进产品以提供更好的体验。\n",
"\n",
"我们非常感激您对我们产品的使用经验和制作技巧的分享。您的建议和反馈对我们非常重要,我们将以此为基础,进一步改进我们的产品。\n",
"\n",
"如果您有任何疑问或需要进一步帮助,请随时联系我们的客户服务部门。我们将尽快回复您并提供帮助。\n",
"\n",
"最后,请再次感谢您对我们产品的评价和选择。我们期待着未来与您的合作。\n",
"\n",
"此致\n",
"\n",
"敬礼\n",
"\n",
"AI客户代理\n"
]
}
],
"source": [
"prompt = f\"\"\"\n",
"你是一名客户服务的AI助手。\n",
"你的任务是给一位重要的客户发送邮件回复。\n",
"根据通过“```”分隔的客户电子邮件生成回复,以感谢客户的评价。\n",
"如果情感是积极的或中性的,感谢他们的评价。\n",
"如果情感是消极的,道歉并建议他们联系客户服务。\n",
"请确保使用评论中的具体细节。\n",
"以简明和专业的语气写信。\n",
"以“AI客户代理”的名义签署电子邮件。\n",
"客户评价:```{review}```\n",
"评论情感:{sentiment}\n",
"\"\"\"\n",
"response = get_completion(prompt, temperature=0.7)\n",
"print(response)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"在温度为零时每次执行相同的提示时您应该期望获得相同的完成。而使用温度为0.7,则每次都会获得不同的输出。\n",
"\n",
"所以,您可以看到它与我们之前收到的电子邮件不同。让我们再次执行它,以显示我们将再次获得不同的电子邮件。\n",
"\n",
"因此,我建议您自己尝试温度,以查看输出如何变化。总之,在更高的温度下,模型的输出更加随机。您几乎可以将其视为在更高的温度下,助手更易分心,但也许更有创造力。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}