4 步把 LLM 评测搬进内网:DeepEval 本地评测实践指南
【免费下载链接】deepevalThe LLM Evaluation Framework项目地址: https://gitcode.com/GitHub_Trending/de/deepeval
你的客服语料和工单数据不能离开内网,但团队又想给每一次 LLM 输出打分。把"裁判"换成部署在本机的开源模型,评测请求就只发生在机房里——这正是 DeepEval 本地评测要解决的问题。读完本文,你可以完成一套基于 Ollama 的本地评测:从安装框架、接入本地裁判模型,到写出能进 CI 的回归用例。
项目定位:DeepEval 在 LLM 评测栈中的位置
DeepEval 是一个面向 LLM 应用的评测框架,它挂在 pytest 上:你用代码描述测试用例与指标,再用deepeval test run命令执行。框架的核心设计是裁判模型可插拔——所有 LLM 类指标都由一个模型来打分,而这个模型既可以来自 OpenAI API,也可以来自你自己的机房。
能力清单:
- 40 余个内置指标:回答相关性、忠实度(Faithfulness,检测幻觉)、毒性、JSON 正确性等;
- 裁判模型内置 Ollama、vLLM 等本地服务实现,源码见 deepeval/models/llms/;
- 阈值直接转成 pytest 的通过/失败,天然适配 CI/CD;
- 支持 tracing,可对工具调用等中间 span 做组件级评测。
方案对比:云端 API 裁判 vs 本地评测
| 维度 | 传统做法:云端 API 当裁判 | DeepEval 本地评测 |
|---|---|---|
| 测试数据流向 | 输入/输出发送到外部 API | 只在本机与内网服务间流转 |
| 裁判模型部署 | 厂商云端 | Ollama、vLLM 等本地/内网服务 |
| 成本结构 | 按 token 持续付费 | 一次性硬件投入,调用不再计费 |
| 网络依赖 | 依赖外网、配额与限流 | 离线可跑 |
| 可控性 | 受厂商模型版本与策略约束 | 模型、参数、数据均在自己手里 |
两种方案的差别不在"是否用 LLM 当裁判",两者都在用 LLM-as-Judge;差别在于裁判跑在哪里。裁判搬进机房后,成本结构从按次计费变成固定硬件投入,数据流向被限制在内网。前提也要说清楚:本地评测的分数质量取决于本地裁判模型的判别能力,裁判不够强,分数就会跟着失真。
实操路径:四步搭好本地 LLM 评测
1. 安装 DeepEval
目标:拿到一个可以执行评测的运行环境。
pip install -U deepeval预期:装完后deepeval test run会像 pytest 一样收集并执行你的评测文件,官方入门见 docs/content/docs/getting-started.mdx。
2. 把本地模型接入为裁判
目标:让本机的 Ollama 模型承担打分工作。
from deepeval.models import OllamaModel # 裁判指向本机 Ollama,默认 http://localhost:11434 judge = OllamaModel(model="llama3") print(judge.generate("请只回复:OK"))预期:终端返回本地模型的回答,说明推理链路已通。若你的服务是 vLLM 或任意 OpenAI 兼容接口,改用 deepeval/models/llms/local_model.py 里的LocalModel;若想直接用 transformers 在进程内加载模型,继承DeepEvalBaseLLM自行实现,指南在 docs/content/guides/guides-using-custom-llms.mdx。
3. 写第一个评测用例
目标:用测试用例声明"输入、实际输出、期望输出",并把指标绑定到本地裁判。
from deepeval.test_case import LLMTestCase from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric from deepeval import assert_test test_case = LLMTestCase( input="这款鞋不合身怎么办?", actual_output="我们提供 30 天无理由全额退款。", expected_output="30 天内可无理由全额退款。", retrieval_context=["退款政策:30 天内全额退款"], ) metrics = [ AnswerRelevancyMetric(threshold=0.7, model=judge), FaithfulnessMetric(threshold=0.7, model=judge), ] assert_test(test_case, metrics)预期:assert_test逐个指标打分,任一得分低于 threshold 时该测试判为失败。
4. 跑通并接入 CI
目标:让同一套评测进入提交流程。
deepeval test run tests/test_llm_eval.py预期:终端逐条打印指标得分与通过状态,退出码可供 CI 判断是否拦截合并,工作流写法见 docs/content/docs/evaluation-unit-testing-in-ci-cd.mdx。
原理与机制:本地评测为什么行得通
DeepEval 的 LLM 类指标本质都是 LLM-as-Judge:指标把测试用例字段(input、actual_output、retrieval_context 等)拼成提示词,让裁判模型产出结构化判定——例如相关性指标让模型生成"问题关键词与派生问题"再做相似度比较,忠实度指标让模型把答案拆成断言逐条核对——最后解析成 0 到 1 的分数与阈值比较。整条数据流是:
- 测试用例(你的业务数据)→ 指标模板拼装提示词;
- 提示词 → 本地裁判模型(Ollama、vLLM 或你的子类);
- 模型返回结构化判定(Pydantic schema)→ 解析为分数;
- 分数对比阈值 → pytest 结果。
扩展点集中在 deepeval/models/base_model.py 的DeepEvalBaseLLM:实现load_model()、generate(prompt, schema)、a_generate()、get_model_name()四个方法即可。其中schema参数是关键——指标需要结构化判定时会传入一个 Pydantic 模型,generate必须返回该 schema 的实例,这是任意本地模型能变成"可解析裁判"的原因。另外默认只向 PostHog 上报匿名遥测(事件名、指标名、随机 UUID),设置DEEPEVAL_TELEMETRY_OPT_OUT=1可完全关闭,说明见 docs/content/docs/data-privacy.mdx。
落地场景:CI 回归、内网部署与合规业务
CI 回归。在你自己的项目流水线中把评测挂成单测步骤,prompt、模型或检索逻辑的任何改动都会在每次 PR 上跑同一组指标。assert_test把阈值变成退出码,"分数下降"从此是红灯而不是报表里的一行小数:
jobs: evaluate: steps: - run: pip install -r requirements.txt - run: deepeval test run tests/test_llm_eval.py内网部署。无外网环境中,用OllamaModel或LocalModel指向内网服务地址,并设置DEEPEVAL_TELEMETRY_OPT_OUT=1,从加载数据集到输出评测报告的链路不产生任何出站流量。
合规业务。金融、医疗等要求数据本地化的场景里,被测模型与裁判模型都跑在自建 GPU 上,评测记录可直接留存为审计材料,无需向第三方解释客户对话的去向。
避坑指南与延伸资源
- 现象:自定义模型跑 FaithfulnessMetric 抛难懂的 AttributeError。原因:
generate()未处理schema参数,指标拿不到需要的结构化字段。处理:按自定义模型指南的 JSON Confinement 一节实现 schema 感知输出,或直接用内置OllamaModel、LocalModel。 - 现象:同一用例本地裁判与云端裁判分数差异明显。原因:本地模型判别能力上限叠加采样随机性。处理:固定 temperature(
OllamaModel默认为 0),用一批人工标注样本校准阈值,或换更强的本地模型。 - 现象:评测慢或显存溢出。原因:裁判模型偏大且用例并发高。处理:用
BitsAndBytesConfig做 4bit 量化(自定义模型指南中的 Llama-3 示例),或降级到 3B 级模型分批跑。 - 现象:担心数据离开机器。原因:默认存在匿名遥测。处理:
export DEEPEVAL_TELEMETRY_OPT_OUT=1。
延伸资源:
- 自定义裁判模型完整指南(Llama-3、Mistral、Azure 示例):docs/content/guides/guides-using-custom-llms.mdx
- Ollama 裁判实现:deepeval/models/llms/ollama_model.py
- CI/CD 集成指南:docs/content/docs/evaluation-unit-testing-in-ci-cd.mdx
- 可直接运行的最小测试样例:examples/getting_started/test_example.py
DeepEval 本地评测让数据留在内网、把按次调用变成一次性硬件投入,代价是你需要对裁判模型的质量负责。下一步:先按第 2 步让 Ollama 跑通一次generate(),再回头调阈值。
【免费下载链接】deepevalThe LLM Evaluation Framework项目地址: https://gitcode.com/GitHub_Trending/de/deepeval
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考