Merge branch 'datawhalechina:PDF' into PDF

This commit is contained in:
Logan Zou
2023-07-23 20:14:58 +08:00
committed by GitHub
4 changed files with 165 additions and 107 deletions

File diff suppressed because one or more lines are too long

View File

@ -5,10 +5,7 @@
"id": "3630c235-f891-4874-bd0a-5277d4d6aa82",
"metadata": {},
"source": [
"# 第五章 推断\n",
"\n",
"在这节课中,你将从产品评论和新闻文章中推断情感和主题。\n",
"\n"
"# 第五章 推断"
]
},
{
@ -16,10 +13,13 @@
"id": "5f3abbee",
"metadata": {},
"source": [
"在这一章中,我们将通过一个故事,引领你了解如何从产品评价和新闻文章中推导出情感和主题。\n",
"\n",
"推断任务可以看作是模型接收文本作为输入,并执行某种分析的过程。其中涉及提取标签提取实体理解文本情感等等。如果你想要从一段文本中提取正面或负面情感,在传统的机器学习工作流程中,需要收集标签数据集、训练模型、确定如何在云端部署模型并进行推断。这样做可能效果还不错,但是执行全流程需要很多工作。而且对于每个任务,如情感分析、提取实体等等,都需要训练和部署单独的模型。\n",
"让我们先想象一下,你是一名初创公司的数据分析师,你的任务是从各种产品评论和新闻文章中提取出关键的情感和主题。这些任务包括了标签提取实体提取、以及理解文本情感等等。在传统的机器学习流程中,需要收集标签化的数据集、训练模型、确定如何在云端部署模型并进行推断。尽管这种方式可能会产生不错的效果,但完成这一全流程需要耗费大量的时间和精力。而且,每一个任务,如情感分析、实体提取等等,都需要训练和部署单独的模型。\n",
"\n",
"LLM 的一个非常好的特点是,对于许多这样的任务,你只需要编写一个 Prompt 即可开始产出结果,而不需要进行大量的工作。这极大地加快了应用程序开发的速度。你还可以只使用一个模型和一个 API 来执行许多不同的任务,而不需要弄清楚如何训练和部署许多不同的模型。"
"然而就在你准备投入繁重工作的时候你发现了大型语言模型LLM。LLM的一个明显优点是对于许多这样的任务你只需要编写一个 Prompt就可以开始生成结果大大减轻了你的工作负担。这个发现像是找到了一把神奇的钥匙让应用程序开发的速度加快了许多。最令你兴奋的是你可以仅仅使用一个模型和一个API来执行许多不同的任务无需再纠结如何训练和部署许多不同的模型。\n",
"\n",
"让我们开始这一章的学习一起探索如何利用LLM加快我们的工作进程提高我们的工作效率。"
]
},
{
@ -27,11 +27,23 @@
"id": "51d2fdfa-c99f-4750-8574-dba7712cd7f0",
"metadata": {},
"source": [
"## 一、情感推断\n",
"\n",
"### 1.1 情感倾向分析\n",
"\n",
"以电商平台关于一盏台灯的评论为例,可以对其传达的情感进行二分类(正向/负向)。"
"## 一、情感推断"
]
},
{
"cell_type": "markdown",
"id": "ffc63a4b",
"metadata": {},
"source": [
"### 1.1 情感倾向分析"
]
},
{
"cell_type": "markdown",
"id": "21767f0b",
"metadata": {},
"source": [
"让我们以一则电商平台上的台灯评论为例,通过此例,我们将学习如何对评论进行情感二分类(正面/负面)。"
]
},
{
@ -49,20 +61,14 @@
"\"\"\""
]
},
{
"cell_type": "markdown",
"id": "cc4ec4ca",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"id": "30d6e4bd-3337-45a3-8c99-a734cdd06743",
"metadata": {},
"source": [
"现在让我们来编写一个 Prompt 来分类这个评论的情感。如果我想让系统告诉我这个评论的情感是什么,只需编写 “以下品评论的情感是什么” 这个 Prompt ,加上通常的分隔符和评论文本等。\n",
"接下来,我们将尝试编写一个 Prompt ,用以分类这条商品评论的情感。如果我想让系统解析这条评论的情感倾向,只需编写“以下品评论的情感倾向是什么?”这样的 Prompt 加上一些标准的分隔符和评论文本等。\n",
"\n",
"然后我们运行一。结果显示这个产品评论的情感是积极的,这似乎非常正确的。虽然这盏台灯不完美,但这个客户似乎非常满意。这似乎是一家关心客户和产品的伟大公司,可以认为积极的情感似乎是正确的答案。"
"然后我们将这个程序运行一。结果表明,这条商品评论的情感倾向是正面的,这似乎非常准确。尽管这款台灯并非完美无缺,但是这位顾客对它似乎相当满意。这个公司看起来非常重视客户体验和产品质量,因此,认定评论的情感倾向为正面似乎是正确的判断。"
]
},
{
@ -91,12 +97,6 @@
"print(response)"
]
},
{
"cell_type": "markdown",
"id": "a562e656",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"id": "76be2320",
@ -136,9 +136,15 @@
"id": "81d2a973-1fa4-4a35-ae35-a2e746c0e91b",
"metadata": {},
"source": [
"### 2.2 识别情感类型\n",
"\n",
"仍然使用台灯评论,我们尝试另一个 Prompt 。这次我需要模型识别出评论作者所表达的情感,并归纳为列表,不超过五项。"
"### 2.2 识别情感类型"
]
},
{
"cell_type": "markdown",
"id": "c696daa9",
"metadata": {},
"source": [
"接下来,我们将继续使用之前的台灯评论,但这次我们会试用一个新的 Prompt 。我们希望模型能够识别出评论作者所表达的情感,并且将这些情感整理为一个不超过五项的列表。"
]
},
{
@ -166,12 +172,6 @@
"print(response)"
]
},
{
"cell_type": "markdown",
"id": "c7743a53",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"id": "cc4444f7",
@ -187,7 +187,7 @@
"source": [
"### 1.3 识别愤怒\n",
"\n",
"对于多企业来说,了解某个顾客是否非常生气很重要。所以产生了下述分类问题:下评论作者是否表达了愤怒情绪?因为如果有人真的很生气,那可能值得额外关注,让客户支持或客户成功团队联系客户以了解情况,并为客户解决问题。"
"对于多企业来说,洞察到顾客的愤怒情绪是至关重要的。这就引出了一个分类问题:下述的评论作者是否流露出了愤怒?因为如果有人真的情绪激动,那可能就意味着需要给予额外关注,因为每一个愤怒的顾客都是一个改进服务的机会,也是一个提升公司口碑的机会。这时,客户支持或者客服团队就应该介入,与客户接触,了解具体情况,然后解决他们的问题。"
]
},
{
@ -215,12 +215,6 @@
"print(response)"
]
},
{
"cell_type": "markdown",
"id": "77905fd8",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"id": "11ca57a2",
@ -234,15 +228,27 @@
"id": "936a771e-ca78-4e55-8088-2da6f3820ddc",
"metadata": {},
"source": [
"## 二、信息提取\n",
"## 二、信息提取"
]
},
{
"cell_type": "markdown",
"id": "506264c6",
"metadata": {},
"source": [
"### 2.1 商品信息提取 "
]
},
{
"cell_type": "markdown",
"id": "af474353",
"metadata": {},
"source": [
"信息提取是自然语言处理NLP的重要组成部分它帮助我们从文本中抽取特定的、我们关心的信息。我们将深入挖掘客户评论中的丰富信息。在接下来的示例中我们将要求模型识别两个关键元素购买的商品和商品的制造商。\n",
"\n",
"### 2.1 商品信息提取 \n",
"想象一下,如果你正在尝试分析一个在线电商网站上的众多评论,了解评论中提到的商品是什么、由谁制造,以及相关的积极或消极情绪,将极大地帮助你追踪特定商品或制造商在用户心中的情感趋势。\n",
"\n",
"接下来让我们从客户评论中提取更丰富的信息。信息提取是自然语言处理NLP的一部分与从文本中提取你想要知道的某些事物相关。因此在这个 Prompt 中,我要求它识别以下内容:购买物品和制造物品的公司名称。\n",
"\n",
"同样,如果你试图总结在线购物电子商务网站的许多评论,对于这些评论来说,弄清楚是什么物品、谁制造了该物品,弄清楚积极和消极的情感,有助于追踪特定物品或制造商收获的用户情感趋势。\n",
"\n",
"在下面这个示例中,我们要求它将响应格式化为一个 JSON 对象,其中物品和品牌作为键。"
"接下来的示例中,我们会要求模型将回应以一个 JSON 对象的形式呈现,其中的 key 就是商品和品牌。"
]
},
{
@ -272,19 +278,13 @@
"评论文本用三个反引号分隔。将你的响应格式化为以 “物品” 和 “品牌” 为键的 JSON 对象。\n",
"如果信息不存在,请使用 “未知” 作为值。\n",
"让你的回应尽可能简短。\n",
" \n",
"\n",
"评论文本: ```{lamp_review}```\n",
"\"\"\"\n",
"response = get_completion(prompt)\n",
"print(response)"
]
},
{
"cell_type": "markdown",
"id": "1342c732",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"id": "954d125d",
@ -298,9 +298,15 @@
"id": "a38880a5-088f-4609-9913-f8fa41fb7ba0",
"metadata": {},
"source": [
"### 2.2 综合情感推断和信息提取\n",
"\n",
"提取上述所有信息使用了 3 或 4 个 Prompt ,但实际上可以编写单个 Prompt 来同时提取所有这些信息。"
"### 2.2 综合情感推断和信息提取"
]
},
{
"cell_type": "markdown",
"id": "6d7a4474",
"metadata": {},
"source": [
"在上面小节中,我们采用了三至四个 Prompt 来提取评论中的“情绪倾向”、“是否生气”、“物品类型”和“品牌”等信息。然而,事实上,我们可以设计一个单一的 Prompt ,来同时提取所有这些信息。"
]
},
{
@ -333,10 +339,10 @@
"- 评论者购买的物品\n",
"- 制造该物品的公司\n",
"\n",
"评论用三个反引号分隔。将的响应格式化为 JSON 对象,以 “情感倾向”、“是否生气”、“物品类型” 和 “品牌” 作为键。\n",
"评论用三个反引号分隔。将的响应格式化为 JSON 对象,以 “情感倾向”、“是否生气”、“物品类型” 和 “品牌” 作为键。\n",
"如果信息不存在,请使用 “未知” 作为值。\n",
"让你的回应尽可能简短。\n",
"将 Anger 值格式化为布尔值。\n",
"将 “是否生气” 值格式化为布尔值。\n",
"\n",
"评论文本: ```{lamp_review}```\n",
"\"\"\"\n",
@ -349,7 +355,7 @@
"id": "5e09a673",
"metadata": {},
"source": [
"这个例子中,我们告诉它将愤怒值格式化为布尔值,然后输出一个 JSON。您可以自己尝试不同的变化,或者甚至尝试完全不同的评论,看看是否仍然可以准确地提取这些内容。"
"这个例子中,我们指导 LLM 将“是否生气”的情况格式化为布尔值,并输出 JSON 格式。你可以尝试对格式化模式进行各种变化,或者使用完全不同的评论来试验,看看 LLM 是否仍然可以准确地提取这些内容。"
]
},
{
@ -357,9 +363,15 @@
"id": "235fc223-2c89-49ec-ac2d-78a8e74a43ac",
"metadata": {},
"source": [
"## 三、主题推断\n",
"\n",
"大型语言模型的另一个很酷的应用是推断主题。给定一段长文本,这段文本是关于什么的?有什么话题?以以下一段虚构的报纸报道为例。"
"## 三、主题推断"
]
},
{
"cell_type": "markdown",
"id": "1386570b",
"metadata": {},
"source": [
"大型语言模型的另一个很酷的应用是推断主题。假设我们有一段长文本,我们如何判断这段文本的主旨是什么?它涉及了哪些主题?让我们通过以下一段虚构的报纸报道来具体了解一下。"
]
},
{
@ -391,9 +403,15 @@
"id": "a8ea91d6-e841-4ee2-bed9-ca4a36df177f",
"metadata": {},
"source": [
"### 3.1 推断讨论主题\n",
"\n",
"上面是一篇虚构的关于政府工作人员对他们工作机构感受的报纸文章。我们可以让它确定五个正在讨论的主题,用一两个字描述每个主题,并将输出格式化为逗号分隔的列表。"
"### 3.1 推断讨论主题"
]
},
{
"cell_type": "markdown",
"id": "a76f21f5",
"metadata": {},
"source": [
"以上是一篇关于政府员工对其工作单位感受的虚构报纸文章。我们可以要求大语言模型确定其中讨论的五个主题并用一两个词语概括每个主题。输出结果将会以逗号分隔的Python列表形式呈现。"
]
},
{
@ -425,20 +443,20 @@
"print(response)"
]
},
{
"cell_type": "markdown",
"id": "790d1435",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"id": "34be1d2a-1309-4512-841a-b6f67338938b",
"metadata": {},
"source": [
"### 3.2 为特定主题制作新闻提醒\n",
"\n",
"假设我们有一个新闻网站或类似的东西这是我们感兴趣的主题NASA、地方政府、工程、员工满意度、联邦政府等。假设我们想弄清楚针对一篇新闻文章其中涵盖了哪些主题。可以使用这样的prompt确定以下主题列表中的每个项目是否是以下文本中的主题。以 0 或 1 的形式给出答案列表。"
"### 3.2 为特定主题制作新闻提醒"
]
},
{
"cell_type": "markdown",
"id": "95b636f1",
"metadata": {},
"source": [
"假设我们有一个新闻网站或类似的平台这是我们感兴趣的主题美国航空航天局、当地政府、工程、员工满意度、联邦政府等。我们想要分析一篇新闻文章理解其包含了哪些主题。可以使用这样的prompt确定以下主题列表中的每个项目是否是以下文本中的主题。以 0 或 1 的形式给出答案列表。"
]
},
{
@ -476,20 +494,14 @@
"print(response)"
]
},
{
"cell_type": "markdown",
"id": "8f39f24a",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"id": "08247dbf",
"metadata": {},
"source": [
"有结果可见,这个故事是与关于 NASA 、员工满意度联邦政府有关,而与当地政府的、工程无关。这在机器学习中有时被称为 Zero-Shot (零样本)学习算法,因为我们没有给它任何标记的训练数据仅凭 Prompt ,它就能确定哪些主题在新闻文章中有所涵盖。\n",
"从输出结果来看,这个`story`与关于“美国航空航天局”、“员工满意度”、“联邦政府”、“当地政府”有关,而与“工程无关。这种能力在机器学习领域被称为零样本Zero-Shot学习。这是因为我们没有提供任何带标签的训练数据仅凭 Prompt ,它便能判定哪些主题在新闻文章中被包含。\n",
"\n",
"如果我们想生成一个新闻提醒,可以使用这处理新闻的程。假设我非常喜欢 NASA 所做的工作,就可以构建一个这样的系统每当 NASA 新闻出现时,输出提醒。"
"如果我们希望制定一个新闻提醒,我们同样可以用这处理新闻的程。假设我对“美国航空航天局”的工作深感兴趣,那么你就可以构建一个如此的系统每当出现与'美国宇航局'相关的新闻,系统就会输出提醒。"
]
},
{
@ -515,18 +527,12 @@
" print(\"提醒: 关于美国航空航天局的新消息\")"
]
},
{
"cell_type": "markdown",
"id": "9fc2c643",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"id": "76ccd189",
"metadata": {},
"source": [
"这就是关于推断的全部内容了,仅用几分钟时间,我们就可以构建多个用于文本进行推理的系统,以前需要熟练的机器学习开发人员数天甚至数周时间。这非常令人兴奋,无论是对于熟练的机器学习开发人员,还是对于新手来说,都可以使用 Prompt 来非常快速地构建和开始相当复杂的自然语言处理任务。"
"这就是我们关于推断的全面介绍。在短短几分钟,我们已经能够建立多个用于文本推理的系统,这是以前需要机器学习专家数天甚至数周时间才能完成的任务。这一变化无疑是令人兴奋的,因为无论你是经验丰富的机器学习开发,还是刚入门的新手,都能利用输入 Prompt 快速开始复杂的自然语言处理任务。"
]
},
{

View File

@ -15,8 +15,7 @@
"id": "f0bdc2c9",
"metadata": {},
"source": [
"\n",
"使用一个大型语言模型的一个令人兴奋的事情是,我们可以用它来构建一个定制的聊天机器人 (Chatbot) ,只需要很少的工作量。在这一节中,我们将探索如何利用聊天的方式,与个性化(或专门针对特定任务或行为的)聊天机器人进行扩展对话。"
"大型语言模型带给我们的激动人心的一种可能性是我们可以通过它构建定制的聊天机器人Chatbot而且只需很少的工作量。在这一章节的探索中我们将带你了解如何利用会话形式与具有个性化特性或专门为特定任务或行为设计的聊天机器人进行深度对话。"
]
},
{
@ -24,7 +23,7 @@
"id": "e6fae355",
"metadata": {},
"source": [
"像 ChatGPT 这样的聊天模型实际上是组装成以一系列消息作为输入,并返回一个模型生成的消息作为输出的。这种聊天格式原本的设计目标是简便多轮对话,但我们通过之前的学习可以知道,它对于不会涉及任何对话的**单轮任务**也同样有用。\n"
"像 ChatGPT 这样的聊天模型实际上是组装成以一系列消息作为输入,并返回一个模型生成的消息作为输出的。这种聊天格式原本的设计目标是简便多轮对话,但我们通过之前的学习可以知道,它对于不会涉及任何对话的**单轮任务**也同样有用。"
]
},
{
@ -93,9 +92,21 @@
"id": "e105c1b4",
"metadata": {},
"source": [
"### 1.1 讲笑话\n",
"### 1.1 讲笑话"
]
},
{
"cell_type": "markdown",
"id": "a0b37933",
"metadata": {},
"source": [
"我们通过系统消息来定义:“你是一个说话像莎士比亚的助手。”这是我们向助手描述**它应该如何表现的方式**。\n",
"\n",
"系统消息说,你是一个说话像莎士比亚的助手。这是我们向助手描述**它应该如何表现的方式**。然后,第一个用户消息是*给我讲个笑话*。接下来以助手身份给出回复是,*为什么鸡会过马路?* 最后发送用户消息是*我不知道*。"
"然后,第一个用户消息:“给我讲个笑话。”\n",
"\n",
"接下来以助手身份给出回复:“为什么鸡会过马路?” \n",
"\n",
"最后发送用户消息是:“我不知道。”"
]
},
{
@ -182,7 +193,9 @@
"id": "5f76bedb",
"metadata": {},
"source": [
"让我们看另一个例子。助手的消息是*你是一个友好的聊天机器人*,第一个用户消息*嗨我叫Isa*。我们想要得到第一个用户消息。"
"让我们看另一个例子。系统消息来定义:“*你是一个友好的聊天机器人*,第一个用户消息:“*嗨我叫Isa*。”\n",
"\n",
"我们想要得到第一个用户消息的回复。"
]
},
{
@ -221,7 +234,7 @@
"id": "1e9f96ba",
"metadata": {},
"source": [
"让我们再试一个例子。系统消息是,你是一个友好的聊天机器人,第一个用户消息是,是的,你能提醒我我的名字是什么吗?"
"让我们再试一个例子。系统消息来定义:“你是一个友好的聊天机器人,第一个用户消息:“是的,你能提醒我我的名字是什么吗?"
]
},
{
@ -299,12 +312,30 @@
"id": "bBg_MpXeYnTq"
},
"source": [
"## 三、订餐机器人\n",
"\n",
"现在,我们构建一个 “订餐机器人”,我们需要它自动收集用户信息,接受比萨饼店的订单。\n",
"\n",
"### 3.1 构建机器人\n",
"\n",
"## 三、订餐机器人"
]
},
{
"cell_type": "markdown",
"id": "8f0f678c",
"metadata": {},
"source": [
"在这一新的章节中,我们将探索如何构建一个 “点餐助手机器人”。这个机器人将被设计为自动收集用户信息,并接收来自比萨饼店的订单。让我们开始这个有趣的项目,深入理解它如何帮助简化日常的订餐流程。"
]
},
{
"cell_type": "markdown",
"id": "4edeede6",
"metadata": {},
"source": [
"### 3.1 构建机器人"
]
},
{
"cell_type": "markdown",
"id": "3357a655",
"metadata": {},
"source": [
"下面这个函数将收集我们的用户消息,以便我们可以避免像刚才一样手动输入。这个函数将从我们下面构建的用户界面中收集 Prompt ,然后将其附加到一个名为上下文( ```context``` )的列表中,并在每次调用模型时使用该上下文。模型的响应也会添加到上下文中,所以用户消息和模型消息都被添加到上下文中,上下文逐渐变长。这样,模型就有了需要的信息来确定下一步要做什么。"
]
},
@ -434,7 +465,14 @@
"source": [
"此处我们另外要求模型创建一个 JSON 摘要,方便我们发送给订单系统。\n",
"\n",
"因此我们需要在上下文的基础上追加另一个系统消息,作为另一条指示 (instruction) 。我们说*创建一个刚刚订单的 JSON 摘要,列出每个项目的价格,字段应包括 1披萨包括尺寸2配料列表3饮料列表4辅菜列表包括尺寸最后是总价格*。此处也可以定义为用户消息,不一定是系统消息。\n",
"因此我们需要在上下文的基础上追加另一个系统消息,作为另一条指示 (instruction) 。我们说创建一个刚刚订单的 JSON 摘要,列出每个项目的价格,字段应包括\n",
"1. 披萨,包括尺寸\n",
"2. 配料列表\n",
"3. 饮料列表\n",
"4. 辅菜列表,包括尺寸,\n",
"5. 总价格。\n",
"\n",
"此处也可以定义为用户消息,不一定是系统消息。\n",
"\n",
"请注意,这里我们使用了一个较低的温度,因为对于这些类型的任务,我们希望输出相对可预测。"
]
@ -510,7 +548,7 @@
"id": "ef17c2b2",
"metadata": {},
"source": [
"现在,我们已经建了自己的订餐聊天机器人。请随意自定义并修改系统消息,以更改聊天机器人的行为,并使其扮演不同的角色,拥有不同的知识。"
"我们已经成功创建了自己的订餐聊天机器人。你可以根据自己的喜好和需求,自由地定制和修改机器人的系统消息,改变它的行为,让它扮演各种各样的角色,赋予它丰富多彩的知识。让我们一起探索聊天机器人的无限可能性吧!"
]
},
{

View File

@ -0,0 +1,14 @@
**恭喜您完成了本书第一单元内容的学习!**
总的来说,在第一单元中,我们学习并掌握了关于 Prompt 的两个核心原则:
- 编写清晰具体的指令;
- 如果适当的话,给模型一些思考时间。
您还学习了迭代式 Prompt 开发的方法,并了解了如何找到适合您应用程序的 Prompt 的过程是非常关键的。
我们还讨论了大型语言模型的许多功能,包括摘要、推断、转换和扩展。您也学习了如何搭建个性化的聊天机器人。在第一单元中,您的收获应该颇丰,希望通过第一单元学习能为您带来愉悦的体验。
我们期待您能灵感迸发,尝试创建自己的应用。请大胆尝试,并分享给我们您的想法。您可以从一个微型项目开始,或许它具备一定的实用性,或者仅仅是一项有趣的创新。请利用您在第一个项目中得到的经验,去创造更优秀的下一项目,以此类推。如果您已经有一个宏大的项目设想,那么,请毫不犹豫地去实现它。
最后,希望您在完成第一单元的过程中感到满足,感谢您的参与。我们热切期待着您的惊艳作品。接下来,我们将进入第二单元的学习!