LightRAG/docs/WhatIsRAGAS-zh.md
Claude 9b4831d84e
Add comprehensive RAGAS evaluation framework guide
This guide provides a complete introduction to RAGAS (Retrieval-Augmented Generation Assessment):

**Core Concepts:**
- What is RAGAS and why it's needed for RAG system evaluation
- Automated, quantifiable, and trackable quality assessment

**Four Key Metrics Explained:**
1. Context Precision (0.7-1.0): How relevant are retrieved documents?
2. Context Recall (0.7-1.0): Are all key facts retrieved?
3. Faithfulness (0.7-1.0): Is the answer grounded in context (no hallucination)?
4. Answer Relevancy (0.7-1.0): Does the answer address the question?

**How It Works:**
- Uses evaluation LLM to judge answer quality
- Workflow: test dataset → run RAG → RAGAS scores → optimization insights
- Integrated with LightRAG's existing evaluation module

**Practical Usage:**
- Quick start guide for LightRAG users
- Real output examples with interpretation
- Cost analysis (~$1-2 per 100 questions with GPT-4o-mini)
- Optimization strategies based on low-scoring metrics

**Limitations & Best Practices:**
- Depends on evaluation LLM quality
- Requires high-quality ground truth answers
- Recommended hybrid approach: RAGAS (scale) + human review (depth)
- Decision matrix for when to use RAGAS vs alternatives

**Use Cases:**
 Comparing different configurations/models
 A/B testing new features
 Continuous performance monitoring
 Single component evaluation (use Precision/Recall instead)

Helps users understand and effectively use RAGAS for RAG system quality assurance.
2025-11-19 12:52:22 +00:00

24 KiB
Raw Blame History

RAGAS 评估框架详解

什么是 RAGAS

RAGASRetrieval-Augmented Generation Assessment是一个专门用于评估 RAG 系统质量的开源框架。

核心概念

传统软件测试:
  输入 → 程序 → 输出
  ✅ 确定性:相同输入 → 相同输出
  ✅ 容易测试:断言输出 == 期望值

RAG 系统测试:
  问题 → [检索 + LLM生成] → 答案
  ❌ 非确定性:相同问题 → 不同答案
  ❌ 难以测试:答案正确性难以量化

RAGAS 的作用:
  将"答案质量"量化为 0-1 分数
  可以自动化、可比较、可追踪

为什么需要 RAGAS

问题场景:你改进了 RAG 系统(如:换了 embedding 模型、调整了 chunk 大小、优化了提示词),如何知道是变好了还是变差了?

传统方法

  • 👎 人工阅读:耗时、主观、不可扩展
  • 👎 用户反馈:滞后、不全面

RAGAS 方法

  • 自动评估:几分钟评估 100+ 问题
  • 客观量化0.85 vs 0.78(明确好坏)
  • 可追踪:每次改动都可对比

RAGAS 的四大核心指标

RAGAS 从四个维度评估 RAG 系统:

                    RAG 系统
                       │
        ┌──────────────┼──────────────┐
        ▼              ▼              ▼
    【检索阶段】    【生成阶段】   【整体质量】
        │              │              │
    ┌───┴───┐      ┌───┴───┐      ┌───┴───┐
    │Context│      │Context│      │Answer │
    │Recall │      │Precis.│      │Relev. │
    └───────┘      └───────┘      └───────┘
                                       │
                               ┌───────┴────────┐
                               │  Faithfulness  │
                               └────────────────┘

1. Context Precision上下文准确性

测量:检索的上下文中,有多少是真正相关的?

问题:检索了 10 个文档,但只有 3 个真正相关,其他 7 个是噪音

计算逻辑

# 伪代码
相关文档排名靠前  高分
无关文档混在其中  低分

# 例子
检索结果[相关, 相关, 无关, 相关, 无关, ...]
Context Precision  0.75  # 前面的相关文档多

实际评估方式 RAGAS 使用 LLM 判断每个检索片段是否与问题相关:

LLM Prompt:
---
Question: "What is the capital of France?"
Retrieved Context 1: "Paris is the capital and largest city of France..."
Retrieved Context 2: "The Eiffel Tower was built in 1889..."

