大家在使用 ChatGPT 时都做错了一件事……🤫🤔
TL;DR
什么是法学硕士 (LLM)?为什么它如此难以评估?
为什么我们需要评估 LLM 申请?
如何评估法学硕士成果
使用 Python 评估 LLM 输出
结论
TL;DR
大多数开发人员在构建应用程序时不会评估其 GPT 输出,即使这意味着引入不被察觉的重大更改,因为评估非常非常困难。在本文中,您将学习如何正确评估 ChatGPT (LLM) 的输出。
🔥 议程:
- 什么是法学硕士 (LLM)?为什么它难以评估?
- 评估法学硕士成果的不同方法
- 如何在 Python 中求值
尽情享受吧!🤗

DeepEval——LLM 应用程序的开源评估框架
DeepEval 是一个框架,它通过提供默认指标来衡量幻觉、相关性等,帮助工程师评估其 LLM 应用程序的性能。
我们才刚刚起步,真心希望帮助更多开发者构建更安全的 AI 应用。您介意给它打个星,帮忙宣传一下吗?🥺❤️🥺
什么是法学硕士 (LLM)?为什么它如此难以评估?
为了理解为什么 LLM 难以评估以及为什么它们经常被称为“黑匣子”,让我们揭穿 LLM 的真面目以及它们的工作原理。
ChatGPT 是一个大型语言模型 (LLM) 的例子,它基于海量数据进行训练。确切地说,它包含了大约 3000 亿个单词,这些数据来自从互联网上抓取的文章、推文、r/tifu、stack-overflow、操作指南和其他数据。
无论如何,“Chat”背后的 GPT 代表的是生成式预训练 Transformers。Transformer 是一种特定的神经网络架构,尤其擅长预测接下来的几个 token(ChatGPT 中一个 token 等于 4 个字符,但根据具体的编码策略,一个 token 可以短至一个字符,也可以长至一个单词)。
所以,事实上,法学硕士并非真的“知道”什么,而是由于他们所受的训练方式而“理解”语言模式,这往往使他们非常擅长找到正确的表达方式。这很会操纵人心吧?

