Update 9.评估(上) Evaluation-part1.ipynb

This commit is contained in:
LiuWH
2023-07-29 21:27:30 +08:00
parent aba9746a43
commit db698d4e25

View File

@ -13,42 +13,28 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "c768620b", "id": "c9ea000a",
"metadata": {}, "metadata": {},
"source": [ "source": [
"在之前的章节,我们展示了如何使用 LLM 构建应用程序,包括评估输入处理输入以及在向用户显示输出之前进行最终输出检查。\n", "在过去的章节,我们向你展示了如何借助 LLM 构建应用程序,包括评估输入处理输入以及在呈现结果给用户之前进行最后的结果检查。然而在构建出这样的系统后我们应如何确知其运行状况呢更甚者当我们将其部署并让用户开始使用之后我们又该如何追踪其表现发现可能存在的问题并持续优化它的回答质量呢在本章里我们将向你分享一些评估LLM输出的最佳实践。\n",
"\n", "\n",
"构建这样的系统后,如何知道它的工作情况?甚至在部署后并让用户使用它时,如何跟踪它的运行情况,发现任何缺陷,并持续改进系统的答案质量?\n", "构建基于LLM的应用程序与构建传统的监督学习应用程序有所不同。因为你可以快速地构建出基于LLM的应用程序所以评估通常不从测试集开始。相反你会逐渐地建立起一个测试样例的集合。\n",
"\n", "\n",
"在本章中,我们想与您分享一些最佳实践,用于评估 LLM 的输出。\n", "在传统的监督学习环境下,你需要收集训练集、开发集,或者留出交叉验证集,在整个开发过程中都会用到它们。然而,如果你能够在几分钟内定义一个 Prompt ,并在几小时内得到反馈结果,那么停下来收集一千个测试样本就会显得极为繁琐。因为现在,你可以在没有任何训练样本的情况下得到结果。\n",
"\n", "\n",
"构建基于 LLM应用程序与传统的监督学习应用程序有所不同。由于可以快速构建基于 LLM 的应用程序,因此评估方法通常不从测试集开始。相反,通常会逐渐建立一组测试示例。\n", "因此,在使用LLM构建应用程序时,你可能会经历以下流程:首先,你会在一到三个样本的小样本中调整 Prompt ,尝试使其在这些样本上起效。随后,当你对系统进行进一步测试时,可能会遇到一些棘手的例子,这些例子无法通过 Prompt 或者算法解决。这就是使用 ChatGPT API 构建应用程序的开发者所面临的挑战。在这种情况下,你可以将这些额外的几个例子添加到你正在测试的集合中,有机地添加其他难以处理的例子。最终,你会将足够多的这些例子添加到你逐步扩大的开发集中,以至于手动运行每一个例子以测试 Prompt 变得有些不便。\n",
"\n", "\n",
"在传统的监督学习环境中,需要收集训练集、开发集或保留交叉验证集,然后在整个开发过程中使用它们。\n", "然后,你开始开发一些用于衡量这些小样本集性能的指标,例如平均准确度。这个过程的有趣之处在于,如果你觉得你的系统已经足够好了,你可以随时停止,不再进行改进。实际上,很多已经部署的应用程序就在第一步或第二步就停下来了,而且它们运行得非常好。\n",
"\n", "\n",
"然而,如果能够在几分钟内指定 Prompt并在几个小时内得到相应结果那么暂停很长时间去收集一千个测试样本将是一件极其痛苦的事情。因为现在可以在零个训练样本的情况下获得这个成果。\n", "值得注意的是,很多大型模型的应用程序没有实质性的风险,即使它没有给出完全正确的答案。但是,对于一些高风险的应用,如若存在偏见或不适当的输出可能对某人造成伤害,那么收集测试集、严格评估系统的性能,以及确保它在使用前能做对事情,就显得尤为重要。然而,如果你仅仅是用它来总结文章供自己阅读,而不是给其他人看,那么可能带来的风险就会较小,你可以在这个过程中早早地停止,而不必付出收集大规模数据集的巨大代价。"
"\n", ]
"因此,在使用 LLM 构建应用程序时,您将体会到如下的过程:\n", },
"\n", {
"首先,您会在只有一到三个样本的小样本中调整 Prompt并尝试让 Prompt 在它们身上起作用。\n", "cell_type": "markdown",
"\n", "id": "f0c89bda",
"然后当系统进行进一步的测试时您可能会遇到一些棘手的例子。Prompt 在它们身上不起作用,或者算法在它们身上不起作用。\n", "metadata": {},
"\n", "source": [
"这就是使用 ChatGPT API 构建应用程序的开发者所经历的挑战。\n", "现在让我们进入更实际的应用阶段,将刚才所学的理论知识转化为实践。让我们一起研究一些真实的数据,理解其结构并使用我们的工具来分析它们。在我们的案例中,我们获取一组分类信息及其产品名称。让我们执行以下代码,以查看这些分类信息及其产品名称"
"\n",
"在这种情况下,您可以将这些额外的几个示例添加到您正在测试的集合中,以机会主义地添加其他棘手的示例。\n",
"\n",
"最终,您已经添加了足够的这些示例到您缓慢增长的开发集中,以至于通过手动运行每个示例来测试 Prompt 变得有些不方便。\n",
"\n",
"然后,您开始开发在这些小示例集上用于衡量性能的指标,例如平均准确性。\n",
"\n",
"这个过程的一个有趣方面是,如果您觉得您的系统已经足够好了,您可以随时停在那里,不再改进它。事实上,许多已部署的应用程序停在第一或第二个步骤,并且运行得非常好。\n",
"\n",
"需要注意的是,有很多大模型的应用程序没有实质性的风险,即使它没有给出完全正确的答案。\n",
"\n",
"但是,对于部分高风险应用,如果存在偏见或不适当的输出可能对某人造成伤害,那么收集测试集、严格评估系统的性能、确保在使用之前它能够做正确的事情,就变得更加重要。\n",
"\n",
"但是,如果您只是使用它来总结文章供自己阅读,而不是给别人看,那么可能造成的危害风险更小,您可以在这个过程中早早停止,而不必去花费更大的代价去收集更大的数据集。"
] ]
}, },
{ {
@ -116,6 +102,22 @@
"## 一、找出相关产品和类别名称" "## 一、找出相关产品和类别名称"
] ]
}, },
{
"cell_type": "markdown",
"id": "59867e0e",
"metadata": {},
"source": [
"在我们进行开发时,通常需要处理和解析用户的输入。特别是在电商领域,可能会有各种各样的用户查询,例如:\"我想要最贵的电脑\"。我们需要一个能理解这种语境,并能给出相关产品和类别的工具。下面这段代码实现的功能就是这样。\n",
"\n",
"首先我们定义了一个函数`find_category_and_product_v1`,这个函数的主要目的是从用户的输入中解析出产品和类别。这个函数需要两个参数:`user_input`代表用户的查询,`products_and_category`是一个字典,其中包含了产品类型和对应产品的信息。\n",
"\n",
"在函数的开始,我们定义了一个分隔符`delimiter`,用来在客户服务查询中分隔内容。随后,我们创建了一条系统消息。这条消息主要解释了系统的运作方式:用户会提供客户服务查询,查询会被分隔符`delimiter`分隔。系统会输出一个Python列表列表中的每个对象都是Json对象。每个对象会包含'类别'和'名称'两个字段,分别对应产品的类别和名称。\n",
"\n",
"我们创建了一个名为`messages`的列表,用来存储这些示例对话以及用户的查询。最后,我们使用`get_completion_from_messages`函数处理这些消息,返回处理结果。\n",
"\n",
"通过这段代码,我们可以看到如何通过对话的方式理解和处理用户的查询,以提供更好的用户体验。"
]
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": 4,
@ -499,7 +501,9 @@
"id": "2af63218", "id": "2af63218",
"metadata": {}, "metadata": {},
"source": [ "source": [
"当您要调整的开发集不仅仅是一小部分示例时,开始自动化测试过程就变得有用了。" "当我们的应用程序逐渐成熟,测试的重要性也随之增加。通常,当我们仅处理少量样本,手动运行测试并对结果进行评估是可行的。然而,随着开发集的增大,这种方法变得既繁琐又低效。此时,就需要引入自动化测试来提高我们的工作效率。下面将开始编写代码来自动化测试流程,可以帮助您提升效率并确保测试的准确率。\n",
"\n",
"以下是一些用户问题的标准答案,用于评估 LLM 回答的准确度,与机器学习中的验证集的作用相当。"
] ]
}, },
{ {
@ -616,6 +620,14 @@
"## 八、通过与理想答案比较来评估测试用例" "## 八、通过与理想答案比较来评估测试用例"
] ]
}, },
{
"cell_type": "markdown",
"id": "b5aba12b",
"metadata": {},
"source": [
"我们通过以下函数`eval_response_with_ideal`来评估 LLM 回答的准确度"
]
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 17, "execution_count": 17,
@ -767,9 +779,18 @@
"height": 30 "height": 30
}, },
"source": [ "source": [
"## 九、在所有测试用例上运行评估,并计算正确的用例比例\n", "## 九、在所有测试用例上运行评估,并计算正确的用例比例\n"
]
},
{
"cell_type": "markdown",
"id": "4fa148ce",
"metadata": {},
"source": [
"下面我们来对测试用例中的全部问题进行验证,并计算 LLM 回答正确的准确率\n",
"\n", "\n",
"注意:如果任何 API 调用超时,将无法运行" "\n",
"> 注意:如果任何 API 调用超时,将无法运行"
] ]
}, },
{ {
@ -863,17 +884,11 @@
"id": "5d885db6", "id": "5d885db6",
"metadata": {}, "metadata": {},
"source": [ "source": [
"使用 Prompt 构建应用程序的工作流程与使用监督学习构建应用程序的工作流程非常不同。\n", "使用 Prompt 构建应用程序的工作流程与使用监督学习构建应用程序的工作流程非常不同。因此,我们认为这是需要记住的一件好事,当您正在构建监督学习模型时,会感觉到迭代速度快了很多。\n",
"\n", "\n",
"因此,我们认为这是需要记住的一件好事,当您正在构建监督学习模型时,会感觉到迭代速度快了很多。\n", "如果您并未亲身体验,可能会惊叹于仅有手动构建的极少样本,就可以产生高效的评估方法。您可能会认为,仅有 10 个样本是不具备统计意义的。但当您真正运用这种方式时,您可能会对向开发集中添加一些复杂样本所带来的效果提升感到惊讶。这对于帮助您和您的团队找到有效的 Prompt 和有效的系统非常有帮助。\n",
"\n", "\n",
"如果您并未亲身体验,可能会惊叹于仅有手动构建的极少样本,就可以产生高效的评估方法。您可能会认为,仅有 10 个样本是不具备统计意义的。但当您真正运用这种方式时,您可能会对向开发集中添加一些复杂样本所带来的效果提升感到惊讶。\n", "在本章中,输出可以被定量评估,就像有一个期望的输出一样,您可以判断它是否给出了这个期望的输出。在下一章中,我们将探讨如何在更加模糊的情况下评估我们的输出。即正确答案可能不那么明确的情况。"
"\n",
"这对于帮助您和您的团队找到有效的 Prompt 和有效的系统非常有帮助。\n",
"\n",
"在本章中,输出可以被定量评估,就像有一个期望的输出一样,您可以判断它是否给出了这个期望的输出。\n",
"\n",
"在下一章中,我们将探讨如何在更加模糊的情况下评估我们的输出。即正确答案可能不那么明确的情况。"
] ]
}, },
{ {