Is Context 1 relevant to answering the question? → Yes
Is Context 2 relevant to answering the question? → No

分数解读

  • 0.9-1.0:检索非常精准,几乎没有噪音
  • 0.7-0.9:大部分相关,少量噪音
  • 0.5-0.7:相关和无关混杂
  • < 0.5:检索质量差,需要优化

优化方向

  • 提升 embedding 模型质量
  • 调整 top_k 参数(减少检索数量)
  • 改进 reranking 策略

2. Context Recall上下文召回

测量:黄金标准答案中的信息,有多少出现在检索的上下文中?

问题:检索遗漏了关键信息,导致答案不完整

计算逻辑

# 黄金标准答案包含 5 个事实
ground_truth = [
    "巴黎是法国首都",
    "位于塞纳河畔",
    "人口约 220 万",
    "是欧洲最大城市之一",
    "有埃菲尔铁塔等著名地标"
]

# 检索的上下文包含其中 4 个
retrieved_contexts_contain = [
    "巴黎是法国首都",  # ✓
    "位于塞纳河畔",    # ✓
    "人口约 220 万",   # ✓
    # 缺少"欧洲最大城市"
    "有埃菲尔铁塔"     # ✓
]

Context Recall = 4 / 5 = 0.80

实际评估方式 RAGAS 将黄金答案拆分为多个"句子/陈述",然后用 LLM 判断每个陈述是否能从检索的上下文中推导出来:

LLM Prompt:
---
Statement from ground truth: "Paris is the capital of France"
Retrieved Contexts: [context1, context2, ...]

Can this statement be inferred from the contexts? → Yes/No

分数解读

  • 0.9-1.0:检索到所有关键信息
  • 0.7-0.9:漏掉少量次要信息
  • 0.5-0.7:漏掉一些关键信息
  • < 0.5:检索不足,严重遗漏

优化方向

  • 增加 top_k检索更多文档
  • 改进 chunking 策略(避免关键信息被切分)
  • 优化查询改写query rewriting

3. Faithfulness忠实度

测量:生成的答案是否基于检索到的上下文?还是 LLM 在"幻觉"

问题LLM 生成了听起来合理但实际错误的信息

计算逻辑

# 将答案拆分为多个陈述
answer = "巴黎是法国首都,位于塞纳河畔,人口约 500 万。"

statements = [
    "巴黎是法国首都",      # ✓ 上下文支持
    "位于塞纳河畔",        # ✓ 上下文支持
    "人口约 500 万"        # ✗ 上下文说是 220 万(幻觉!)
]

Faithfulness = 2 / 3 = 0.67  # 有幻觉,分数低

实际评估方式

LLM Prompt:
---
Context: "Paris is the capital of France, located on the Seine River,
          with a population of about 2.2 million."

Answer Statement: "Paris has a population of about 5 million."

Can this statement be verified from the context? → No (Hallucination)

分数解读

  • 0.9-1.0:答案完全基于事实,无幻觉
  • 0.7-0.9:少量不可验证的陈述
  • 0.5-0.7:有明显幻觉
  • < 0.5:严重幻觉,不可信

优化方向

  • 调整 LLM prompt强调"仅基于上下文回答"
  • 使用更可靠的 LLM 模型
  • 减少生成的 temperature降低随机性

4. Answer Relevancy答案相关性

测量:答案是否真正回答了用户的问题?

问题:答案虽然基于事实,但答非所问

计算逻辑

Question: "What is the capital of France?"

Answer A: "Paris is the capital of France."
 Answer Relevancy = 1.0  # 完美回答

Answer B: "France is a country in Europe. It has many beautiful cities
           including Paris, Lyon, Marseille..."
 Answer Relevancy = 0.65  # 包含答案但啰嗦

Answer C: "France has a population of 67 million people."
 Answer Relevancy = 0.2   # 完全跑题

实际评估方式 RAGAS 使用"反向问题生成"

Step 1: 根据答案生成问题
Answer: "Paris is the capital of France"
Generated Question: "What is the capital of France?"

Step 2: 计算原问题和生成问题的相似度
Original Question: "What is the capital of France?"
Generated Question: "What is the capital of France?"
Similarity: 1.0 → High Relevancy

