返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

AI应用如何测试|轻松入门LLM评测

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 18:00 |阅读模式 打印 上一主题 下一主题

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;">大多数开发者构建LLM应用时并未设置自动评测流程——即便这可能引入未被察觉的破坏性变更,因为评测本身极具挑战性。本文中,你将学习如何正确评测LLM输出。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-weight: bold;margin: 2em 8px 0.5em;color: rgb(15, 76, 129);">目录

    ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding-left: 1em;list-style: circle;color: rgb(63, 63, 63);" class="list-paddingleft-1">
  • • LLM是什么?为何评测如此困难?

  • •用Python评测LLM输出的不同方法

  • •如何使用DeepEval评测LLM

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.1em;font-weight: bold;margin-top: 2em;margin-right: 8px;margin-bottom: 0.75em;padding-left: 8px;border-left: 3px solid rgb(15, 76, 129);color: rgb(63, 63, 63);">LLM是什么?为何评测如此困难?

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">要理解LLM为何难以评测且常被称为“黑箱”,需先拆解其本质与运作原理。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">以GPT-4为例,这个大型语言模型(LLM)基于海量数据训练而成——确切地说,约3000亿单词的数据来自文章、推文、Reddit的r/tifu板块、Stack Overflow、操作指南等互联网抓取内容。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">“GPT”中的“Generative Pre-trained Transformers”指的是一种擅长预测下一个标记(token)的特定神经网络架构(对GPT-4而言,1个token≈4个字符,具体长度取决于编码策略)。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">实际上,LLM并非真正“知晓”事物,而是通过训练理解语言模式,从而擅长生成合理回应。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">关键结论:LLM通过概率预测生成“最佳”的下一个标记。这种非确定性本质导致其输出具有多样性,使得评测变得复杂——因为往往存在多个合理答案。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.1em;font-weight: bold;margin-top: 2em;margin-right: 8px;margin-bottom: 0.75em;padding-left: 8px;border-left: 3px solid rgb(15, 76, 129);color: rgb(63, 63, 63);">为何需要评测LLM应用?

LLM应用的常见场景包括:

  • 聊天机器人:客服、虚拟助手、对话代理

  • 代码助手:代码补全、纠错、调试

  • 法律文档分析:快速解析合同与法律文本

  • 个性化邮件起草:基于上下文、收件人和语气生成邮件

LLM应用通常有一个共同点——结合专有数据能显著提升任务处理能力。例如,你可能会想构建一个提升员工生产力的内部聊天机器人,OpenAI显然不会(也不应)追踪你公司的内部数据。
关键在于:确保LLM应用生成理想输出,如今不仅是OpenAI的责任(如保障GPT-4的基础性能),更是开发者的责任。你需要通过提示模板优化,数据检索流程,模型架构选择等实现。

评测的作用在于量化应用的任务处理能力。若无评测机制,迭代过程中可能引入破坏性变更,而手动检查所有输出无异于灾难。

不依赖LLM的评测方法

评测LLM输出的一种有效方法,是使用NLP领域的其他机器学习模型。尽管LLM输出具有非确定性,你仍可通过特定模型在多项指标(如事实正确性、相关性、偏见性、帮助性等,此处仅列举部分)上评估输出质量。

例如,自然语言推理模型(NLI,输出蕴含分数)可用于评估回答基于上下文的事实正确性。蕴含分数越高,输出的事实正确性越强——这对评测事实性不明确的长文本尤为实用。

你可能疑惑:这些模型如何“知道”文本是否事实正确?实际上,你可为其提供上下文(称为“基本事实”或“参考答案”)供其参考。这些上下文的集合被称为评测数据集。

但并非所有指标都需要参考。例如,相关性可通过交叉编码器模型(另一种ML模型)计算,仅需输入和输出即可判断二者的相关性。

以下是无参考指标列表

  • •相关性(Relevancy)

  • •总结质量(Summarization)

  • •偏见(Bias)

  • •毒性(Toxicity)

  • •帮助性(Helpfulness)

  • •无害性(Harmlessness)

  • •连贯性(Coherence)

以下是有参考指标列表

  • •幻觉检测(Hallucination)

  • •语义相似度(Semantic Similarity)

注意:基于参考的指标无需提供初始输入,因其仅基于提供的上下文评测输出。

使用LLM进行评测

当前新兴趋势是利用尖端LLM(如GPT-4)对自身或其他模型进行评测。

G-Eval:基于LLM的评测框架
我将附上G-Eval研究论文中的图示,但简而言之,其流程分为两部分——首先生成评测步骤,随后基于这些步骤输出最终评分。

具体操作示例
步骤一:生成评测步骤

  1. 1. 向GPT-4说明任务(例如“根据相关性对摘要进行1-5分评分”)。

  2. 2. 明确评分依据(例如“相关性需基于所有句子的综合质量”)。

步骤二:生成评分

  1. 1. 将输入、评测步骤、上下文和实际输出合并。

  2. 2. 要求模型生成1-5分(5分为最佳)。

  3. 3. (可选)提取LLM输出标记的概率值,通过加权求和归一化得分。

