Prompt评估的难点

Prompt评估比代码测试难,原因有三:主观性("好"的标准因人而异)、随机性(同一Prompt每次输出不同)、无客观基准(不像代码有明确的通过/失败标准)。但这不意味着无法系统地改进Prompt。

建立评估数据集

先构建一个"黄金数据集",包含20-50组已知正确答案的测试用例:

test_cases = [
    {
        "input": "张三,28岁,上海销售经理",
        "expected": {"name": "张三", "age": 28, "city": "上海", "title": "销售经理"}
    },
    {
        "input": "李四在北京做软件开发",
        "expected": {"name": "李四", "city": "北京", "title": "软件开发"}
    },
    # 边界case
    {"input": "这个人没有明确职位", "expected": {"name": None, "title": None}},
]

A/B测试Prompt的正确姿势

import random

def evaluate_prompt(prompt_a, prompt_b, test_cases):
    scores = {"a": 0, "b": 0}
    for case in test_cases:
        # 两个版本都跑一遍
        result_a = call_llm(prompt_a, case["input"])
        result_b = call_llm(prompt_b, case["input"])
        # 评分(简单版:字段匹配率)
        score_a = field_match_rate(result_a, case["expected"])
        score_b = field_match_rate(result_b, case["expected"])
        scores["a"] += score_a
        scores["b"] += score_b
    return scores

LLM-as-judge:用AI评估AI

judge_prompt = """
评估以下AI输出的质量,打分1-5分:
任务要求:{task}
AI输出:{output}
评分标准:1=完全错误 3=基本正确但有瑕疵 5=完全正确
只输出数字分数。
"""

常见Prompt失败模式及修复

迭代SOP:一次只改一个变量

迭代流程:
1. 跑基线(记录当前版本在测试集上的得分)
2. 找出得分最低的case,分析失败原因
3. 针对一个失败原因做一处修改
4. 重新跑测试集,对比新旧得分
5. 如果提升 → 保留修改,继续步骤2
   如果下降 → 回滚,换另一个修改方向
迭代Prompt和调代码一样:每次只改一个地方,才能知道是哪个改动起了作用。"改了一堆东西,然后效果好了"——这是在浪费运气,不是在工程化。