零成本本地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),仅供参考