抛开所有玩笑,如果有一件事你需要记住,那就是:预测下一个可能的“最佳”标记的过程本质上是概率性的。这意味着,LLM 可以为给定的输入生成各种可能的输出,而不是总是提供相同的响应。正是 LLM 的这种不确定性使得它们难以评估,因为通常有多个合适的响应。
为什么我们需要评估 LLM 申请?
当我说 LLM 申请时,我指的是以下一些示例:
- 聊天机器人:用于客户支持、虚拟助手或一般对话代理。
- 代码协助:建议代码完成、修复代码错误或帮助调试。
- 法律文件分析:帮助法律专业人士快速理解长篇合同或法律文本的精髓。
- 个性化电子邮件起草:帮助用户根据上下文、收件人和期望语气起草电子邮件。
LLM 申请者通常有一个共同点:当使用专有数据来辅助完成任务时,它们的表现会更好。想构建一个内部聊天机器人来提升员工的工作效率吗?OpenAI 当然不会监视你公司的内部数据(希望如此😥)。
这很重要,因为现在不仅是 OpenAI 的工作要确保 ChatGPT 按预期运行⚖️,而且您还要确保您的 LLM 应用程序通过使用正确的提示模板、数据检索管道、模型架构(如果您正在进行微调)等来生成所需的输出。
评估(下文简称为 evals)可以帮助你衡量应用程序处理当前任务的性能。如果没有 evals,你将引入一些难以察觉的重大更改,并且每次迭代应用程序时都必须手动检查所有可能的 LLM 输出 👀 ,这在我看来是个糟糕的主意 💀
如何评估法学硕士成果
每个人都应该了解两种评估方式——使用和不使用 ChatGPT。
不使用 ChatGPT 的评估
不使用 ChatGPT 来评估 LLM 输出的一个好方法是使用源自 NLP 领域的其他机器学习模型。你可以使用特定的模型根据不同的指标来判断你的输出,例如事实正确性、相关性、偏见性和实用性(仅举几例,不胜枚举),即使输出结果不确定。
例如,我们可以使用自然语言推理 (NLI) 模型(它会输出一个蕴涵分数)来判断响应在特定语境下的事实正确性。蕴涵分数越高,输出的事实正确性就越高,这对于评估较长且事实正确性并非非黑即白的输出尤其有用。
你可能还想知道这些模型怎么可能“知道”一段文本是否在事实上是正确的🤔事实证明,你可以为这些模型提供上下文,让它们从表面上理解🥳事实上,我们称这些上下文为基本事实或参考。这些参考的集合通常被称为评估数据集。
但并非所有指标都需要参考。例如,相关性可以使用跨编码器模型(另一种机器学习模型)来计算,您只需提供输入和输出,即可确定它们之间的相关性。
以下是我脑海中浮现的无参考指标列表:
- 关联
- 偏见
- 毒性
- 乐于助人
- 无害
以下是参考指标列表:
- 事实正确性
- 概念相似性
请注意,基于参考的指标不需要您提供初始输入,因为它仅根据提供的上下文来判断输出。
使用 ChatGPT 进行评估
目前出现了一种新趋势,即使用最先进的(又名 ChatGPT)法学硕士来评估自己或其他人的法学硕士。
G-Eval 是一个最近开发的使用 LLM 进行评估的框架。
我将在下面附上介绍 G-eval 的研究论文中的一张图片,但简而言之,G-Eval 是一个由两部分组成的过程 - 第一部分生成评估步骤,第二部分使用生成的评估步骤输出最终分数。
让我们来看一个具体的例子。首先,生成评估步骤:
- 向 ChatGPT 引入评估任务(例如,根据相关性对此摘要进行 1 到 5 的评分)
- 引入评估标准(例如相关性将基于所有句子的集体质量)
一旦生成了评估步骤:
- 连接输入、评估步骤、上下文和实际输出
- 要求它生成 1 - 5 之间的分数,其中 5 比 1 好
- (可选)利用 LLM 输出 token 的概率对分数进行归一化,并将它们加权求和作为最终结果
步骤 3 实际上相当复杂 🙃,因为要获取输出 token 的概率,通常需要访问原始模型输出,而不仅仅是最终生成的文本。本文引入此步骤是因为它能够提供更细粒度的评分,从而更好地反映输出的质量。
下面是从论文中截取的一张图表,可以帮助您直观地了解我们所学到的知识:
使用 GPT-4 和 G-Eval 在连贯性、一致性、流畅性和相关性等方面优于传统指标😳但是,使用 LLM 进行评估通常非常昂贵。
因此,我的建议是以 G-Eval 为评估起点来建立性能标准,然后在适当的情况下过渡到更具成本效益的传统方法。
使用 Python 评估 LLM 输出
到现在为止,你可能已经觉得各种术语淹没了,肯定不想从头开始实现所有东西。想象一下,你必须研究如何最好地计算每个指标,为此训练自己的模型,并编写一个评估框架……😰
幸运的是,有一些开源软件包(例如 ragas 和 DeepEval)提供了评估框架,因此你不必自己编写😌
作为 Confident(DeepEval 背后的公司)的联合创始人,我将继续毫不掩饰地向您展示如何使用 DeepEvals 对 LLM 应用程序进行单元测试😊(但说真的,我们拥有类似 Pytest 的出色开发人员体验,易于设置,并为您提供一个免费平台来可视化您的评估结果)
让我们用一些编码来结束这一切。
设置测试环境
为了实现我们期待已久的评估,请创建一个项目文件夹并通过在终端中运行以下代码来初始化一个 python 虚拟环境:
mkdir evals-example
cd evals-example
python3 -m venv venv
source venv/bin/activate
你的终端现在应该启动如下内容:
(venv)
安装依赖项
运行以下代码:
pip install deepeval
设置 OpenAI API 密钥
最后,将您的 OpenAI API 密钥设置为环境变量。稍后我们将需要 OpenAI 来进行 G-Evals(这基本上意味着使用 LLM 进行评估)。在您的终端中,将此代码与您自己的 API 密钥一起粘贴(如果您还没有,请在此处获取):
export OPENAI_API_KEY="your-api-key-here"
编写第一个测试文件
让我们创建一个名为的文件test_evals.py
(请注意,测试文件必须以“test”开头):
touch test_evals.py
粘贴以下代码:
from deepeval.metrics.factual_consistency import FactualConsistencyMetric
from deepeval.metrics.answer_relevancy import AnswerRelevancyMetric
from deepeval.metrics.conceptual_similarity import ConceptualSimilarityMetric
from deepeval.metrics.llm_eval import LLMEvalMetric
from deepeval.test_case import LLMTestCase
from deepeval.run_test import assert_test
import openai
def test_factual_correctness():
input = "What if these shoes don't fit?"
context = "All customers are eligible for a 30 day full refund at no extra costs."
output = "We offer a 30-day full refund at no extra costs."
factual_consistency_metric = FactualConsistencyMetric(minimum_score=0.5)
test_case = LLMTestCase(query=input, output=output, context=context)
assert_test(test_case, [factual_consistency_metric])
def test_relevancy():
input = "What does your company do?"
output = "Our company specializes in cloud computing"
relevancy_metric = AnswerRelevancyMetric(minimum_score=0.5)
test_case = LLMTestCase(query=input, output=output)
assert_test(test_case, [relevancy_metric])
def test_conceptual_similarity():
input = "What did the cat do?"
output = "The cat climbed up the tree"
expected_output = "The cat ran up the tree."
conceptual_similarity_metric = ConceptualSimilarityMetric(minimum_score=0.5)
test_case = LLMTestCase(query=input, output=output, expected_output=expected_output)
assert_test(test_case, [conceptual_similarity_metric])
def test_humor():
def make_chat_completion_request(prompt):
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt},
],
)
return response.choices[0].message.content
input = "Write me something funny related to programming"
output = "Why did the programmer quit his job? Because he didn't get arrays!"
llm_metric = LLMEvalMetric(
criteria="How funny it is",
completion_function=make_chat_completion_request
)
test_case = LLMTestCase(query=input, output=output)
assert_test(test_case, [llm_metric])
现在运行测试文件:
deepeval test run test_evals.py
对于每个测试用例,DeepEval 都提供了一个预定义的指标,每个指标都会输出一个从 0 到 1 的分数。例如,FactualConsistencyMetric(minimum_score=0.5)
意味着我们要评估输出的事实正确性,其中minimum_score=0.5
意味着只有当输出分数高于 0.5 的阈值时,测试才会通过。
让我们逐一回顾一下测试用例:
test_factual_correctness
测试您的 LLM 输出相对于所提供的上下文的事实正确性。test_relevancy
测试输出与给定输入的相关性。test_conceptual_similarity
测试 LLM 输出与预期输出在概念上的相似程度。test_humor
测试你的 LLM 输出有多有趣。此测试用例是唯一使用 ChatGPT 进行评估的测试用例。
请注意,单个测试用例最多有 4 个动态参数:输入、预期输出、实际输出(应用程序的)以及上下文(用于生成实际输出)。根据测试指标,某些参数是可选的,而某些参数是必需的。
最后,如果您想对同一输入测试多个指标怎么办?以下是如何在单个测试用例上聚合指标的方法:
def test_everything():
input = "What did the cat do?"
output = "The cat climbed up the tree"
expected_output = "The cat ran up the tree."
context = "The cat ran up the tree."
conceptual_similarity_metric = ConceptualSimilarityMetric(minimum_score=0.5)
relevancy_metric = AnswerRelevancyMetric(minimum_score=0.5)
factual_consistency_metric = FactualConsistencyMetric(minimum_score=0.5)
test_case = LLMTestCase(query=input, output=output, context=context, expected_output=expected_output)
assert_test(test_case, [conceptual_similarity_metric, relevancy_metric, factual_consistency_metric])
毕竟不是那么难,对吧?写足够多的代码(10-20 个),你就能更好地控制你正在构建的内容了🤗
附言:DeepEval 还提供了一项额外功能:免费的网络平台,可供您查看所有测试运行的数据。
尝试运行以下命令:
deepeval login
按照说明(登录,获取 API 密钥,将其粘贴到 CLI 中),然后再次运行:
deepeval test run test_example.py
让我知道发生了什么!
结论
在本文中,您了解到:
- ChatGPT 的工作原理
- LLM申请示例
- 为什么评估法学硕士的成果如此困难
- 如何用 Python 评估 LLM 的输出结果
有了 evals,你可以停止对你的 LLM 应用程序进行重大更改✅快速迭代你的实现以改进你关心的指标✅最重要的是对你构建的 LLM 应用程序充满信心😇
如果你喜欢这篇文章,别忘了在 GitHub 上点个星!本教程的源代码可以在这里找到:
https://github.com/confident-ai/blog-examples/tree/main/evals-example
感谢您的阅读,下次再见🫡
