2024年大模型测试的主要方法和策略

1 天前   出处: Confident AI  作/译者:Jeffrey Ip / 溜的一比

大约一周前,我与一位DeepEval用户进行了一次通话,她告诉我,她认为测试和评估大型语言模型(LLMs)是两个不同的概念。当我问她对LLM测试的定义时,她这样回答:

“对我们来说,评估LLM更多的是通过基准测试选择合适的模型,而LLM测试则更多是探索在不同场景中可能出现的意外问题。”

既然我已经写了一篇关于LLM评估指标的完整文章,这篇文章我们将深入探讨如何使用这些指标进行LLM测试。我们将探讨什么是LLM测试、不同的测试方法和需要注意的边缘情况,重点介绍LLM测试的最佳实践,以及如何通过DeepEval这个开源LLM测试框架来进行LLM测试。

在我忘记之前,这里是我常用的“图表”,用来解释测试的重要性,特别是单元测试在RAG应用程序中的重要性。

准备好了吗?让我们开始吧。

什么是LLM测试?

LLM测试是评估LLM输出的过程,确保其符合所有特定的评估标准(如准确性、连贯性、公平性和安全性等),并基于其预期应用目的进行评估。一个健全的测试方法对于大规模评估和回归测试LLM系统至关重要。

单元测试由功能测试、性能测试和责任测试组成,它们共同构成对LLM的回归测试。

评估LLM是一个复杂的过程,因为与传统的软件开发不同,传统开发的结果是可预测的,错误可以通过特定的代码块进行调试,而LLM是一个黑箱,具有无限的输入和相应的输出。

然而,这并不意味着传统软件测试的概念不能应用于LLM测试——只是它们有所不同。单元测试包括功能测试、性能测试和责任测试,这些测试共同构成LLM的回归测试。

单元测试

单元测试是指测试应用程序中最小的可测试部分,对于LLM而言,这意味着根据一些明确的标准评估LLM的响应。

例如,在一个单元测试中,如果你想评估一个LLM生成的摘要质量,标准可能是该摘要是否包含足够的信息,以及是否出现与原文无关的“幻觉”。这些标准的评分通过称为LLM评估指标的工具来完成(稍后详细讨论)。

你可以选择实现自己的LLM测试框架,但在本文中,我们将使用DeepEval来创建和评估单元测试用例:

pip install deepeval

然后,创建一个测试用例:

from deepeval.test_case import LLMTestCase

original_text=”””在快速发展的数字领域,人工智能(AI)技术的普及
已经在多个行业中带来了变革,从医疗保健到金融业。
AI的整合不仅简化了操作流程,还为创新和增长开辟了新的途径。”””

summary=”””人工智能(AI)显著影响了多个行业,尤其是医疗保健和金融领域。”””

test_case = LLMTestCase(
input=original_text,
actual_output=summary
)

这里,input​是你给LLM的输入,而actual_output​是LLM生成的输出。

最后,使用DeepEval的摘要指标来评估此测试用例:

export OPENAI_API_KEY=”…”
from deepeval.metrics import SummarizationMetric

metric = SummarizationMetric(threshold=0.5)
metric.measure(test_case)
print(metric.score)
print(metric.reason)
print(metric.is_successful())

功能测试

LLM的功能测试是评估模型在特定任务上的表现。与传统软件的功能测试不同(例如,验证用户是否能够通过测试整个登录流程进行登录),LLM的功能测试是评估模型在特定任务(如文本摘要)中对多个输入的表现。换句话说,功能测试由多个针对特定用例的单元测试组成。

要将单元测试组合在一起进行功能测试,首先创建一个测试文件:

touch test_summarization.py

我们在这里使用的示例任务是文本摘要。接下来,定义一组单元测试用例:

from deepeval.test_case import LLMTestCase

假设的测试数据集,包含原始文本和摘要,

用于评估摘要任务

test_data = [
{
“original_text”: “…”,
“summary”: “…”
},
{
“original_text”: “…”,
“summary”: “…”
}
]

test_cases = []
for data in test_data:
test_case = LLMTestCase(
input=data.get(“original_text”, None),
actual_output=data.get(“input”, None)
)
test_cases.append(test_case)

最后,使用DeepEval的Pytest集成批量执行单元测试用例,并运行测试文件:

import pytest
from deepeval.metrics import SummarizationMetric
from deepeval import assert_test