如果答案答非所问:
Answer: "France has 67 million people"
Generated Question: "What is the population of France?"
Similarity to Original: 0.3 → Low Relevancy

分数解读

  • 0.9-1.0:直接回答问题,无冗余
  • 0.7-0.9:回答了问题但有冗余信息
  • 0.5-0.7:部分回答或答非所问
  • < 0.5:完全不相关

优化方向

  • 改进 prompt要求简洁直接的答案
  • 调整生成长度限制
  • 使用更好的指令跟随模型

RAGAS 如何工作?

工作流程

┌─────────────────────────────────────────────────────────────┐
│ 1. 准备测试数据集                                            │
│    - 问题列表                                                │
│    - 黄金标准答案ground truth                            │
└────────────────┬────────────────────────────────────────────┘
                 ▼
┌─────────────────────────────────────────────────────────────┐
│ 2. 运行 RAG 系统                                             │
│    Question → RAG System → {answer, contexts}               │
└────────────────┬────────────────────────────────────────────┘
                 ▼
┌─────────────────────────────────────────────────────────────┐
│ 3. RAGAS 自动评估                                            │
│    使用评估 LLM如 GPT-4o-mini分析                      │
│    - 答案是否忠实于上下文?                                  │
│    - 答案是否相关?                                          │
│    - 检索是否完整?                                          │
│    - 检索是否精准?                                          │
└────────────────┬────────────────────────────────────────────┘
                 ▼
┌─────────────────────────────────────────────────────────────┐
│ 4. 输出分数报告                                              │
│    Faithfulness:      0.87                                  │
│    Answer Relevancy:  0.91                                  │
│    Context Recall:    0.82                                  │
│    Context Precision: 0.75                                  │
│    Overall RAGAS:     0.84                                  │
└─────────────────────────────────────────────────────────────┘

数据格式

RAGAS 需要的输入数据:

from datasets import Dataset

# 测试数据集格式
test_dataset = Dataset.from_dict({
    "question": [
        "What is the capital of France?",
        "Who founded Apple Inc.?",
    ],
    "answer": [
        "Paris is the capital of France.",  # RAG 系统生成的答案
        "Steve Jobs and Steve Wozniak founded Apple Inc.",
    ],
    "contexts": [
        [  # 检索到的上下文(列表)
            "Paris is the capital and largest city of France...",
            "The city is located on the Seine River...",
        ],
        [
            "Apple Inc. was founded by Steve Jobs, Steve Wozniak...",
        ],
    ],
    "ground_truth": [
        "Paris",  # 黄金标准答案
        "Steve Jobs and Steve Wozniak",
    ],
})

评估 LLM 的作用

