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 scoresLLM-as-judge:用AI评估AI
judge_prompt = """
评估以下AI输出的质量,打分1-5分:
任务要求:{task}
AI输出:{output}
评分标准:1=完全错误 3=基本正确但有瑕疵 5=完全正确
只输出数字分数。
"""常见Prompt失败模式及修复
- ❌ 输出格式不稳定 → 加Few-shot示例,或使用Function Calling
- ❌ 模型加了多余解释 → 加"只输出X,不要任何解释"
- ❌ 模型拒绝回答 → 检查System Prompt有无过度限制,或换模型
- ❌ 长文本中段跑偏 → 把关键约束放在Prompt末尾(模型更注意最近的内容)
迭代SOP:一次只改一个变量
迭代流程:
1. 跑基线(记录当前版本在测试集上的得分)
2. 找出得分最低的case,分析失败原因
3. 针对一个失败原因做一处修改
4. 重新跑测试集,对比新旧得分
5. 如果提升 → 保留修改,继续步骤2
如果下降 → 回滚,换另一个修改方向迭代Prompt和调代码一样:每次只改一个地方,才能知道是哪个改动起了作用。"改了一堆东西,然后效果好了"——这是在浪费运气,不是在工程化。