@pytest.mark.parametrize(
“test_case”,
test_cases,
)
def test_summarization(test_case: LLMTestCase):
metric = SummarizationMetric()
assert_test(test_case, [metric])
deepeval test run test_summarization.py

请注意,功能测试的稳健性完全取决于单元测试的覆盖范围。因此,在为特定功能测试构建单元测试时,应尽可能覆盖更多的边缘情况。

回归测试

回归测试是指在每次迭代时评估LLM在相同的测试用例集上的表现,以防止出现破坏性变更。使用定量LLM评估指标的优势在于,我们可以设定明确的阈值来定义“破坏性变更”,并监控LLM在多次迭代中的性能变化。

多个功能测试可以组成一个回归测试。例如,我可以评估一个LLM的摘要生成和代码生成能力,并在每次迭代时测量它是否仍能执行这些任务。

性能测试

性能测试并不是测试LLM是否能执行某个任务,而是评估一些通用性能指标,如每秒处理的tokens数量(推理速度)和每个token的成本(推理成本)。性能测试的主要目的是优化成本和延迟。

请注意,性能测试也是回归测试的一部分。

责任测试

这是唯一一种不是传统软件开发概念的测试。责任测试的核心思想是,LLM输出应通过负责任的AI指标(如偏见、毒性和公平性等)进行测试,而不论任务是什么。例如,LLM在被要求总结一篇有偏见的新闻文章时,应该能够避免生成偏见的摘要。

DeepEval提供了一些现成的负责任AI指标,您可以直接使用:

touch test_responsibility.py

from deepeval.metrics import BiasMetric, ToxicityMetric
from deepeval.test_case import LLMTestCase
from deepeval import assert_test

bias_metric = BiasMetric()
toxicity_metric = ToxicityMetric()

def test_responsibility():
test_case = LLMTestCase(input=”…”, actual_output=”…”)
assert_test(test_case, [bias_metric, toxicity_metric])
deepeval test run test_responsibility.py

DeepEval:LLM评估平台

这是一个用于在云端评估和测试LLM应用程序的全能平台,完全集成了DeepEval。

  • 在云端回归测试和评估LLM应用程序。
  • 针对任何用例的LLM评估指标。
  • 实时LLM可观察性和跟踪功能。
  • 自动收集人类反馈。
  • 在云端生成评估数据集。
  • LLM安全、风险和漏洞扫描功能。

基于指标的测试

另一种考虑LLM测试的方式是基于指标标准进行测试,而不是从传统的测试角度来看。让我们来看看三种最常见的指标(不,我们不谈论精确匹配)。

正确性测试

这是最直观的测试方法。正确性测试类似于传统的监督学习中的测试集,给定整个训练数据集,我们保留一小部分数据来测试新训练的模型是否能够给出正确答案,并将目标标签作为参考。

然而,在LLM的背景下,正确性测试可能会稍微复杂一些,因为目标标签可能并非绝对的对与错。例如,以下输入:

“狗把猫追到了树上。谁爬上了树?”

正确答案当然是猫!但是如果你的LLM只输出了“猫”这个词呢?你肯定希望你的LLM测试方法能够将其标记为正确。

为此,你可以使用一种称为G-Eval的先进LLM评估指标,灵活定义LLM的正确性评估标准。

from deepeval.metrics import GEval
from deepeval.test_case import LLMTestCaseParams, LLMTestCase

correctness_metric = GEval(
name=”Correctness”,
criteria=”判断实际输出是否与预期输出一致。”,
evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.EXPECTED_OUTPUT],
strict_mode=True
)

test_case = LLMTestCase(
input=”狗把猫追到了树上。谁爬上了树?”,
actual_output=”猫”,
expected_output=”猫”
)

correctness_metric.measure(test_case)
print(correctness_metric.is_successful())

请注意,strict_mode=True​参数使指标输出一个二进制的0或1分数,非常适合正确性测试的用例。

相似性测试

与正确性类似(无意双关),相似性并不是通过传统的NLP指标能够轻松评估的。例如,BERTScore在这方面的表现有限。

同样,你可以使用G-Eval来计算语义相似度。对于较长的文本,这种方法尤其有用,因为传统的NLP指标忽视了语义内容。

from deepeval.metrics import GEval
from deepeval.test_case import LLMTestCaseParams, LLMTestCase

similarity_metric = GEval(
name=”Similarity”,
criteria=”判断实际输出与预期输出在语义上是否相似。”,
evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.EXPECTED_OUTPUT]
)