关键点RAGAS 使用另一个 LLM(评估 LLM来评估你的 RAG 系统。

你的 RAG 系统:
  使用 LLM A如 Qwen-7B生成答案
        ↓
RAGAS 评估:
  使用 LLM B如 GPT-4o-mini评估答案质量

为什么这样设计?

  • LLM 擅长理解语义和推理
  • 可以判断"答案是否基于上下文"、"是否相关"等复杂问题
  • 比简单的字符串匹配更智能

成本

  • 评估一个问题通常需要 4-8 次 LLM 调用(每个指标 1-2 次)
  • 推荐使用便宜的模型如 GPT-4o-mini$0.15/1M tokens
  • 评估 100 个问题的成本约 $0.50-1.00

LightRAG 中的 RAGAS 使用

内置评估工具

LightRAG 已经集成了 RAGASlightrag/evaluation/eval_rag_quality.py

快速开始

步骤 1: 安装依赖

pip install ragas datasets langchain-openai

步骤 2: 准备测试数据集

# 创建测试数据集
cat > lightrag/evaluation/my_test.json << 'EOF'
{
  "test_cases": [
    {
      "question": "LightRAG 支持哪些向量数据库?",
      "ground_truth": "LightRAG 支持多种向量数据库,包括 Milvus、Qdrant、ChromaDB、Neo4j 等。",
      "project": "lightrag_docs"
    },
    {
      "question": "如何提高 LightRAG 的索引速度?",
      "ground_truth": "可以通过增加 max_async 参数、使用更快的 LLM、禁用 gleaning 等方式提高索引速度。",
      "project": "lightrag_docs"
    }
  ]
}
EOF

步骤 3: 配置评估 LLM

# 创建 .env 文件
cat > .env << 'EOF'
# 评估使用的 LLM推荐使用便宜的模型
EVAL_LLM_MODEL=gpt-4o-mini
EVAL_LLM_BINDING_API_KEY=sk-your-api-key-here

# 评估使用的 Embedding 模型
EVAL_EMBEDDING_MODEL=text-embedding-3-small

# 如果使用自定义端点(如 vLLM、Ollama
# EVAL_LLM_BINDING_HOST=http://localhost:8000/v1

# 并发数(同时评估多少个问题)
EVAL_MAX_CONCURRENT=2
EOF

步骤 4: 运行 LightRAG 服务器

# 启动 LightRAG确保已经索引了相关文档
python -m lightrag.api.lightrag_server

步骤 5: 运行评估

# 评估默认数据集
python lightrag/evaluation/eval_rag_quality.py

# 评估自定义数据集
python lightrag/evaluation/eval_rag_quality.py \
    --dataset lightrag/evaluation/my_test.json \
    --ragendpoint http://localhost:9621

输出示例

======================================================================
🔍 RAGAS Evaluation - Using Real LightRAG API
======================================================================
Evaluation Models:
  • LLM Model:            gpt-4o-mini
  • Embedding Model:      text-embedding-3-small
  • LLM Endpoint:         OpenAI Official API

Test Configuration:
  • Total Test Cases:     2
  • Test Dataset:         my_test.json
  • LightRAG API:         http://localhost:9621
  • Results Directory:    results

======================================================================
🚀 Starting RAGAS Evaluation of LightRAG System
🔧 RAGAS Evaluation (Stage 2): 2 concurrent
======================================================================

Eval-01: 100%|████████████████████████| 4/4 [00:12<00:00]
Eval-02: 100%|████████████████████████| 4/4 [00:11<00:00]

======================================================================
📊 EVALUATION RESULTS SUMMARY
======================================================================
#    | Question                                           | Faith  | AnswRel | CtxRec | CtxPrec | RAGAS  | Status
--------------------------------------------------------------------------------------------------------------------------
1    | LightRAG 支持哪些向量数据库?                       | 0.9200 | 0.9500  | 0.8800 | 0.8200  | 0.8925 | ✓
2    | 如何提高 LightRAG 的索引速度?                      | 0.8800 | 0.9100  | 0.8500 | 0.7800  | 0.8550 | ✓
======================================================================

======================================================================
📊 EVALUATION COMPLETE
======================================================================
Total Tests:    2
Successful:     2
Failed:         0
Success Rate:   100.00%
Elapsed Time:   25.43 seconds
Avg Time/Test:  12.72 seconds

======================================================================
📈 BENCHMARK RESULTS (Average)
======================================================================
Average Faithfulness:      0.9000
Average Answer Relevance:  0.9300
Average Context Recall:    0.8650
Average Context Precision: 0.8000
Average RAGAS Score:       0.8738
----------------------------------------------------------------------
Min RAGAS Score:           0.8550
Max RAGAS Score:           0.8925

======================================================================
📁 GENERATED FILES
======================================================================
Results Dir:    /path/to/lightrag/evaluation/results
   • CSV:  results_20250119_143022.csv
   • JSON: results_20250119_143022.json
======================================================================

结果解读

问题 1 分析

Question: "LightRAG 支持哪些向量数据库?"

Faithfulness:      0.92  ✅ 答案基本基于事实
Answer Relevancy:  0.95  ✅ 直接回答了问题
Context Recall:    0.88  👍 检索到大部分相关信息
Context Precision: 0.82  👍 检索较精准但有少量噪音

RAGAS Score: 0.8925  ✅ 整体质量优秀

这意味着什么?

  • RAG 系统正确回答了问题
  • 答案基于检索到的文档,没有幻觉
  • ⚠️ Context Precision 0.82 表示检索了一些不太相关的内容
  • 💡 优化建议:可以调整 top_k 或使用 reranking

问题 2 分析

Question: "如何提高 LightRAG 的索引速度?"

Faithfulness:      0.88  👍 答案较为忠实
Answer Relevancy:  0.91  ✅ 回答了问题
Context Recall:    0.85  👍 检索到大部分信息
Context Precision: 0.78  ⚠️ 检索有较多噪音

RAGAS Score: 0.8550  👍 质量良好

这意味着什么?

  • 基本回答正确
  • ⚠️ Faithfulness 0.88 表示可能有轻微幻觉或不可验证的陈述
  • ⚠️ Context Precision 0.78 表示检索了不少无关内容
  • 💡 优化建议:
    • 改进 chunking确保相关信息在同一 chunk
    • 调整 embedding 模型
    • 添加元数据过滤

RAGAS 的限制和注意事项

1. 依赖评估 LLM 的质量

问题:如果评估 LLM 本身有偏见或错误怎么办?

# 示例:评估 LLM 可能犯错
Question: "某专业领域的深度问题"
Answer: "(正确但技术性强的答案)"

评估 LLMGPT-4o-mini可能
- 误判为不相关因为不理解专业术语
- 误判为幻觉因为超出其知识范围

解决方案

  • 使用更强的评估模型(如 GPT-4o 而非 GPT-4o-mini
  • 在特定领域使用领域专家人工抽查
  • 对关键指标进行人工校准

2. Ground Truth 的质量

RAGAS 严重依赖黄金标准答案的质量

# 糟糕的 Ground Truth
{
    "question": "What is LightRAG?",
    "ground_truth": "It's good"  # 太简单,无法评估 Recall
}

# 好的 Ground Truth
{
    "question": "What is LightRAG?",
    "ground_truth": "LightRAG is a retrieval-augmented generation framework
                     that combines knowledge graphs with vector search to
                     improve answer quality and relevance."
}

建议

  • Ground Truth 应该详细、准确
  • 包含所有关键信息点
  • 由领域专家撰写或审核

3. 成本考虑

每个问题的评估成本

单个问题评估:
- Faithfulness:      2-3 次 LLM 调用
- Answer Relevancy:  1-2 次 LLM 调用
- Context Recall:    2-4 次 LLM 调用
- Context Precision: 2-4 次 LLM 调用

总计: 7-13 次 LLM 调用

使用 GPT-4o-mini ($0.15/1M input, $0.60/1M output):
- 每个问题约 $0.01-0.02
- 100 个问题约 $1-2
- 1000 个问题约 $10-20

省钱建议

  • 使用便宜的评估模型GPT-4o-mini
  • 使用自托管模型(如 Qwen2.5-7B
  • 减少测试集大小50-100 个代表性问题足够)

4. 非确定性

同一个问题多次评估可能得到不同分数

# 第一次运行
RAGAS Score: 0.8523

# 第二次运行(完全相同的输入)
RAGAS Score: 0.8619

# 差异原因:评估 LLM 的非确定性

解决方案

  • 关注趋势而非绝对值0.85 vs 0.75 是有意义的差异)
  • 使用足够大的测试集(减少随机波动)
  • 降低评估 LLM 的 temperature

实战建议

1. 建立基线

# 在做任何优化之前,先建立基线
python lightrag/evaluation/eval_rag_quality.py > baseline_results.txt

# 记录基线分数
Baseline RAGAS Score: 0.8234
- Faithfulness:      0.8523
- Answer Relevancy:  0.8756
- Context Recall:    0.7945
- Context Precision: 0.7712

2. 每次改动后重新评估

# 改动 1: 换了 embedding 模型
# 重新评估
python lightrag/evaluation/eval_rag_quality.py > after_embedding_change.txt

# 对比
RAGAS Score: 0.8234 → 0.8456 (+2.7%)  ✅ 改进
- Context Recall: 0.7945 → 0.8234 (+3.6%)  # 主要改进点

# 改动 2: 调整了 chunk size
RAGAS Score: 0.8456 → 0.8123 (-3.9%)  ❌ 变差
# 回滚改动

3. 分析单个失败案例

# 查看详细的 JSON 结果
import json
with open('lightrag/evaluation/results/results_20250119.json') as f:
    results = json.load(f)

# 找出分数最低的问题
lowest_score = min(results['results'], key=lambda x: x['ragas_score'])

print(f"问题: {lowest_score['question']}")
print(f"RAGAS: {lowest_score['ragas_score']}")
print(f"答案: {lowest_score['answer']}")
print(f"指标: {lowest_score['metrics']}")

# 输出示例:
# 问题: "如何配置自定义 LLM"
# RAGAS: 0.6234
# 答案: "LightRAG supports custom LLMs..."
# 指标: {
#   'faithfulness': 0.5234,       # ← 低!可能有幻觉
#   'answer_relevancy': 0.8234,
#   'context_recall': 0.5123,     # ← 低!检索不足
#   'context_precision': 0.6456
# }
#
# 分析: 检索没找到关键信息LLM 开始"猜测"答案
# 解决: 确保相关文档被索引,改进检索策略

4. 针对性优化

根据指标找出优化方向:

指标低 可能原因 优化方向
Context Precision 低 检索了太多无关内容 • 减少 top_k
• 添加 reranking
• 改进 embedding 模型
Context Recall 低 检索遗漏关键信息 • 增加 top_k
• 优化 chunking 策略
• 改进查询改写
Faithfulness 低 LLM 产生幻觉 • 改进 prompt强调基于事实
• 降低 temperature
• 使用更可靠的 LLM
Answer Relevancy 低 答案答非所问或冗余 • 改进 prompt要求简洁
• 限制生成长度
• 使用指令跟随能力更强的 LLM

与传统评估方法对比

传统方法:人工评估

优点:
✅ 最准确(人类判断)
✅ 可以发现意外问题

缺点:
❌ 耗时(每个问题 2-5 分钟)
❌ 成本高(需要专家时间)
❌ 不可扩展(难以评估 100+ 问题)
❌ 主观(不同评估者结果不一致)

RAGAS 方法

优点:
✅ 快速(几分钟评估 100 个问题)
✅ 成本低($1-2 per 100 questions
✅ 可扩展(轻松评估 1000+ 问题)
✅ 客观(分数可重复、可比较)
✅ 自动化CI/CD 集成)

缺点:
❌ 依赖评估 LLM可能有误判
❌ 需要高质量 Ground Truth
❌ 无法发现所有类型的问题

推荐做法:混合使用

1. 使用 RAGAS 进行大规模自动评估100+ 问题)
   → 快速发现整体趋势和明显问题

