DeepEval:大模型/智能体评测框架
DeepEval是一款基于Python的开源LLM评测框架,采用LLM-as-a-judge模式评估测试对象。本文介绍了如何安装DeepEval(v3.7.7)并通过自定义模型接入阿里的通义千问(Qwen)模型。演示了创建自定义Qwen评估模型和编写测试用例的完整流程,包括正确性评估指标(GEval)的使用。
本文简单介绍DeepEval是什么,如何安装,以及如何通过自定义模型指定通义千问(Qwen)评估模型,并提供了一个完整的运行示例。
简单介绍
DeepEval是Python语言开发的一款功能强大的做LLM评测的开源框架,采用LLM-as-a-judge模式对测试对象进行评测。
它默认使用OpenAI的模型作为评估模型,国内使用不便的情况下,可以通过自定义模型接入国产的模型(比如:通义千问系列的模型)。
名词解释
评估模型,即评判者模型,负责在执行中评估测试用例,比如评估正确性、评估相似性等待。
评测对象,即被测试的对象,可以是基模,也可以是工作流(Workflow)、聊天机器人(Chatbot)等等。
使用说明
安装DeepEval
# 创建工作目录
D:\development\opensource> mkdir deepeval & cd deepeval
# 创建虚拟环境
D:\development\opensource\deepeval> conda create -n eval & conda activate eval
# 安装deepeval
(eval) D:\development\opensource\deepeval> pip install deepeval
# 查看版本
(eval) D:\development\opensource\deepeval> deepeval -V
3.7.7
自定义模型
DeepEval默认使用OpenAI作为评估模型,国内用户使用会稍有不便。值得庆幸的是,DeepEval支持通过自定义模型,国内的可以通过自定义模型来使用国产模型服务商提供的模型,比如本例中使用的是阿里云百炼平台的通义千问系列模型,毕竟人家针对新用户有1百万的免费Token配额,足够练手。
下面就演示一下如何通过自定义模型接入阿里云百炼平台的qwen-plus模型,并以single-turn LLMTestCase为例,演示一个完整的执行过程。

