DeepSeek 实战:拒绝"玄学"调优------基于 LLM-as-a-Judge 的自动化评估与数据合成
前言
在 AI 开发圈子里,有一种很危险的现象叫 "Vibe-based Development"(凭感觉开发)。
"我觉得这个 Prompt 更好。"
"我看那个回答挺顺眼的。"
这种主观判断在 Demo 阶段没问题,但一旦上线企业级应用,就是灾难。你无法确定你修复了一个 Bug 的同时,是否引入了三个新 Bug。
在前几篇我们搞定了 RAG 和微调,今天我们将构建一道"质量防火墙"。我们将利用 DeepEval 框架和 DeepSeek-V3,实现三个自动化:
- 自动出题: 让 AI 根据文档生成测试集。
- 自动判卷: 让 AI 判断回答的准确性(LLM-as-a-Judge)。
- 自动优化: 根据分数自动调整模型参数。
一、 最大的痛点:我去哪找测试集?
在评估 RAG 系统时,手动编写 100 个"问题+标准答案"简直是折磨。
我们可以利用 DeepSeek-V3 强大的逆向推理能力,让它阅读文档,然后自己给自己出题。
实战代码:合成数据生成器 (Synthesizer)
python
from deepeval.synthesizer import Synthesizer
from deepeval.dataset import EvaluationDataset
from langchain_community.document_loaders import PyPDFLoader
# 1. 准备你的私有文档
loader = PyPDFLoader("company_policy.pdf")
docs = loader.load()
# 2. 初始化合成器 (使用 DeepSeek 生成数据)
# 这里的 deepseek_generator 需要封装为 DeepEval 兼容的类 (参考下文 Judge 定义)
synthesizer = Synthesizer(model=deepseek_judge_model)
# 3. 自动生成 50 个"黄金测试对"
print("🤖 DeepSeek 正在阅读文档并出题...")
goldens = synthesizer.generate_goldens_from_docs(
document_paths=["company_policy.pdf"],
max_goldens_per_document=50
)
# 4. 保存为测试集
dataset = EvaluationDataset(goldens=goldens)
dataset.save_as("golden_test_set.json")
print(f"✅ 已生成 {len(goldens)} 条高难度测试题!")
二、 核心机制:配置 DeepSeek
DeepEval 默认使用 GPT-4,为了降低成本(DeepSeek 的 API 成本不到 GPT-4 的 1/50),我们需要重写 Judge 模型。
python
from deepeval.models.base_model import DeepEvalBaseLLM
from openai import OpenAI
class DeepSeekJudge(DeepEvalBaseLLM):
def __init__(self, model_name="deepseek-chat"):
self.client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.deepseek.com"
)
self.model_name = model_name
def load_model(self):
return self.client
def generate(self, prompt: str) -> str:
# 判官必须冷静 (temperature=0)
resp = self.client.chat.completions.create(
model=self.model_name,
messages=[{"role": "user", "content": prompt}],
temperature=0,
)
return resp.choices[0].message.content
async def a_generate(self, prompt: str) -> str:
return self.generate(prompt) # 生产环境建议实现真正的 async
def get_model_name(self):
return "DeepSeek-V3"
# 实例化
deepseek_judge = DeepSeekJudge()
三、 深度实战:RAG 三维体检
仅仅判断"对不对"是不够的。专业的评估需要三个维度:
- Faithfulness (忠实度): AI 即使答对了,如果依据不在文档里,也是幻觉。
- Answer Relevancy (相关性): 别扯淡,正面回答问题。
- Contextual Precision (检索精准度): 检索出的 Top-3 片段,真的包含答案吗?(这是在这个环节评估检索器的质量)。
编写 Pytest 测试脚本
python
import pytest
from deepeval import assert_test
from deepeval.test_case import LLMTestCase
from deepeval.metrics import FaithfulnessMetric, AnswerRelevancyMetric, ContextualPrecisionMetric
# 模拟你的 RAG 管道
def my_rag_pipeline(query):
# 这里调用你真实的业务代码
# return actual_output, retrieved_docs
pass
# 加载刚才生成的测试集
dataset = EvaluationDataset()
dataset.pull("golden_test_set.json")
@pytest.mark.parametrize("golden", dataset.goldens)
def test_rag_performance(golden):
query = golden.input
expected_output = golden.expected_output
# 运行你的系统
actual_output, retrieved_docs = my_rag_pipeline(query)
# 构建测试用例
test_case = LLMTestCase(
input=query,
actual_output=actual_output,
expected_output=expected_output,
retrieval_context=retrieved_docs
)
# 定义指标
faithfulness = FaithfulnessMetric(threshold=0.7, model=deepseek_judge)
relevancy = AnswerRelevancyMetric(threshold=0.7, model=deepseek_judge)
precision = ContextualPrecisionMetric(threshold=0.5, model=deepseek_judge)
# 同时断言三个指标
assert_test(test_case, [faithfulness, relevancy, precision])
四、 进阶玩法:自动化超参数寻优 (HPO)
既然我们有了分数,为什么不让程序自动帮我们找最佳参数?
假设我们在纠结:RAG 生成时,Temperature 设为 0.1 好还是 0.5 好?Top_K 设为 3 还是 5?
python
# 简单的网格搜索示例
hyperparams = [
{"temp": 0.1, "top_k": 3},
{"temp": 0.5, "top_k": 5},
{"temp": 0.8, "top_k": 5} # 激进策略
]
best_score = 0
best_config = {}
print("🧪 开始超参数自动调优...")
for config in hyperparams:
total_score = 0
# 抽取 10 个测试样本快速验证
for golden in dataset.goldens[:10]:
# 使用当前配置运行系统
output, _ = my_rag_pipeline(golden.input, config)
# 快速打分 (使用 G-Eval 自定义一个综合分)
test_case = LLMTestCase(input=golden.input, actual_output=output)
score = deepseek_judge.evaluate(test_case) # 伪代码,实际需调用 metric.measure()
total_score += score
avg_score = total_score / 10
print(f"配置 {config} -> 平均分: {avg_score}")
if avg_score > best_score:
best_score = avg_score
best_config = config
print(f"🏆 最佳配置找到: {best_config}, 分数: {best_score}")
五、 集成 CI/CD:GitHub Actions 流水线
把这套流程写入 .github/workflows/llm-eval.yml,实现"代码一提交,自动跑测试"。
yaml
name: DeepSeek LLM Eval
on: [push]
jobs:
eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install Dependencies
run: pip install deepeval pytest openai
- name: Run LLM Tests
env:
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
# 运行测试并生成报告
run: deepeval test run test_rag.py --output-file report.html
- name: Upload Report
uses: actions/upload-artifact@v3
with:
name: eval-report
path: report.html
---