2. 对低分案例进行人工审查10-20 个)
   → 深入理解问题根源

3. 定期进行人工抽查(每周/每月)
   → 校准 RAGAS 评估,发现边缘案例

4. 收集真实用户反馈
   → 发现 RAGAS 无法覆盖的问题

总结

RAGAS 核心价值

  1. 量化 RAG 质量:将"答案好不好"从主观判断变为客观分数
  2. 快速迭代:每次改动都能立即看到影响
  3. 多维度评估:从检索、生成、整体三个角度全面评估
  4. 自动化:可集成到 CI/CD 流程

使用场景

适合使用 RAGAS 的场景

  • 评估 RAG 系统的整体质量
  • 对比不同配置/模型的效果
  • 持续监控系统性能
  • A/B 测试新特性

不适合使用 RAGAS 的场景

  • 评估单个组件(如只评估实体提取)→ 用专门的 Precision/Recall
  • 极高准确性要求的领域(如医疗)→ 必须人工审核
  • 没有明确答案的开放性问题 → 难以创建 Ground Truth

下一步

现在你了解了 RAGAS可以

  1. 运行第一次评估

    python lightrag/evaluation/eval_rag_quality.py
    
  2. 创建自己的测试集

    • 收集 20-50 个真实用户问题
    • 为每个问题编写高质量的 Ground Truth
  3. 建立评估流程

    • 每次重大改动前后都运行评估
    • 追踪 RAGAS 分数变化
    • 结合人工审查
  4. 持续优化

    • 针对低分指标优化
    • 定期更新测试集
    • 收集新的边缘案例

参考资源


需要我帮你:

  • 创建第一个测试数据集?
  • 运行实际评估?
  • 分析评估结果?