Update 5. 推断 Inferring.ipynb
This commit is contained in:
@ -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 快速建立并启动复杂的自然语言处理任务。"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user