Skip to content

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

评估最佳实践

  1. 建立评估集:从第一天就开始收集
  2. 多次评估:每次大改动都跑评估
  3. 关注边界案例:正常问题容易通过,边界案例才暴露问题
  4. 记录评估结果:追踪效果变化趋势
  5. A/B 测试:新版本 vs 旧版本,用数据说话

相关资源