教程|MMAE 风格 rubric-based 评测:把 LLM 输出变成可验证的子项
人工+自动双轨
- 线上:每天抽样 1% 流量,自动评分 + 抽样人工
- 回归:每次模型/提示词变更前,全量跑 rubric 集
- CI/CD:rubric 分数低于阈值,阻塞发布
常见误区
- rubric 太粗(”回复质量好”),不可操作
- rubric 太细(100+ 项),评分开销爆炸
- rubric 不更新,跟不上产品和用户变化
- 完全依赖 LLM 打分,LLM bias 会被放大
用 LLM 自动评分
def evaluate(ai_response, rubric):
score = {}
for category, items in rubric.items():
cat_score = 0
for item in items:
prompt = f"判断以下 AI 客服回复是否满足:
{item}
回复:
{ai_response}
回答 YES/NO 并说明:"
verdict = llm_call(prompt)
cat_score += 1 if "YES" in verdict else 0
score[category] = cat_score / len(items)
return score
人工+自动双轨
- 线上:每天抽样 1% 流量,自动评分 + 抽样人工
- 回归:每次模型/提示词变更前,全量跑 rubric 集
- CI/CD:rubric 分数低于阈值,阻塞发布
常见误区
- rubric 太粗(”回复质量好”),不可操作
- rubric 太细(100+ 项),评分开销爆炸
- rubric 不更新,跟不上产品和用户变化
- 完全依赖 LLM 打分,LLM bias 会被放大
实操:写一个客服 AI 的 rubric
rubric = {
"task_understanding": [
"正确识别用户问题类别(5 类之一)",
"复述了关键实体(订单号/商品)",
"明确了用户的核心诉求",
],
"response_content": [
"提供了具体的订单状态",
"说明了预计解决时间",
"给出了下一步明确指引",
"没有答非所问",
],
"tone_and_style": [
"使用了礼貌用语",
"没有过度道歉(≤1 次)",
"没有「作为 AI」开场白",
"长度合理(< 200 字)",
],
"safety": [
"没有泄露其他用户信息",
"没有承诺无法兑现的事情",
"识别并标记了情绪激动的用户",
],
}
用 LLM 自动评分
def evaluate(ai_response, rubric):
score = {}
for category, items in rubric.items():
cat_score = 0
for item in items:
prompt = f"判断以下 AI 客服回复是否满足:
{item}
回复:
{ai_response}
回答 YES/NO 并说明:"
verdict = llm_call(prompt)
cat_score += 1 if "YES" in verdict else 0
score[category] = cat_score / len(items)
return score
人工+自动双轨
- 线上:每天抽样 1% 流量,自动评分 + 抽样人工
- 回归:每次模型/提示词变更前,全量跑 rubric 集
- CI/CD:rubric 分数低于阈值,阻塞发布
常见误区
- rubric 太粗(”回复质量好”),不可操作
- rubric 太细(100+ 项),评分开销爆炸
- rubric 不更新,跟不上产品和用户变化
- 完全依赖 LLM 打分,LLM bias 会被放大
rubric 的核心
把”完成度”分解为可验证的原子子项:
- 每个子项可二元判定(是/否)
- 每个子项可解释(为什么是这个分数)
- 每个子项可独立优化
实操:写一个客服 AI 的 rubric
rubric = {
"task_understanding": [
"正确识别用户问题类别(5 类之一)",
"复述了关键实体(订单号/商品)",
"明确了用户的核心诉求",
],
"response_content": [
"提供了具体的订单状态",
"说明了预计解决时间",
"给出了下一步明确指引",
"没有答非所问",
],
"tone_and_style": [
"使用了礼貌用语",
"没有过度道歉(≤1 次)",
"没有「作为 AI」开场白",
"长度合理(< 200 字)",
],
"safety": [
"没有泄露其他用户信息",
"没有承诺无法兑现的事情",
"识别并标记了情绪激动的用户",
],
}
用 LLM 自动评分
def evaluate(ai_response, rubric):
score = {}
for category, items in rubric.items():
cat_score = 0
for item in items:
prompt = f"判断以下 AI 客服回复是否满足:
{item}
回复:
{ai_response}
回答 YES/NO 并说明:"
verdict = llm_call(prompt)
cat_score += 1 if "YES" in verdict else 0
score[category] = cat_score / len(items)
return score
人工+自动双轨
- 线上:每天抽样 1% 流量,自动评分 + 抽样人工
- 回归:每次模型/提示词变更前,全量跑 rubric 集
- CI/CD:rubric 分数低于阈值,阻塞发布
常见误区
- rubric 太粗(”回复质量好”),不可操作
- rubric 太细(100+ 项),评分开销爆炸
- rubric 不更新,跟不上产品和用户变化
- 完全依赖 LLM 打分,LLM bias 会被放大
本周 arXiv 2606.07229 提出的 rubric-based 评测 是给 LLM 产品做质量保证的必学方法。本教程讲如何在自家项目里落地。
为什么需要 rubric?
传统 LLM 评测三大问题:
- 相似度不够:两个不同的输出 BLEU 接近,但一个对用户友好一个不是
- 不可解释:分数低不知道哪里低
- 无诊断:上线后出问题无法定位
rubric 的核心
把”完成度”分解为可验证的原子子项:
- 每个子项可二元判定(是/否)
- 每个子项可解释(为什么是这个分数)
- 每个子项可独立优化
实操:写一个客服 AI 的 rubric
rubric = {
"task_understanding": [
"正确识别用户问题类别(5 类之一)",
"复述了关键实体(订单号/商品)",
"明确了用户的核心诉求",
],
"response_content": [
"提供了具体的订单状态",
"说明了预计解决时间",
"给出了下一步明确指引",
"没有答非所问",
],
"tone_and_style": [
"使用了礼貌用语",
"没有过度道歉(≤1 次)",
"没有「作为 AI」开场白",
"长度合理(< 200 字)",
],
"safety": [
"没有泄露其他用户信息",
"没有承诺无法兑现的事情",
"识别并标记了情绪激动的用户",
],
}
用 LLM 自动评分
def evaluate(ai_response, rubric):
score = {}
for category, items in rubric.items():
cat_score = 0
for item in items:
prompt = f"判断以下 AI 客服回复是否满足:
{item}
回复:
{ai_response}
回答 YES/NO 并说明:"
verdict = llm_call(prompt)
cat_score += 1 if "YES" in verdict else 0
score[category] = cat_score / len(items)
return score
人工+自动双轨
- 线上:每天抽样 1% 流量,自动评分 + 抽样人工
- 回归:每次模型/提示词变更前,全量跑 rubric 集
- CI/CD:rubric 分数低于阈值,阻塞发布
常见误区
- rubric 太粗(”回复质量好”),不可操作
- rubric 太细(100+ 项),评分开销爆炸
- rubric 不更新,跟不上产品和用户变化
- 完全依赖 LLM 打分,LLM bias 会被放大