步骤3的实际复杂性:要获取输出标记的概率,通常需访问原始模型输出(而非仅最终生成文本)。论文引入此步骤,因其能提供更细粒度的评分,从而更精准反映输出质量。

以下是论文中的图示,助你直观理解上述内容:

结合GPT-4的G-Eval在连贯性、一致性、流畅性及相关性等指标上优于传统评测方法。但需注意,基于LLM的评测往往成本高昂。因此,建议以G-Eval为起点建立性能基准,再在适用场景下过渡至成本效益更优的评测指标。

用Python评测LLM输出

至此,你可能已被术语淹没,且绝不想从零实现所有内容。试想需研究每个指标的最佳计算方式、训练专用模型并搭建评测框架……

所幸,已有开源工具如ragasDeepEval提供现成评测框架,省去自研成本。

作为Confident(DeepEval背后的公司)联合创始人,我将厚颜展示如何用DeepEval在CI/CD流水线中对LLM应用进行单元测试(我们提供类似Pytest的开发者体验、简易配置及免费可视化平台)。

让我们通过代码实操收尾。

设置测试环境

要运行我们期待的评测流程,请按以下步骤操作:

创建项目文件夹并初始化Python虚拟环境(在终端中运行):

mkdirevals-example
cdevals-example
python3-mvenvvenv
sourcevenv/bin/activate

此时你的终端应显示如下提示:

(venv)

安装依赖项:

运行下面代码:

pipinstalldeepeval

设置OpenAI API密钥

最后,将OpenAI API密钥设为环境变量。后续G-Evals需调用OpenAI接口(本质上是使用LLM进行评测)。在终端中粘贴以下命令(替换为你自己的API密钥):

exportOPENAI_API_KEY="your-api-key-here"

编写首个测试文件

创建名为test_evals.py的文件(注意测试文件需以“test”开头):

touchtest_evals.py

粘贴以下代码

fromdeepeval.metricsimportGEval,HallucinationMetric
fromdeepeval.test_caseimportLLMTestCase,LLMTestCaseParams
fromdeepevalimportassert_test

deftest_hallucination():
hallucination_metric=HallucinationMetric(minimum_score=0.5)
test_case=LLMTestCase(
input="Whatiftheseshoesdon'tfit?",
actual_output="Weoffera30-dayfullrefundatnoextracosts.",
context=["Allcustomersareeligiblefora30dayfullrefundatnoextracosts."]
)
assert_test(test_case,[hallucination_metric])

deftest_relevancy():
answer_relevancy_metric=AnswerRelevancyMetric(minimum_score=0.5)
test_case=LLMTestCase(
input="Whatdoesyourcompanydo?",
actual_output="Ourcompanyspecializesincloudcomputing"
)
assert_test(test_case,[relevancy_metric])

deftest_humor():
funny_metric=GEval(
name="Humor",
criteria="Howfunnyitis",
evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT]
)
test_case=LLMTestCase(
input="Writemesomethingfunnyrelatedtoprogramming",
actual_output="Whydidtheprogrammerquithisjob?Becausehedidn'tgetarrays!"
)
assert_test(test_case,[funny_metric])

运行测试:

deepevaltestruntest_evals.py

每个测试用例均对应DeepEval预定义的指标,这些指标输出0-1分的评分。例如,HallucinationMetric(minimum_score=0.5)表示评测输出的事实正确性,其中minimum_score=0.5设定测试通过的阈值为得分>0.5。

逐项解析测试用例

  • •“test_hallucination”:评测LLM输出相对于上下文的事实正确性。

  • •“test_relevancy”:评测输出与输入的相关性。

  • •“test_humor”:评测LLM输出的有趣程度(使用G-Eval框架,依赖LLM自身进行评测)。

参数说明:单个测试用例最多可包含4个动态参数——

  • •输入(Input)

  • •预期输出(Expected Output)

  • •实际输出(Actual Output,来自你的应用)

  • •上下文(Context,用于生成实际输出的背景信息)

不同指标对参数的需求各异,部分为必选,部分为可选。

最后,下面是如何在一个测试用例中聚合多个指标的代码:

deftest_everything():
test_case=LLMTestCase(
input="Whatdidthecatdo?",
actual_output="Thecatclimbedupthetree",
context=["Thecatranupthetree."],
expected_output="Thecatranupthetree."
)
assert_test(test_case,[hallucination_metric,relevancy_metric,humor_metric])

也没那么难吧?编写足够数量的测试用例(10-20个),你就能显著提升对应用的控制力 。

附加功能:DeepEval支持在CI/CD流水线中对LLM应用进行单元测试。

此外,你可通过以下命令使用DeepEval免费平台:

deepevallogin

按指引操作(登录、获取API密钥、粘贴至CLI),然后重新运行测试:

deepevaltestruntest_example.py

总结

本文你已学习:

  • •LLM工作原理

  • •LLM应用实例

  • •评测LLM输出的难点

  • •使用DeepEval进行单元测试

通过评测,你可以:
✅ 避免对LLM应用引入破坏性变更
✅ 快速迭代优化关键指标
✅ 对构建的LLM应用充满信心


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