RAG效果评估:你的知识库到底好不好用?
RAG效果评估你的知识库到底好不好用你把知识库搭起来了老板也试用了一下反馈说还行有时候挺准的。还行是最危险的评价。它意味着你不知道系统到底多好、多差、哪里差。今天这篇我教你用一套低成本的方法量化评估你的 RAG 知识库到底好不好用。大家好我是黒漂技术佬。一、先定义什么算好用RAG 系统的答案质量拆成三个可测量的维度维度衡量标准举例准确性答案是否基于文档给出没有编造问年假几天答案应该和文档一致完整性是否覆盖了文档中所有相关信息文档写了年假计算方式AI 不能只说去OA申请诚实性不知道的时候是否承认不知道文档没写的AI 应该说未找到而不是编一个学术界有很多评测框架——RAGAS、TruLens、DeepEval——但对于企业落地来说最简单的方案往往最有效。二、方法一人工评测最便宜也最诚实准备一份50 个问答对的评测集这些问答对是你手动标注的标准答案。评测集应该覆盖不同类型的问题类型1事实查询factoid 问公司年假有多少天 答5~15 天按司龄递增 类型2解释说明explanatory 问为什么代码评审要至少两个人 答……文档中关于 Code Review 的说明 类型3多跳推理multi-hop 问入职满 3 年的员工年假加带薪病假最多能请多少天 答需要综合年假制度和病假制度两篇文档 类型4无关问题out-of-domain 问今天天气怎么样 答这不是企业知识应回复无法回答打分规则三级制2 分 — 完全正确引用准确没有编造 1 分 — 部分正确但漏了重要信息或有轻微偏差 0 分 — 答非所问、幻觉编造、或引用了错误文档一个 50 题的评测集每题的标准答案是你人工写的RAG 给出的实际答案由你打分。打完算平均分。目标平均分 ≥ 1.7 就算是生产可用了。低于 1.5 的话先别上线。三、方法二RAGAS 自动评测省人力适合持续监控RAGAS 是一个开源的 RAG 评测框架不需要人工标注答案它用 LLM 自动打分。fromragasimportevaluatefromragas.metricsimport(faithfulness,# 忠实度答案是否基于检索到的文档answer_relevancy,# 答案相关性答案是否切题context_recall,# 上下文召回率是否找回了所需的所有信息context_precision,# 上下文精确率检索结果里的噪音多不多)fromdatasetsimportDataset# 准备数据eval_datasetDataset.from_dict({question:[年假怎么请,加班费怎么算,...],answer:[rag_answer_1,rag_answer_2,...],contexts:[retrieved_docs_1,retrieved_docs_2,...],ground_truth:[human_answer_1,human_answer_2,...]# 可选})# 用 GPT-4 做评委自动打分resultevaluate(eval_dataset,metrics[faithfulness,answer_relevancy,context_recall,context_precision])print(result)# {faithfulness: 0.89, answer_relevancy: 0.85,# context_recall: 0.78, context_precision: 0.82}四个指标怎么解读Faithfulness忠实度 0.8989% 的回答内容确实来自检索到的文档。剩下的 11% 是 LLM 自由发挥的——这是最值得关注的指标因为它直接反映幻觉率。Answer Relevancy答案相关性 0.8585% 的回答确实在回答用户的问题。剩下的 15% 可能答非所问或答不完全。Context Recall上下文召回率 0.78检索只找回了 78% 的所需信息。这是你的检索系统改善空间最大的地方。Context Precision上下文精确率 0.82检索返回的文档里82% 是有用的18% 是噪音。可以试着减少 top_k。四、方法三用户反馈闭环上线后的真实标尺评测永远是模拟。真正决定好不好用的是上线后的用户反馈。最轻量的方案在每个 AI 回答下面加两个按钮。# 前端收集反馈feedback{question:年假怎么请,answer:...,rating:thumbs_up|thumbs_down,# 或 comment:答案写错了年假应该是5天不是10天,# 可选user:张三,timestamp:2024-06-12T10:30:00}# 后端存到数据库定期跑统计建立监控看板至少跟踪这三个指标指标 1好评率 / ( ) 目标≥ 80% 指标 2高频差评关键词 统计 附带的 comment看哪些问题类型反复出现 指标 3拒答率 无匹配结果 / 总提问次数 太高 15%→ 文档覆盖不足 太低 1%→ 可能在编造五、持续优化循环评测不是一次性的事。我的实战循环是这样每两周跑一轮 ┌─────────────────────────────────┐ │ 1. 收集新数据用户反馈 差评 │ └─────────────┬───────────────────┘ ▼ ┌─────────────────────────────────┐ │ 2. 分析差评根因 │ │ 是检索没搜到还是LLM编造了 │ └─────────────┬───────────────────┘ ▼ ┌─────────────────────────────────┐ │ 3. 针对性优化 │ │ · 检索差 → 调整chunk/改写策略 │ │ · 幻觉多 → 加强Prompt约束 │ │ · 覆盖不足 → 补充文档 │ └─────────────┬───────────────────┘ ▼ ┌─────────────────────────────────┐ │ 4. 跑评测集验证 → 发布新版本 │ └─────────────────────────────────┘六、一个你可能忽略的评估维度引用追溯企业知识库和 ChatGPT 最大的不同是答案必须有出处。给用户的答案应该标注这个信息来自《员工手册》第 3 页让用户可以回原文核查。怎么实现# 在检索时保存每个 chunk 的元数据chunksvectorstore.similarity_search(query,k5)citations[f[{i1}]{chunk.metadata[source]}第{chunk.metadata[page]}页fori,chunkinenumerate(chunks)]# 拼进 Promptpromptf ... 在回答末尾请列出你引用的文档来源{\n.join(citations)}然后在评测时额外统计一个Citation Accuracy引用准确率AI 标注的来源是否真的包含对应信息。这是一个硬指标——引用错了比没引用更差。 你的 RAG 系统用什么方法评估的Faithfulness 是多少评论区晒一下