3、自动化评估方法:基于规则的评估、基于模型的评估、基于数据集的评估

聊到 Prompt 评估,很多人第一反应就是「找几个人打分」。没错,人工评估确实准,但成本高、速度慢。我在实际项目中遇到过,一个迭代周期要测上百条 Prompt,全靠人工打分的话,团队基本不用干别的了。

所以,自动化评估就成了刚需。说白了,就是用程序代替人眼,快速给出一个分数。今天我把三种主流方法掰开揉碎讲清楚:基于规则的、基于模型的、基于数据集的。每种方法我都踩过坑,咱们一个一个说。

3.1 基于规则的评估

这是最朴素、也最直接的方法。你定好规则,让程序去检查输出是否符合要求。规则可以是关键词匹配、正则表达式、长度限制、格式校验等等。

适用场景:输出格式固定、内容可预期的任务。比如信息抽取、JSON 生成、分类标签输出。

常见规则类型

  • 关键词命中率:检查输出是否包含指定的关键词或短语
  • 格式校验:是否符合 JSON、XML、Markdown 等格式
  • 长度约束:输出是否在指定字数或 token 范围内
  • 正则匹配:检查邮箱、电话号码、日期等特定模式
  • 禁止词检测:输出中是否出现敏感词或违规内容

举个例子:我做过一个客服意图分类的 Prompt,要求输出必须是「意图:xxx, 置信度:0.xx」这种格式。规则评估就很简单——检查输出是否匹配这个模板,不匹配直接打 0 分。

代码示例

def rule_based_evaluation(output, expected_format="json"):
    score = 0.0
    details = []
    
    # 规则1:检查是否为合法 JSON
    if expected_format == "json":
        try:
            json.loads(output)
            score += 0.5
            details.append("JSON格式正确")
        except:
            details.append("JSON格式错误")
    
    # 规则2:检查是否包含必要字段
    required_fields = ["意图", "置信度"]
    for field in required_fields:
        if field in output:
            score += 0.25
            details.append(f"包含字段: {field}")
        else:
            details.append(f"缺少字段: {field}")
    
    return score, details

我的经验:规则评估虽然简单,但别小看它。我曾在生产环境里用 5 条规则就挡住了 90% 的异常输出。关键是规则要「稳」,别太严也别太松。

注意:规则评估的局限性很明显——它只能检查「表面」的东西。比如输出格式完全正确,但内容可能是一本正经的胡说八道。规则评估对此无能为力。

3.2 基于模型的评估

这个方法就高级一些了。我们让另一个模型(比如 GPT-4)来当裁判,给 Prompt 的输出打分。你想想看,让一个更强大的模型去评判一个较弱模型的输出,是不是挺合理的?

为什么用模型做评判者?

  • 能理解语义,不像规则那样死板
  • 可以评估「相关性」、「流畅度」、「逻辑性」等抽象指标
  • 适应性强,换任务只需要改评估 Prompt

具体做法:写一个「评估 Prompt」,把待评估的输出和参考答案(如果有)一起喂给评判模型,让它给出分数和理由。

评估 Prompt 模板示例

你是一个专业的 Prompt 评估专家。
请根据以下标准,对模型的输出进行评分(1-5分):

1. 相关性:输出是否准确回答了用户的问题
2. 完整性:是否覆盖了所有必要信息
3. 清晰度:表达是否简洁易懂

用户问题:{user_query}
模型输出:{model_output}

请输出 JSON 格式的评分结果:
{
  "相关性": 分数,
  "完整性": 分数,
  "清晰度": 分数,
  "总分": 平均分,
  "理由": "简要说明"
}

避坑指南:我曾经用 GPT-4 当评判者,结果发现它对自己生成的答案有偏好。后来我改用 Claude 来评 GPT-4 的输出,或者用多个模型投票,效果好了很多。

优缺点对比

维度 优点 缺点
准确性 能理解语义,评估更全面 评判模型本身也有偏差
成本 比人工便宜,比规则贵 调用大模型需要 API 费用
速度 比人工快,比规则慢 每次评估需要几秒到十几秒
可解释性 能给出评分理由 理由可能不靠谱

我的建议:如果你预算充足,用 GPT-4 或 Claude 3.5 当评判者效果最好。如果预算有限,可以用开源模型如 Qwen 或 Llama 来评估,虽然准确率低一些,但胜在免费。

3.3 基于数据集的评估

这个方法最「硬核」。你准备一个标注好的测试数据集,里面包含输入和期望输出。然后让 Prompt 跑一遍,把实际输出和期望输出做对比,算出一个准确率或 F1 分数。

为什么需要数据集?

  • 有「标准答案」做参照,评估结果客观
  • 可以量化比较不同 Prompt 的优劣
  • 适合做回归测试——改完 Prompt 后跑一遍,看效果是变好还是变差

数据集构建要点

  1. 覆盖全面:包含正常情况、边界情况、异常情况
  2. 标注准确:期望输出要经过人工审核
  3. 规模适中:一般 100-500 条就够了,太多标注成本高,太少统计意义不大

评估指标示例

任务类型 常用指标 说明
分类任务 准确率、精确率、召回率、F1 看预测标签和真实标签是否一致
生成任务 ROUGE、BLEU、METEOR 看生成文本和参考文本的相似度
问答任务 EM(精确匹配)、F1 看答案是否完全或部分匹配
翻译任务 BLEU、COMET 看翻译质量和参考译文的接近程度

举个例子:我做过一个电商评论情感分类的 Prompt。测试集有 200 条评论,每条标注了「正面/负面/中性」。跑完 Prompt 后,算准确率。第一次只有 72%,我调整了 Prompt 中的示例和指令,第二次跑到了 85%。这就是数据集的威力——让你看到实实在在的进步。

代码示例

def dataset_evaluation(prompt_func, test_data):
    """
    test_data: [{"input": "...", "expected": "..."}, ...]
    """
    correct = 0
    total = len(test_data)
    
    for item in test_data:
        actual_output = prompt_func(item["input"])
        if actual_output.strip() == item["expected"].strip():
            correct += 1
    
    accuracy = correct / total
    return accuracy

注意:数据集评估有个大坑——过拟合。如果你只在一个数据集上调 Prompt,可能会让 Prompt 对这个数据集表现很好,但换一批数据就拉胯。我建议准备两个数据集:一个开发集(用来调 Prompt),一个测试集(用来最终验证),两个集不重叠。

3.4 三种方法怎么选?

说实话,没有银弹。我一般这样选:

  • 快速验证阶段:用规则评估,几分钟就能跑完
  • 迭代优化阶段:用数据集评估,量化每次改动的影响
  • 上线前最终评估:用模型评估 + 人工抽检,确保质量

三种方法也可以组合使用。比如先用规则过滤掉格式错误的输出,再用模型评估语义质量,最后用数据集算一个综合分数。嗯,这样虽然麻烦点,但结果最靠谱。

最后说一句:自动化评估不是万能的。它只能帮你快速筛掉明显不好的 Prompt,但真正的好 Prompt,往往需要人工去感受和判断。自动化是工具,不是目的。