PART 03
评测体系搭建
RAG 搭好了、模型微调了,但效果到底好不好?评测体系用量化指标回答这个问题,告别"感觉还行"的主观判断。
07 评测概念与方法
理解为什么要评测、评什么、怎么评。
为什么需要评测
| 没有评测 | 有评测 |
|---|---|
| "感觉效果还行" | "准确率 85%,比微调前提升 12%" |
| 改了参数不知道变好还是变差 | 改一行配置,跑一遍评测,立刻知道 |
| 无法跟别人讲清楚效果 | 拿着数据说话 |
RAG 评测维度
| 评测环节 | 评测什么 | 核心指标 | 好的标准 |
|---|---|---|---|
| 检索质量 | 向量检索能不能找到相关文档 | 召回率(Recall)、命中率 | > 80% |
| 生成质量 | 大模型回答准不准、全不全 | 准确率、完整性 | > 85% |
| 端到端 | 从提问到最终回答整体质量 | 忠实度(Faithfulness) | > 80% |
微调评测维度
| 评测维度 | 评测什么 | 方法 |
|---|---|---|
| 训练效果 | loss 曲线是否收敛 | 看训练日志的 loss 趋势 |
| 对比基座 | 微调后比原模型好多少 | 同题对比打分 |
| 过拟合检测 | 模型是不是死记硬背 | 训练集 vs 验证集 loss 差距 |
评测方法对比
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| LLM-as-a-Judge | 用更强的大模型评判输出质量 | 快、便宜、可批量 | 裁判模型有偏见 |
| 人工评测 | 人工标注回答好坏 | 最准确 | 慢、贵、不可重复 |
| 自动化指标 | BLEU、ROUGE 等字面匹配 | 免费、快速 | LLM 输出灵活,字面匹配不准 |
本指南使用 LLM-as-a-Judge 方法,用硅基流动 Qwen2.5-7B 作为裁判模型,对接 FastGPT 知识库搜索接口进行评测。
评测工具一览
08 Ragas 评测实操
搭建评测脚本,接入 FastGPT 知识库,用 LLM 裁判自动打分。
评测流程
用户提问
↓
FastGPT 知识库检索(searchTest 接口)→ 获取检索到的文档片段
↓
LLM 基于检索内容生成回答
↓
LLM 裁判按 4 维度打分(0-5 分)
↓
输出汇总报告 + 分类统计 + 优化建议
第 1 步:安装 Ragas
1
在虚拟环境中安装
cd D:\llm-finetune
.\venv\Scripts\Activate.ps1
pip install ragas -i https://pypi.tuna.tsinghua.edu.cn/simple
使用清华镜像加速下载,ragas 依赖较多(datasets、langchain、openai 等),首次安装约几百 MB。
第 2 步:准备评测数据集
2
生成 30 条评测问答对
基于网站备案 PDF 文档,生成包含问题、标准答案、参考文档片段的评测数据集:
[
{
"question": "网站备案审核需要多长时间?",
"ground_truth": "审核时限为30个自然日...",
"contexts": ["原始文档内容..."],
"category": "审核流程"
}
]
覆盖场景:审核流程、主体类型、变更管理、系统操作、备案号、基础概念等 10 个分类,共 30 条。
第 3 步:编写评测脚本
3
核心脚本结构
评测脚本包含 3 个核心函数:
| 函数 | 作用 | 调用接口 |
|---|---|---|
search_knowledge_base() | 调用 FastGPT 知识库搜索 | FastGPT searchTest API |
generate_answer() | 基于检索内容生成回答 | 硅基流动 LLM API |
llm_judge() | 裁判按 4 维度打分 | 硅基流动 LLM API |
裁判评分维度(0-5 分)
| 维度 | 含义 | 目标分 |
|---|---|---|
| 忠实度 (faithfulness) | 回答是否完全基于检索文档,没有编造 | 4.0 |
| 答案相关性 (answer_relevancy) | 回答是否切题,直接回答了问题 | 4.0 |
| 检索精度 (context_precision) | 检索到的文档是否与问题相关 | 3.5 |
| 召回率 (context_recall) | 标准答案的关键信息是否在检索文档中 | 4.0 |
关键配置
# FastGPT 知识库搜索接口
FASTGPT_URL = "https://cloud.fastgpt.cn/api"
DATASET_ID = "你的知识库ID"
# 裁判 LLM(硅基流动)
LLM_API_BASE = "https://api.siliconflow.cn/v1"
LLM_MODEL = "Qwen/Qwen2.5-7B-Instruct"
# 强制 JSON 输出(关键!防止裁判模型输出不稳定)
payload = {
"model": LLM_MODEL,
"messages": [...],
"temperature": 0.0,
"response_format": {"type": "json_object"} # 强制 JSON
}
第 4 步:运行评测
4
执行评测脚本
cd D:\work-mode-projects\6a87f3bdaab9df26fba9b0cf
D:\llm-finetune\venv\Scripts\Activate.ps1
python rag_eval.py
30 条评测约 3-5 分钟,每条会显示:检索到的文档数、回答摘要、4 个维度评分。
第 5 步:解读评测结果
结果输出格式
指标 平均分 最高 最低 目标 状态
忠实度 3.5 5.0 3.0 4.0 未达标
答案相关性 3.7 5.0 3.0 4.0 未达标
检索精度 3.5 5.0 3.0 3.5 达标
召回率 3.4 5.9 2.0 4.0 未达标
第 6 步:根据评测结果优化
优化建议(脚本自动输出)
- 召回率低 → 检索没找到该找的内容 → 开启混合检索(searchMode: mixed)或调整切片策略
- 检索精度低 → 检索到的内容相关性不够 → 开启重排模型或提高 similarity 阈值
- 忠实度低 → 模型回答有编造 → 优化提示词:强调只基于知识库回答
- 相关性低 → 回答不够切题 → 优化提示词:要求回答简洁直接
踩坑经验:裁判模型 JSON 输出不稳定
使用 Qwen2.5-7B 作为裁判模型时,23/30 条评分失败,原因是模型输出不规范的 JSON。
解决方案:
- 添加
"response_format": {"type": "json_object"}强制 JSON 输出 - 添加 system 提示词:"你是评测员,只输出JSON,不输出任何其他内容"
- temperature 设为 0.0(降低随机性)
- 失败后自动重试 3 次 + 多种 JSON 解析兜底
09 微调效果对比评测
用同一套测试题,对比原模型和微调模型的输出质量。
对比测试方法
LLM-as-Judge 对比评测
同一套测试题(20-50 题)
↓
┌────┴────┐
↓ ↓
原模型回答 微调模型回答
↓ ↓
└────┬────┘
↓
GPT-4o / Qwen-Max 作为裁判
对比两个回答,分别打分(1-5 分)
评分维度:准确性、完整性、简洁性
↓
输出:A_score vs B_score + 原因
训练曲线判断
| 曲线 | 健康表现 | 不健康表现 |
|---|---|---|
| 训练 loss | 持续下降,趋于平稳 | 不降或忽高忽低 |
| 验证 loss | 跟随训练 loss 下降 | 比训练 loss 高很多 |
| 训练 vs 验证差距 | 差距小 | 差距越来越大 = 过拟合 |
百炼训练参数推荐
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 学习率 (learning_rate) | 1e-4 | 数据量小,降低防过拟合 |
| 训练轮数 (n_epochs) | 3 | 小数据集 3 轮足够 |
| 最大序列长度 (max_length) | 2048 | 问答格式每条几百 token,32768 浪费显存 |
| 验证步数 (eval_steps) | 5 | 默认 50 太高,小数据集永远不会触发验证 |
| 验证集比例 | 10% | 注意百炼对验证集有最小数量要求 |
| 训练方式 | LoRA(高效训练) | 速度快 5-10 倍,成本低 |
LLaMA-Factory 本地微调参数
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 模型 | Qwen2.5-7B-Instruct | 中文效果好 |
| 微调方法 | LoRA | 高效微调 |
| 量化等级 | 4(QLoRA) | 6GB 显存必须开 4bit |
| 计算类型 | fp16 | AMD GPU 兼容性好 |
| 学习率 | 1e-4 | 标准值 |
| Epoch | 3 | 小数据集 3 轮 |
| Batch Size | 2 | 显存小用 2 |
| 梯度累积 | 8 | 补偿 batch 小 |
| LoRA Rank | 8 | 小数据小 rank |
| LoRA Alpha | 16 | 通常为 rank 的 2 倍 |
| 截断长度 | 2048 | 问答格式够用 |
| 验证集比例 | 0.1 | 10% 验证集 |
| HF 镜像 | hf-mirror.com | 国内加速下载模型 |
微调数据准备
百炼对话格式(JSONL)
{"messages": [
{"role": "system", "content": "你是网站备案客服助手..."},
{"role": "user", "content": "网站备案审核需要多长时间?"},
{"role": "assistant", "content": "审核时限为30个自然日..."}
]}
LLaMA-Factory 需要 Sharegpt 格式,需转换 messages → conversations,role → from(user→human, assistant→gpt)。
数据量建议
| 阶段 | 数据量 | 说明 |
|---|---|---|
| 入门验证 | 50~100 条 | 跑通流程,理解原理 |
| 效果可用 | 200~500 条 | 生产可用的基础 |
| 生产级别 | 1000+ 条 | 高质量、多样性强 |
核心原则:质量 > 数量,50 条高质量 > 200 条低质量。覆盖多样性(不同问法问同一个问题)、风格一致、事实准确。