主题
LLM 评估(Evaluation)
如何评估 LLM 应用的效果?这是 LLM 应用从原型到生产的关键一步。
为什么需要评估
原型阶段:手动测试,感觉"还行"
生产阶段:用户投诉,效果不稳定
需要:系统化的评估方法评估的层次
Level 1:人工评估(最可靠,但慢)
Level 2:用 LLM 评估 LLM(快,可作为初筛)
Level 3:自动化评估指标(最快,适合回归测试)Level 1:人工评估
创建评估集(Eval Set)
收集 50-100 个典型问题,包含:
- 常见问题(80%)
- 边界案例(10%)
- 恶意输入(10%)
每个问题有人工标注的"标准答案"评分标准
| 维度 | 说明 | 分数 |
|---|---|---|
| 正确性 | 答案是否正确 | 1-5 |
| 完整性 | 是否回答完整 | 1-5 |
| 格式 | 输出格式是否符合要求 | 1-5 |
| 幻觉 | 是否有编造内容 | 0/1(有/无) |
Level 2:用 LLM 评估 LLM
让一个强大的 LLM(如 GPT-4)来评估另一个 LLM 的输出:
python
def evaluate_with_llm(question, answer, reference_answer=None):
"""用 LLM 评估回答质量"""
prompt = f"""
请评估以下回答的质量,给出 1-5 分的评分,并给出理由。
问题:{question}
回答:{answer}
"""
if reference_answer:
prompt += f"\n标准答案:{reference_answer}"
prompt += """
\n评分标准:
1 分:回答错误或不相关
2 分:部分正确,但有明显错误
3 分:基本正确,但不完整
4 分:正确且完整
5 分:正确、完整、表达清晰
输出格式(JSON):
{
"score": 4,
"reason": "回答正确,涵盖了主要点,但缺少具体示例",
"has_hallucination": false
}
"""
result = llm(prompt)
return json.loads(result)
# 批量评估
scores = []
for item in eval_set:
score = evaluate_with_llm(item["question"], item["answer"])
scores.append(score["score"])
print(f"平均分数:{sum(scores) / len(scores)}")LangChain - QAEvalChain
python
from langchain.evaluation.qa import QAEvalChain
eval_chain = QAEvalChain.from_llm(llm)
# 评估集
eval_set = [
{"query": "RAG 的全称是什么?", "result": "检索增强生成"},
{"query": "RAG 的主要优势是什么?", "result": "..."}
]
# 标准答案
reference = [
{"query": "RAG 的全称是什么?", "answer": "Retrieval-Augmented Generation(检索增强生成)"},
...
]
# 评估
graded_outputs = eval_chain.evaluate(eval_set, reference)Level 3:自动化指标
RAG 评估指标
python
# 1. 检索准确率(Retrieval Precision)
# 检索到的文档中,有多少是相关的?
retrieved = retrieve(query, k=5)
relevant = [doc for doc in retrieved if is_relevant(doc, query)]
precision = len(relevant) / len(retrieved)
# 2. 回答准确性(Answer Correctness)
# 用 LLM 或人工评估
# 3. 幻觉率(Hallucination Rate)
# 回答中有多少内容无法从检索到的文档中验证?代码生成评估
python
# 1. 代码是否能运行?
exec_result = run_code(generated_code)
# 2. 单元测试是否通过?
test_result = run_tests(generated_code)
# 3. 代码是否正确?
# 用 LLM 或人工评估RAGAS 框架(RAG 评估专用)
RAGAS 是专门用于评估 RAG 应用的开源框架:
python
from ragas import evaluate
from ragas.metrics import (
faithfulness, # 忠实度(是否基于检索内容)
answer_relevancy, # 回答相关性
context_precision, # 检索精度
context_recall # 检索召回率
)
# 评估数据
eval_data = {
"question": ["什么是 RAG?"],
"answer": ["RAG 是检索增强生成..."],
"contexts": [["RAG 全称 Retrieval-Augmented Generation..."]],
"ground_truth": ["RAG(Retrieval-Augmented Generation)..."]
}
# 评估
results = evaluate(
eval_data,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall]
)
print(results)持续评估(CI/CD 集成)
把评估集成到 CI/CD 流程:
yaml
# .github/workflows/eval.yml
name: LLM Evaluation
on: [push]
jobs:
eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run Evaluation
run: |
python scripts/evaluate.py
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
- name: Check Score
run: |
SCORE=$(cat eval_result.json | jq '.average_score')
if [ $(echo "$SCORE < 4.0" | bc) -eq 1 ]; then
echo "评分低于 4.0,请检查"
exit 1
fi评估最佳实践
- 建立评估集:从第一天就开始收集
- 多次评估:每次大改动都跑评估
- 关注边界案例:正常问题容易通过,边界案例才暴露问题
- 记录评估结果:追踪效果变化趋势
- A/B 测试:新版本 vs 旧版本,用数据说话