大家好,我是贝克街的捉虫师呀!
最近这段时间,大家都忙着折腾大模型应用,各种 Agent、RAG 框架层出不穷。搭建流程好像越来越顺手了,但搞定功能只是第一步,接下来的问题是:我怎么知道我的大模型应用效果到底好不好?生成的文本有没有事实错误(幻觉)?RAG 检索的内容是不是真的被用上了?传统的单元测试那套,好像不太适合测试这种天马行空的文本输出。每次改点代码、换个 Prompt,都得靠人工去检查输出结果,效率低不说,还容易漏掉问题。
正当我被这些问题困扰时,偶然在 GitHub 上发现一个项目,感觉它就是为解决这些 LLM 应用的“靠谱性”问题而生的——这就是 DeepEval。
DeepEval 用作者的话来说,是一个简单易用的开源 LLM 评估框架,专门用来评估和测试大型语言模型系统。你可以把它想象成给你的 LLM 输出做单元测试的 Pytest。它不光能测试最终的输出,还能深入到应用内部的组件进行评估,比如 RAG 的检索环节、Agent 的工具调用等。它的目标很明确:帮你量化地评估你的 LLM 应用表现如何,看看换个模型、改个 Prompt 到底有没有提升,让你的 LLM 应用开发过程不再那么“玄学”。
咱们先看看这个项目的“人气”怎么样。DeepEval 目前在 GitHub 上累计收获了 7754 个 Star,而且仅仅是今天,就新增了 331 个 Star,这增长速度足以说明大家对 LLM 评估这个痛点有多关注。它主要用 Python 编写,非常符合咱们日常开发习惯。项目的维护也挺活跃的,社区讨论和更新都比较频繁,说明它不是一个“死”项目,而是持续有人投入和完善的。这种活跃度也让人用起来更放心一些。
DeepEval 之所以能解决咱们的痛点,主要是因为它提供了一系列实用的功能:
💡 丰富的内置评估指标
它不像有些工具只提供几个基础指标,DeepEval 内置了非常全面的评估项。有专门针对 RAG 应用的,比如判断回答是否基于检索结果的 Faithfulness、检索结果是否与问题相关的 Contextual Relevancy;有针对 Agent 的,比如 Task Completion;还有一些通用的,比如 Hallucination(幻觉)、Bias(偏见)、Toxicity(毒性),甚至还有对话类的指标。这些指标很多是基于前沿研究,并且可以通过你的自定义 LLM 或本地模型来运行评估,非常灵活。我个人觉得这个指标体系是它最吸引人的地方之一。
🔬 支持端到端和组件级评估
你可以把 DeepEval 当成黑盒,测试整个 LLM 应用的输入和最终输出,这叫端到端评估。更强大的是,它还能用 @observe
装饰器追踪你应用内部的各个组件,比如单独评估某个 LLM 调用、某个检索器或者某个 Agent 的表现。这样你就能知道问题是出在哪个环节,而不是只看到最终结果不好。这对于调试复杂的 LLM 应用来说简直是雪中送炭。
🔌 与 CI/CD 无缝集成
DeepEval 考虑到了软件开发的实际流程。你可以像运行普通单元测试一样,把 DeepEval 的评估任务集成到你的 CI/CD 流程里。这样,每次代码提交、模型更新或者 Prompt 调整,都能自动触发评估测试。如果某个指标没达标,流水线就失败,及时给你预警,防止意外引入 Bug 或者降低应用效果。这对保障 LLM 应用的持续质量非常关键。
🛡️ 内置强大的安全漏洞检测
大模型应用的安全问题不容忽视,比如各种 Prompt 注入、数据泄露、生成有害内容等。DeepEval 集成了红队测试能力,可以检测 40 多种安全漏洞,包括偏见、毒性、SQL 注入等。只需要几行代码,你就可以对你的应用进行安全体检,提前发现并修复这些潜在风险,这在当前的 LLM 开发环境中是很有必要的。
📊 轻松进行 LLM 基准测试
如果你想对比不同的开源或闭源 LLM 在标准任务上的表现,比如 MMLU、HellaSwag 等,DeepEval 也提供了简便的接口。用不到 10 行代码,你就能在这些流行的基准数据集上运行评估,快速获取模型的表现数据,为你的模型选型提供数据支撑。
☁️ 配套云平台提供更全面的服务
DeepEval 的背后团队 Confident AI 还提供了一个配套的云平台。通过这个平台,你可以进行数据集的云端管理、测试报告的可视化对比、评估结果的详细调试,甚至生产环境的监控和数据回流,形成一个完整的 LLM 评估和迭代闭环。虽然库本身功能已经很强大,但如果你的项目需要更精细化的管理和协作,云平台也是一个不错的选择。
DeepEval 的安装和使用都比较友好。
安装非常简单,直接用 pip 命令即可:
pip install -U deepeval
DeepEval 进行评估时,通常需要调用另一个模型来判断输出质量,比如使用 OpenAI 的模型,或者你可以配置本地模型。最常见的做法是设置 API Key 环境变量:
export OPENAI_API_KEY="..."
然后你就可以开始写测试用例了,语法设计得很像 Pytest,非常自然:
“““python
import pytest
from deepeval import assert_test
from deepeval.metrics import GEval # 引入GEval指标
from deepeval.test_case import LLMTestCase, LLMTestCaseParams # 引入测试用例和参数
这是一个标准的pytest测试函数
def test_refund_policy():
# 定义一个GEval指标,用来评估输出的正确性
# criteria 是评估的标准,可以根据你的需求自定义
correctness_metric = GEval(
name=”正确性评估”, # 指标名称
criteria=”判断 ‘actual output’ 是否基于 ‘expected output’ 正确回应了 ‘input’。”, # 评估标准描述
evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.EXPECTED_OUTPUT, LLMTestCaseParams.INPUT], # 评估需要用到的参数
threshold=0.7 # 设置一个通过测试的阈值,0-1之间
)
# 构建一个LLMTestCase对象,包含测试所需的所有信息
test_case = LLMTestCase(
input="如果我买的鞋不合脚怎么办?", # 用户输入
# 假设这是你的LLM应用给出的实际输出
actual_output="您可以在30天内免费获得全额退款。",
# 这是你期望的理想输出
expected_output="我们提供30天内免费全额退款。",
# 对于RAG应用,你还可以提供检索到的上下文
retrieval_context=["所有客户都可以在30天内免费获得全额退款。"]
)
# 使用assert_test来运行测试用例并应用指定的指标
assert_test(test_case, [correctness_metric])
“`
运行测试:
在你的终端进入项目目录,然后执行以下命令
deepeval test run your_test_file_name.py
上面的例子展示了怎么创建一个 LLMTestCase
,然后用 GEval
这个指标来判断实际输出和期望输出的匹配程度。你可以根据自己的应用类型,选择不同的内置指标,或者创建自定义指标来评估你的 LLM 输出。整个流程和写传统的单元测试非常相似,上手门槛不高。
在我看来,DeepEval 特别适合下面这些场景:
- 开发 RAG 和 Agent 应用: 这类应用结构比较复杂,传统的测试难以下手。DeepEval 丰富的指标和组件级评估能力,能帮你精准定位问题,优化流程。
- 迭代模型和 Prompt: 在不断调整模型参数、Prompt 甚至更换基座模型时,你需要一个客观的方式来对比不同版本的效果。DeepEval 提供了量化评估和基准测试的能力。
- 将 LLM 应用投入生产: 在生产环境,应用的稳定性和可靠性至关重要。将 DeepEval 集成到 CI/CD 中,并配合安全评估,能大大提升你的信心。
- 对 LLM 输出质量有较高要求: 如果你的应用对 LLM 输出的准确性、安全性和一致性要求很高(比如客服机器人、智能辅助写作等),DeepEval 是一个不可或缺的质量保障工具。
总的来说,DeepEval 提供了一个系统化、工程化的方法来解决大模型应用的评估和测试问题。它填补了传统测试工具在这方面的空白,让 LLM 应用的开发和维护变得更加可控和可靠。丰富的指标、灵活的测试方式、与现有开发流程的良好结合,都让它成为一个非常值得关注和尝试的开源项目。
如果你也在为如何让你的 LLM 应用更“靠谱”而发愁,不妨去 DeepEval 的 GitHub 仓库看看。
GitHub 项目地址:https://github.com/confident-ai/deepeval
文档地址:https://deepeval.com/docs/getting-started
去试试看吧!如果你在使用过程中有什么心得体会,或者遇到了什么问题,欢迎在评论区分享交流!