演示步骤
- 创建
qwen.py模型文件
通过实现DeepEvalBaseLLM来定义自己的评估模型,DeepEvalBaseLLM是DeepEval框架提供的一个LLM基础类。
import openai
from deepeval.models.base_model import DeepEvalBaseLLM
class Qwen(DeepEvalBaseLLM):
"""
用于DeepEval评估的阿里云百炼平台的通义千问模型自定义类。
继承自DeepEvalBaseLLM,需实现六个核心方法。
"""
def __init__(self, model_name: str, api_key: str):
# 初始化模型名称和API密钥
self.model_name = model_name
self.api_key = api_key
# 配置OpenAI客户端,使其指向阿里云百炼平台的兼容端点
self.client = openai.OpenAI(
api_key=self.api_key,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
def load_model(self):
"""
此方法需返回模型对象。
对于API调用,通常返回客户端实例本身。
"""
return self.client
def generate(self, prompt: str) -> str:
"""
同步生成方法。核心使调用模型API并提取纯文本响应。
"""
chat_model = self.load_model()
try:
response = chat_model.chat.completions.create(
model=self.model_name,
messages=[{"role": "user", "content": prompt}]
)
# 提取模型返回的文本内容
return response.choices[0].message.content
except Exception as e:
print(f"调用模型时发生错误:{e}")
return ""
async def a_generate(self, prompt: str) -> str:
"""
异步生成方法。
由于此处使用同步HTTP请求,我们简单调用同步方法。
如果你使用支持异步的HTTP客户端,可以在此实现真正的异步调用以提升性能。
"""
return self.generate(prompt)
def get_model_name(self) -> str:
"""
返回模型的标识名称。
"""
return f"阿里云百炼平台 - 通义千问系列模型 - {self.model_name}"
- 创建
test_app.py测试文件
from deepeval import evaluate
from deepeval import test_case
from deepeval.test_case import LLMTestCase, LLMTestCaseParams
from deepeval.metrics import GEval
from custom_qwen import Qwen
qwen_model = Qwen(
model_name="qwen-plus",
api_key="sk-******"
)
correctness_metrics = GEval(
name="正确性",
criteria="根据预期输出确定实际输出是否正确。",
evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.EXPECTED_OUTPUT],
threshold=0.5,
model=qwen_model
)
test_case = LLMTestCase(
input="我持续咳嗽和发烧,需要担心吗?",
# 请将此替换为你的LLM应用实际生成的输出
actual_output="持续咳嗽和发烧可能预示着多种疾病,从轻微感染到更严重的状况,如肺炎或新冠肺炎。如果症状恶化、持续数天不退,或者出现呼吸困难、胸痛或其他令人担忧的迹象,建议就医。",
# 你期望LLM应用生成的理想或参考答案
expected_output="持续咳嗽和发烧可能表明一系列疾病,从轻微的病毒感染到更严重的状况,如肺炎或新冠肺炎。如果你的症状恶化、持续超过几天,或伴有呼吸困难、胸痛或其他令人担忧的迹象,你应该寻求医疗帮助。"
)
evaluate([test_case], [correctness_metrics])
- 执行测试文件
(eval) D:\development\opensource\deepeval>deepeval test run test_app.py
✨ You're running DeepEval's latest 正确性 [GEval] Metric! (using Aliyun DashScope - qwen-plus, strict=False, async_mode=True)...
======================================================================
Metrics Summary
- ✅ 正确性 [GEval] (score: 0.9, threshold: 0.5, strict: False, evaluation model: Aliyun DashScope - qwen-plus, reason: 实际输出与预期输出在语义上高
度相似,均传达了持续咳嗽和发烧可能指向多种疾病、包括肺炎或新冠肺炎,并建议在症状恶化或持续及出现严重症状时寻求医疗帮助。然而,措辞存在细微差异,如‘预
示着’与‘表明’、‘建议就医’与‘你应该寻求医疗帮助’,语气和句式略有不同但未改变核心含义。格式和结构基本一致,均为陈述性句子,无多余或缺失信息。整体内容、
结构和语义均保持一致,仅用词略有变化,不影响理解。, error: None)
For test case:
- input: 我持续咳嗽和发烧,需要担心吗?
- actual output: 持续咳嗽和发烧可能预示着多种疾病,从轻微感染到更严重的状况,如肺炎或新冠肺炎。如果症状恶化、持续数天不退,或者出现呼吸困难、胸痛或
其他令人担忧的迹象,建议就医。
- expected output: 持续咳嗽和发烧可能表明一系列疾病,从轻微的病毒感染到更严重的状况,如肺炎或新冠肺炎。如果你的症状恶化、持续超过几天,或伴有呼吸困
难、胸痛或其他令人担忧的迹象,你应该寻求医疗帮助。
- context: None
- retrieval context: None
======================================================================
Overall Metric Pass Rates
正确性 [GEval]: 100.00% pass rate
======================================================================
Running teardown with pytest sessionfinish...
4 warnings in 9.43s
Test Results
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓┃ Test case ┃ Metric ┃ Score ┃ Status ┃ Overall Success Rate ┃┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━┩│ test_case_0 │ │ │ │ 100.0% ││ │ 正确性 [GEval] │ 0.9 (threshold=0.5, evaluation model=Aliyun │ PASSED │ ││ │ │ DashScope - qwen-plus, │ │ ││ │ │ reason=实际输出与预期输出在语义上高度相似,均 … │ │ ││ │ │ error=None) │ │ ││ Note: Use Confident AI with DeepEval to │ │ │ │ ││ analyze failed test cases for more details │ │ │ │ │└────────────────────────────────────────────────┴────────────────┴─────────────────────────────────────────────────┴────────┴──────────────────────┘
⚠ WARNING: No hyperparameters logged.
» Log hyperparameters to attribute prompts and models to your test runs.
================================================================================
✓ Evaluation completed 🎉! (time taken: 9.93s | token cost: None)
» Test Results (1 total tests):
» Pass Rate: 100.0% | Passed: 1 | Failed: 0
================================================================================
» Want to share evals with your team, or a place for your test cases to live? ❤️ 🏡
» Run 'deepeval view' to analyze and save testing results on Confident AI.
参考资料
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)