RAG评估代码生成
效果图
请你为我的 RAG 问答项目生成一套完整、可运行、工程化的“RAG 自动评估系统”Python 代码。
本次评估系统请以 Ragas 框架为核心,目标是将 RAG 系统的效果评估从“肉眼观察、凭感觉调参”,变成“可量化、可对比、可定位问题、可持续优化”的标准评估流程。
重要要求:
1. 请优先查阅并适配当前安装版本的 Ragas 官方 API,使用最新可用写法,不要直接照搬旧版 ragas.testset.generator、ragas.testset.evolutions 等可能已变化的历史代码。
2. 如果不同版本 Ragas API 存在差异,请在代码中做好兼容性说明,或者提供“当前推荐写法 + 旧版替代写法”。
3. 代码要能在 Windows + Anaconda 环境中运行。
4. 所有代码要有清晰中文注释。
5. 代码结构要工程化,便于我后续接入自己的 RAG 项目。
==================================================
一、评估系统总体目标
==================================================
请为我的 RAG 项目实现以下完整流程:
第 1 步:读取我的知识库文档
- 支持 TXT、Markdown、PDF 文本抽取后的文档列表
- 统一转换为 Ragas 测试集生成或后续检索所需的数据结构
第 2 步:基于文档自动生成“合成真值测试集”
- 利用 Ragas 的 synthetic testset generation 能力
- 根据本地文档生成评估问题与参考答案
- 测试集应覆盖不同难度与不同类型问题:
1. simple:单文档直接问答
2. reasoning:需要理解与推理的问题
3. multi_context / multi-hop:需要结合多个上下文片段的问题
- 允许通过配置调整各类问题的占比,例如:
- simple:50%
- reasoning:25%
- multi_context:25%
- 允许配置 test_size,例如 20、50、100
- 将生成的测试集保存为 CSV / JSONL,避免每次重复消耗 API
- 保存字段至少包括:
- question
- reference / ground_truth
- contexts 或生成测试集时所依赖的参考上下文
- question_type
- difficulty(如可支持)
第 3 步:将测试问题输入我的 RAG 系统
- 请预留一个统一接口函数:
def run_rag(question: str, retrieval_mode: str = "vector") -> dict:
return {
"question": question,
"answer": "...",
"contexts": ["检索到的片段1", "检索到的片段2"],
"retrieved_doc_ids": ["doc_1", "doc_2"],
"retrieval_latency": 0.21,
"generation_latency": 1.37,
"total_latency": 1.58
}
- 请先提供一个 Mock 示例,保证代码可直接跑通
- 同时明确说明:我后续只需要把 run_rag() 替换成自己的真实 RAG 检索 + 生成逻辑即可
第 4 步:支持不同检索策略对比实验
请实现一个可配置的实验框架,用于比较:
1. 向量检索 Vector Search
2. 混合检索 Hybrid Search
3. 后续可扩展:
- BM25
- Reranker
- 不同 top_k
- 不同 embedding 模型
- 不同 chunk_size / chunk_overlap
代码应支持类似下面的配置:
EXPERIMENTS = [
{"name": "vector_top5", "retrieval_mode": "vector", "top_k": 5},
{"name": "hybrid_top5", "retrieval_mode": "hybrid", "top_k": 5}
]
并分别执行评估,输出不同策略的评估指标,最终生成对比报告。
==================================================
二、必须实现的 Ragas 评估指标
==================================================
请使用 Ragas 对以下核心指标进行评估:
1. Context Precision
中文含义:上下文精度
评估重点:
- 检索回来的上下文中,真正与问题回答相关的信息是否排在前面
- 检索结果是否混入过多无关噪声
用途:
- 判断检索结果“准不准”
- 如果该指标低,说明检索片段里无关内容偏多,或者排序不佳
2. Context Recall
中文含义:上下文召回率
评估重点:
- 标准答案所需的关键信息,是否被检索上下文充分覆盖
用途:
- 判断检索结果“全不全”
- 如果该指标低,说明知识没召回,可能需要调整:
- chunk 切分
- top_k
- embedding 模型
- 检索策略
3. Faithfulness
中文含义:忠实度 / 事实依托度
评估重点:
- 最终回答是否严格依据检索到的上下文
- 是否出现上下文中没有依据的内容
用途:
- 判断是否存在幻觉
- 如果该指标低,说明生成模型可能在“瞎编”,需要优化提示词或拒答机制
4. Answer Relevancy / Response Relevancy
中文含义:回答相关性
评估重点:
- 回答是否真正针对用户问题
- 是否答非所问、偏题、废话过多
用途:
- 判断回答是否“对题”
- 如果该指标低,说明 prompt 或上下文组织方式需要优化
5. Answer Correctness
中文含义:答案正确性
评估重点:
- 模型答案与参考答案在事实和语义层面是否一致
用途:
- 判断端到端最终回答是否正确
- 该指标是面向业务的最终效果指标
如果当前版本 Ragas 中这些指标类名或导入方式发生变化,请使用官方当前版本的正确写法,并在代码里注明。
==================================================
三、评估数据组织要求
==================================================
请将数据转换为适合 Ragas 评估的数据结构。
每条评估样本应至少包含:
- user_input / question
- retrieved_contexts / contexts
- response / answer
- reference / ground_truth
请确保最终可传入 Ragas evaluate 或当前版本对应的评估入口。
如果当前版本官方推荐使用 EvaluationDataset、SingleTurnSample 等结构,请使用官方推荐方式;
如果仍支持 Dataset 格式,也可以提供 Dataset 版本示例。
==================================================
四、核心代码模块要求
==================================================
请按照工程化思路组织代码,至少拆分为以下文件:
1. config.py
作用:
- 配置 API Key
- 配置生成测试集参数
- 配置实验组
- 配置 Ragas 指标
- 配置输出目录
2. document_loader.py
作用:
- 加载文档
- 支持读取 txt / md / PDF 抽取后的纯文本
- 转换为后续测试集生成所需格式
3. testset_generator.py
作用:
- 使用 Ragas 根据文档生成合成测试集
- 支持设置 test_size
- 支持设置问题类型比例
- 输出 CSV / JSONL 文件
4. rag_runner.py
作用:
- 实现 run_rag()
- 提供 mock 示例
- 预留接入我的真实 RAG 系统的接口
5. evaluation_builder.py
作用:
- 将:
- testset 中的问题与 ground truth
- run_rag() 产生的 answer 与 contexts
拼接成 Ragas 可评估数据集
6. ragas_evaluator.py
作用:
- 使用 Ragas 计算:
- Context Precision
- Context Recall
- Faithfulness
- Answer Relevancy
- Answer Correctness
- 返回逐条分数与整体平均分
7. experiment_runner.py
作用:
- 批量运行多组检索策略实验
- 例如向量检索 vs 混合检索
- 输出每组指标结果
8. visualization.py
作用:
- 使用 matplotlib 生成可视化图表
- 不要使用 seaborn
- 每张图单独生成
- 包括:
1. 多策略核心指标柱状图
2. Context Precision / Recall 对比图
3. Faithfulness / Answer Relevancy / Answer Correctness 对比图
4. 单条样本得分分布图
5. 检索耗时与生成耗时对比图
9. report_generator.py
作用:
- 输出 Markdown 评估报告
- 报告中包含总体结论、指标表格、问题定位、优化建议
10. main.py
作用:
- 一键执行全流程:
文档读取 → 测试集生成 → RAG 执行 → Ragas 评估 → 可视化 → 报告输出
==================================================
五、输出文件要求
==================================================
请最终生成以下文件:
1. generated_testset.csv
- 自动生成的合成真值测试集
2. evaluation_input.csv
- RAG 实际回答后的待评估数据
3. evaluation_results_vector.csv
- 向量检索实验逐条结果
4. evaluation_results_hybrid.csv
- 混合检索实验逐条结果
5. metrics_summary.csv
- 不同实验组核心指标平均值汇总
6. metrics_summary.json
- 机器可读的汇总指标
7. evaluation_report.md
- 人类可读的完整评估报告
8. charts/
- 保存所有评估图表
==================================================
六、评估报告内容要求
==================================================
evaluation_report.md 至少包含:
1. 项目评估说明
- 本次评估目标
- 使用了哪些指标
- 为什么需要分开评估检索和生成
2. 实验设置
- 测试集大小
- 问题类型比例
- 参与对比的检索策略
- 使用的评估模型
3. 核心指标结果总表
示例:
| 评估维度 | 指标 | Vector Search | Hybrid Search | Diff |
|---|---|---:|---:|---:|
| 检索 | Context Precision | 0.90 | 0.85 | -0.05 |
| 检索 | Context Recall | 0.94 | 0.91 | -0.03 |
| 生成 | Faithfulness | 0.96 | 0.93 | -0.03 |
| 生成 | Answer Relevancy | 0.91 | 0.89 | -0.02 |
| 端到端 | Answer Correctness | 0.88 | 0.85 | -0.03 |
4. 指标解读
- 如果 Context Recall 低,应如何优化
- 如果 Context Precision 低,应如何优化
- 如果 Faithfulness 低,应如何优化
- 如果 Answer Relevancy 低,应如何优化
- 如果 Answer Correctness 低,应如何优化
5. 检索策略对比分析
- 哪种策略更好
- 是否出现“混合检索反而引入噪声”的现象
- 是否存在召回提升但忠实度下降的问题
6. 失败案例分析
- 找出分数最低的 Top 10 样本
- 展示:
- 问题
- 参考答案
- 实际回答
- 检索上下文
- 各指标得分
- 帮助定位问题出在检索还是生成
7. 最终优化建议
请根据评估指标自动生成建议,例如:
- Context Recall 低:
- 增大 top_k
- 优化 chunk_size
- 提高 chunk overlap
- 更换 embedding 模型
- Context Precision 低:
- 降低 top_k
- 引入 reranker
- 改善混合检索权重
- Faithfulness 低:
- 强化“仅依据上下文回答”
- 加入“上下文不足时拒答”
- 减少无关上下文干扰
- Answer Correctness 低:
- 提升检索质量
- 优化 Prompt
- 更换生成模型
==================================================
七、可视化要求
==================================================
请使用 matplotlib 生成以下图表,保存为 PNG:
1. 不同实验组核心指标对比柱状图
- X轴:指标
- Y轴:得分
- 对比 Vector Search 与 Hybrid Search
2. 检索类指标对比图
- Context Precision
- Context Recall
3. 生成类指标对比图
- Faithfulness
- Answer Relevancy
- Answer Correctness
4. 各样本 Answer Correctness 分布直方图
5. Faithfulness 与 Answer Correctness 的散点图
- 用于观察:
是否存在“答案看似正确但并不忠实于上下文”的情况
6. 延迟对比图
- retrieval_latency
- generation_latency
- total_latency
==================================================
八、代码健壮性要求
==================================================
请确保代码:
1. 可直接运行
2. 自动创建输出目录
3. 使用 tqdm 显示进度条
4. 对 API 调用异常进行 try-except 处理
5. 能跳过失败样本并记录错误日志
6. 能够从已生成的测试集文件继续评估,避免重复生成
7. 支持断点式使用:
- 只生成测试集
- 只跑 RAG
- 只做评估
- 只生成报告
==================================================
九、依赖文件要求
==================================================
请给出 requirements.txt,至少包含:
- ragas
- pandas
- tqdm
- matplotlib
- datasets(如果需要)
- langchain / langchain-openai(如果代码使用)
- python-dotenv
- 其他当前方案必须依赖的库
==================================================
十、模型角色设计
==================================================
请允许配置不同模型角色:
1. generation_llm
- 我的 RAG 系统实际用于回答问题的模型
2. evaluator_llm
- Ragas 或评估时使用的裁判模型
- 建议与生成模型分离,尽量使用能力更强、稳定性更高的评估模型
3. embeddings
- 用于测试集生成或评估过程中需要的 embedding 模型
请统一从 config.py 或 .env 中读取。
==================================================
十一、最终你要输出的内容
==================================================
请依次给我:
1. 项目目录结构
2. requirements.txt
3. .env.example
4. config.py
5. document_loader.py
6. testset_generator.py
7. rag_runner.py
8. evaluation_builder.py
9. ragas_evaluator.py
10. experiment_runner.py
11. visualization.py
12. report_generator.py
13. main.py
14. 示例数据与示例运行方式
15. 如何把 run_rag() 替换成我的真实 RAG 系统
16. 如何解读评估结果
17. 如何基于评估结果优化 RAG
代码请尽可能完整,不要只给思路或伪代码。