本文简单介绍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为例,演示一个完整的执行过程。

演示步骤

  1. 创建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}"

  1. 创建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])
  1. 执行测试文件
(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.

参考资料

  1. https://deepeval.com/docs/metrics-introduction
  2. https://deepeval.com/tutorials/tutorial-introduction
  3. https://developer.volcengine.com/articles/7512682543431778343
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