零成本本地LLM评测:用 DeepEval + Ollama 十分钟跑通离线回归
2026/9/9 14:29:15 网站建设 项目流程

零成本本地LLM评测:用 DeepEval + Ollama 十分钟跑通离线回归

【免费下载链接】deepevalThe LLM Evaluation Framework项目地址: https://gitcode.com/GitHub_Trending/de/deepeval

本文讲如何用 DeepEval 把本地LLM评测完全跑在自己的机器上:用 Ollama 或 vLLM 推理服务充当打分模型,30+ 内置指标直接接入,回归测试做成普通 pytest 用例挂进 CI。测试数据与模型输出不出机器,不产生 API 账单,评测速度与成本都由你掌控。

上周有个医疗支持团队问:能不能让患者对话数据不出内网,就完成一次 chatbot 输出的全量质检?答案是可以——在 DeepEval 的评测流程里,"打分的模型"同样可以换成你机器上的那一台。整套 DeepEval 本地部署流程,核心只是把打分模型替换成本地实例,其余代码不动。

把打分模型搬到自己机器上的理由

评测的本质,是让一个模型给另一个模型的输出打分。当"评委"是云端 API 时,每一次打分调用,都会把你的测试输入、被测模型输出、参考答案一起发出去。对普通产品迭代这无所谓,但医疗、金融这类场景,这个数据流本身就是合规风险。

成本上更直接:100 条测试用例 × 3 个指标,就是 300 次评委调用,按 token 计费。模型每周迭代一次,这笔钱就是长期固定支出。换成本地评测后,账单归零,你要操心的只剩电费和显存。

还有个实用收益:不依赖外网,结果不受限流和抖动影响,同一份数据集每次跑出来的分数可复现。

本地模型怎么接进本地LLM评测

DeepEval 把"打分模型"抽象成统一接口,接入有三条路,从零代码到十几行不等。

Ollama 直连。本机装了 Ollama 并拉好模型,三行就能用:

from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric from deepeval.models import OllamaModel judge = OllamaModel(model="llama3.1:8b", temperature=0) # 指向本机 Ollama 服务 metrics = [ AnswerRelevancyMetric(model=judge), FaithfulnessMetric(model=judge), ]

OllamaModel是 DeepEval 内置适配器,默认连http://localhost:11434,参数细节见 Ollama 集成文档。

用 OpenAI 兼容服务直连

本地跑 vLLM、llama.cpp、SGLang 这类推理服务时,它们都暴露 OpenAI 兼容接口,直接用内置的LocalModel

from deepeval.models import LocalModel judge = LocalModel( model="Qwen/Qwen2.5-7B-Instruct", base_url="http://localhost:8000/v1", # 本地推理服务地址 )

自托管模型写一个 12 行适配器

直接用 Transformers 加载的模型,继承DeepEvalBaseLLM实现生成方法即可,可参考 内置适配器的实现。以 4 位量化的 Llama-3 8B 为例:

from deepeval.models import DeepEvalBaseLLM class MyLocalJudge(DeepEvalBaseLLM): def __init__(self, model, tokenizer): self.model, self.tokenizer = model, tokenizer # 自行加载后传入 def load_model(self): return self.model def generate(self, prompt, schema=None): out = self.model.generate( **self.tokenizer(prompt, return_tensors="pt").to("cuda"), max_new_tokens=200) return self.tokenizer.decode(out[0], skip_special_tokens=True), 0.0 def get_model_name(self): return "local-judge"

三条路覆盖绝大多数开源模型,图省事就选前两条。

评测指标怎么选:先定维度,再挑模型

这些开源模型评测指标按检验维度划分,且全部支持本地计算。第一次回归,从相关性、事实性、安全三条线各挑一个就够:

维度代表指标检验什么
相关性AnswerRelevancy回答是否切题、不跑偏
事实性Faithfulness有无编造参考材料之外的事实(幻觉)
安全性Toxicity输出是否带有害、偏见内容
格式JSONCorrectness结构化输出能否被解析

评委选型是关键:1.5B 级别的小模型跑得快,但判断本身不稳定,分数容易来回漂;7B~8B 是常用区间,质量与速度平衡。若你的被测模型就是 8B,让评委能力不低于它,是比较稳妥的选择。

显存与速度卡住时怎么办

本地跑评测,瓶颈通常只有两个:显存、吞吐。

显存不足时,优先 4 位量化:8B 模型占用从约 16GB 降到 4GB 左右(约降 75%),对"打几分"这种任务的精度影响很小。加载时传入BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4")即可。

吞吐不足时,用 vLLM 这类推理引擎替代裸 Transformers 推理,速度通常能提数倍;再配合异步生成(a_generate)把测试集分批并发处理。

还有一个常见坑:部分开源模型输出 JSON 不稳定,导致指标拿不到分数。遇到分数为空的指标,先检查评委有没有按要求输出结构化判定——换一个指令遵循更好的模型,或在推理服务端加格式约束,比改评测代码更直接。

把本地LLM评测挂进 CI 回归

能本地跑,就能被 CI 调度。把评测做成普通 pytest 用例:每次提交都跑一遍黄金数据集,指标低于阈值直接让构建失败。

import pytest from deepeval import assert_test cases = load_goldens() # 从本地 JSON 读取黄金数据集 @pytest.mark.parametrize("case", cases) def test_no_regression(case): assert_test(test_case=case, metrics=metrics)
# 在 .github/workflows/llm-eval.yml 里追加 - name: 本地评测 run: pytest tests/test_llm_quality.py

这样 prompt 一改、模型版本一切,就有机器替你把关,分数漂移当天就能发现。

行动清单

  • pip install -U deepeval,本机装好 Ollama 并拉一个 7B~8B 模型
  • ✅ 用OllamaModel替换打分模型,先跑相关性 + 事实性 + 安全三个核心指标
  • ✅ 本地服务是 OpenAI 兼容接口时,改用LocalModel并指向 vLLM 的base_url
  • ✅ 写一个黄金数据集的 pytest 用例挂进 CI,给每个指标设好通过阈值
  • ✅ 显存吃紧时先上 4 位量化,再考虑换小一号的模型

【免费下载链接】deepevalThe LLM Evaluation Framework项目地址: https://gitcode.com/GitHub_Trending/de/deepeval

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询