test_case = LLMTestCase(
input=”狗把猫追到了树上。谁爬上了树?”,
actual_output=”猫”,
expected_output=”猫”
)

similarity_metric.measure(test_case)
print(similarity_metric.is_successful())

幻觉测试

最后,你需要测试LLM的幻觉输出。有几种方法可以实现这一点。幻觉可以被视为无参照或基于参照的指标,前者不需要参考真相,后者则需要提供事实背景来判断输出的准确性。

你可能注意到我们提到了“正确性”。然而,幻觉输出值得单独的测试,因为幻觉输出不一定是事实错误的。例如,LLM输出的信息虽然不在其训练数据中,但可能在现实世界中是正确的,这仍然被视为幻觉。

你可以使用SelfCheckGPT(一种无参照的技术)来测试幻觉,也可以通过提供一些上下文并使用LLM-Eval来验证其是否与提供的上下文相符。

测试LLM的最佳实践

通过遵循这些测试技术,我们可以清晰地将功能、性能和责任测试分开到不同的测试文件中。

你可以这样组织你的LLM测试:

llm_tests ├── test_summarization.py ├── test_code_generation.py ├── test_performance.py ├── test_responsibility.py ...

这些测试文件由单元测试组成,最终构成你的回归测试。

稳健的LLM评估指标

这可能显而易见,但LLM评估指标非常难以做到准确,而且你通常会看到准确性和可靠性之间的权衡。

例如,传统的评分技术(如ROUGE)虽然可靠,但在评估LLM生成的文本时非常不准确,因为它们无法考虑语义(仅依赖n-gram是不够的,特别是当你输出的是JSON时)。

在DeepEval中,我们发现使用LLM进行评估(LLM-Evals)的指标表现最佳,因此我们实现了一些用于评分的技术:

  • G-Eval:一个用于基于评分标准生成评分的先进框架。
  • QAG(问题答案生成):一种首先使用LLM生成一些封闭式问题的答案,然后根据这些答案生成分数和理由的技术。点击此处了解更多关于如何使用QAG构建DeepEval的摘要指标的信息。

评估指标的稳健性非常重要,因为它们最终决定了你的测试是否通过。

以下是一些你可以考虑的指标:

  • 摘要生成
  • 幻觉检测
  • 连贯性
  • 代码正确性
  • 偏见(责任测试用)

这只是一个非常简略的概述,我强烈建议你阅读我写的关于LLM评估指标的详细文章。

在CI/CD中自动化测试

你需要一种自动化方法来测试每次更改后的LLM。在传统的软件开发中,CI/CD中的自动化测试至关重要,特别是在团队环境中,以防止未被察觉的破坏性变更。

通过DeepEval,LLM的CI/CD自动化测试也变得可能。只需在CI/CD环境中执行llm_tests​文件夹即可开始测试LLM:

deepeval test run llm_tests

如果你使用GitHub Actions来测试每个拉取请求的LLM,你可以将其包含在GitHub工作流的YAML文件中。这里有一篇关于在CI/CD中测试RAG应用程序的精彩文章,推荐阅读。

结论

在本文中,我们了解了LLM测试的内容,包括单元测试、功能测试、性能测试、责任测试和回归测试的类型及其具体内容。简而言之,单元测试构成了功能、性能和责任测试,你可以利用这些测试来对LLM进行回归测试。每个测试都需要一个评估标准、测试用例的构建,以及应用LLM评估指标来评估测试是否通过。

如果你想自己构建一个测试框架,请随意,或者你也可以使用⭐DeepEval⭐,一个开源的LLM测试框架。我们已经为你完成了所有的工作,并通过多种稳健的现成LLM评估指标和CI/CD管道中的自动化测试来强制实施最佳测试实践。

感谢阅读,我们下次再见。


声明:本文为本站编辑转载,文章版权归原作者所有。文章内容为作者个人观点,本站只提供转载参考(依行业惯例严格标明出处和作译者),目的在于传递更多专业信息,普惠测试相关从业者,开源分享,推动行业交流和进步。 如涉及作品内容、版权和其它问题,请原作者及时与本站联系(QQ:1017718740),我们将第一时间进行处理。本站拥有对此声明的最终解释权!欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,与我们的编辑和其他窝友交流。
121° /1210 人阅读/0 条评论 发表评论

登录 后发表评论