diff --git a/content/Building Systems with the ChatGPT API/7.Evaluation.ipynb b/content/Building Systems with the ChatGPT API/7.Evaluation.ipynb index 9e85637..50afa5b 100644 --- a/content/Building Systems with the ChatGPT API/7.Evaluation.ipynb +++ b/content/Building Systems with the ChatGPT API/7.Evaluation.ipynb @@ -8,6 +8,26 @@ "# 第七章 搭建一个带评估的端到端问答系统" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在本节课中,我们将搭建一个带评估的端到端问答系统,综合了之前多节课的内容,加入了评估过程。\n", + "\n", + "首先,我们将检查输入,看看它是否能够通过审核 API 的审核。\n", + "\n", + "其次,如果没有,我们将提取产品列表。\n", + "\n", + "第三,如果找到了产品,我们将尝试查找它们。\n", + "\n", + "第四,我们将使用模型回答用户问题。\n", + "\n", + "最后,我们将通过审核API对答案进行审核。\n", + "\n", + "如果没有被标记,我们将把答案返回给用户。" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -63,7 +83,7 @@ "# 使用中文 Prompt 的工具包\n", "import utils_ch\n", "\n", - "import panel as pn # GUI\n", + "import panel as pn # 用于图形化界面\n", "pn.extension()\n", "\n", "from dotenv import load_dotenv, find_dotenv\n", @@ -488,6 +508,18 @@ "\n", "dashboard" ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "通过监控系统在更多输入上的质量,您可以修改步骤,提高系统的整体性能。\n", + "\n", + "也许我们会发现,对于某些步骤,我们的提示可能更好,也许有些步骤甚至不必要,也许我们会找到更好的检索方法等等。\n", + "\n", + "我们将在下一个视频中进一步讨论这个问题。 " + ] } ], "metadata": { diff --git a/content/Building Systems with the ChatGPT API/8.Evaluation-part1.ipynb b/content/Building Systems with the ChatGPT API/8.Evaluation-part1.ipynb index b58f777..c11b09a 100644 --- a/content/Building Systems with the ChatGPT API/8.Evaluation-part1.ipynb +++ b/content/Building Systems with the ChatGPT API/8.Evaluation-part1.ipynb @@ -11,6 +11,68 @@ "# 第八章 评估(上)——存在一个简单的正确答案时" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "58449d96", + "metadata": {}, + "source": [ + "在之前的几个视频中,我们展示了如何使用llm构建应用程序,包括从评估输入到处理输入再到在向用户显示输出之前进行最终输出检查。\n", + "\n", + "构建这样的系统后,如何知道它的工作情况?甚至在部署并让用户使用它时,如何跟踪它的运行情况并发现任何缺陷并继续改进系统的答案质量?\n", + "\n", + "在这个视频中,我想与您分享一些最佳实践,用于评估llm的输出。\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "85791cef", + "metadata": {}, + "source": [ + "构建基于LLM的应用程序与传统监督学习应用程序之间的区别在于,因为您可以快速构建这样的应用程序,评估它的方法,通常不会从测试集开始。相反,您经常会逐渐建立一组测试示例。" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "2bf010ed", + "metadata": {}, + "source": [ + "在传统的监督学习环境中,收集一个训练集、开发集或保留交叉验证集,然后在整个开发过程中使用它们。\n", + "\n", + "但是如果你能够在几分钟内指定一个提示,并在几个小时内得到一些工作成果,那么如果你不得不暂停很长时间收集一千个测试样本,那将会是一个巨大的痛苦,因为现在你可以在零个训练样本的情况下得到这个工作成果。\n", + "\n", + "因此,在使用LLM构建应用程序时,你将体会到如下的过程。\n", + "\n", + "首先,你会在只有一到三到五个样本的小样本中调整提示,并尝试让提示在它们身上起作用。\n", + "\n", + "然后,当系统进行额外的测试时,你偶尔会遇到一些棘手的例子。提示在它们身上不起作用,或者算法在它们身上不起作用。\n", + "\n", + "这就是使用chatgpt api的开发者如何构建应用程序的过程。\n", + " \n", + "在这种情况下,您可以将这些额外的一个或两个或三个或五个示例添加到您正在测试的集合中,以机会主义地添加其他棘手的示例。\n", + "\n", + "最终,您已经添加了足够的这些示例到您缓慢增长的开发集中,它变得有点不方便通过提示手动运行每个示例。\n", + "\n", + "然后,您开始开发在这些小示例集上用于衡量性能的指标,例如平均准确性。\n", + "\n", + "这个过程的一个有趣方面是如果您随时决定您的系统已经足够好了,你可以停在那里不用改进它。事实上,有许多部署应用程序停在第一或第二个步骤,并且运行得非常好。\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3fac7abc", + "metadata": {}, + "source": [ + "一个重要的警告是,有很多大模型的应用程序没有实质性的风险,即使它没有给出完全正确的答案。\n", + "\n", + "但是,对于部分高风险应用,如果存在偏见或不适当的输出的风险可能对某人造成伤害,那么收集测试集的责任、严格评估系统的性能、确保在使用之前它能够做正确的事情,这变得更加重要。\n", + "\n", + "但是,如果你正在使用它来总结文章只是为了自己阅读而不是别人,那么可能造成的危害风险更小,你可以在这个过程中早早停止,而不必去花费收集更大数据集的代价。" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -325,6 +387,15 @@ "print(products_by_category_3)" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "b8e7d25e", + "metadata": {}, + "source": [ + "它看起来像是输出了正确的数据,但它也输出了一堆文本,这些是多余的。这使得将其解析为Python字典列表更加困难。" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -381,6 +452,15 @@ "五、修改指令以处理难测试用例" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3c2ac3ae", + "metadata": {}, + "source": [ + "我们在提示中添加了以下内容,不要输出任何不在JSON格式中的附加文本,并添加了第二个示例,使用用户和助手消息进行few-shot提示。" + ] + }, { "cell_type": "code", "execution_count": 11, @@ -536,6 +616,15 @@ "八、收集开发集进行自动化测试" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "20817d3b", + "metadata": {}, + "source": [ + "当你要调整的开发集不仅仅是一小部分示例时,开始自动化测试过程就变得有用了。" + ] + }, { "cell_type": "code", "execution_count": 14, @@ -870,6 +959,24 @@ "fraction_correct = score_accum / n_examples\n", "print(f\"正确比例为 {n_examples}: {fraction_correct}\")" ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "ba1218f0", + "metadata": {}, + "source": [ + "使用提示构建应用程序的工作流程与使用监督学习构建应用程序的工作流程非常不同。\n", + "\n", + "因此,我认为这是需要记住的一件好事,当你正在构建监督学习时,迭代的速度感觉要快得多。\n", + "\n", + "如果你还没有这样做过,你可能会惊讶于一个评估方法仅建立在一些手工策划的棘手例子上的表现如何。你可能认为只有10个例子是不具有统计学意义的。但当你实际使用这个过程时,你可能会惊讶于添加一些棘手的例子到开发集中的有效性。\n", + "\n", + "这对于帮助你和你的团队找到有效的提示和有效的系统非常有帮助。\n", + "\n", + "在这个视频中,输出可以定量评估,就像有一个期望的输出一样,你可以判断它是否给出了这个期望的输出。因此,在下一个视频中,让我们看看如何在这种更加模糊的情况下评估我们的输出。在那种情况下,什么是正确答案是有点模糊的。\n", + "\n" + ] } ], "metadata": { diff --git a/content/Building Systems with the ChatGPT API/9.Evaluation-part2.ipynb b/content/Building Systems with the ChatGPT API/9.Evaluation-part2.ipynb index 5443bc2..1848b58 100644 --- a/content/Building Systems with the ChatGPT API/9.Evaluation-part2.ipynb +++ b/content/Building Systems with the ChatGPT API/9.Evaluation-part2.ipynb @@ -8,6 +8,16 @@ "# 第九章 评估(下)——当不存在一个简单的正确答案时" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在上一个视频中,您了解了如何在一个例子中评估llm输出,其中它有正确的答案,因此可以编写一个函数,明确告诉我们llm输出是否正确分类和列出产品。\n", + "\n", + "但是,如果llm用于生成文本,而不仅仅是一个正确的文本呢?让我们看一下如何评估这种类型的llm输出的方法。" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -57,7 +67,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "运行问答系统获得回答" + "运行问答系统获得一个复杂回答" ] }, { @@ -156,6 +166,14 @@ "使用 GPT 评估回答是否正确" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我希望您能从中学到一个设计模式,即当您可以指定一个评估LLM输出的标准列表时,您实际上可以使用另一个API调用来评估您的第一个LLM输出。" + ] + }, { "cell_type": "code", "execution_count": 8, @@ -347,6 +365,17 @@ "给出一个标准回答,要求其评估生成回答与标准回答的差距" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在经典的自然语言处理技术中,有一些传统的度量标准用于衡量LLM输出是否类似于这个专家人类编写的输出。例如,有一种称为BLUE分数的东西,它们可以衡量一段文本与另一段文本的相似程度。\n", + "\n", + "事实证明,有一种更好的方法,就是您可以使用Prompt,我将在此指定提示,要求LLM比较自动生成的客户服务代理输出与上面由人类编写的理想专家响应的匹配程度。\n", + "\n" + ] + }, { "cell_type": "code", "execution_count": 13, @@ -454,6 +483,18 @@ " return response" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这个评分标准来自于OpenAI开源评估框架,这是一个非常棒的框架,其中包含了许多评估方法,既有OpenAI开发人员的贡献,也有更广泛的开源社区的贡献。\n", + "\n", + "在这个评分标准中,我们告诉LLM比较提交的答案的事实内容和专家答案,忽略风格、语法、标点符号的差异,但关键是我们要求它进行比较,并输出从A到E的分数,具体取决于提交的答案是否是专家答案的子集、超集或完全一致,这可能意味着它虚构或编造了一些额外的事实。\n", + "\n", + "LLM将选择其中最合适的描述。\n" + ] + }, { "cell_type": "code", "execution_count": 15, @@ -661,6 +702,20 @@ "source": [ "eval_vs_ideal(test_set_ideal, assistant_answer_2)" ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "希望你从这个视频中学到两个设计模式。\n", + "\n", + "第一个是即使没有专家提供的理想答案,如果你能写一个评分标准,你可以使用一个LLM来评估另一个LLM的输出。\n", + "\n", + "第二,如果您可以提供一个专家提供的理想答案,那么可以帮助您的LLM更好地比较特定助手输出是否类似于专家提供的理想答案。\n", + "\n", + "希望这可以帮助您评估LLM系统的输出,以便在开发期间持续监测系统的性能,并使用这些工具不断评估和改进系统的性能。" + ] } ], "metadata": {