1. RAG系统概述
1.1 什么是RAG
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与大语言模型生成能力相结合的架构。其核心思想是:在模型生成回答之前,先从外部知识库中检索相关文档片段,然后基于检索到的内容指导模型生成更准确、更可信的输出。RAG架构由三个关键环节构成:
- 检索(Retrieval):根据用户查询,从向量数据库或文档库中搜索最相关的文档片段(Chunks)
- 增强(Augmented):将检索到的文档片段与用户原始查询拼接,构建增强的上下文Prompt
- 生成(Generation):将增强后的Prompt输入大模型,生成包含引用来源的最终回答
1.2 为什么需要专门测试RAG系统
传统的大语言模型评测(如MMLU、C-Eval等基准测试)主要衡量模型的通用知识能力,无法反映RAG系统在特定领域知识库下的实际表现。RAG系统引入了检索和知识注入环节,整个系统的质量取决于"检索质量 × 生成质量"的乘积效应——任何一个环节的短板都会导致最终答案的严重偏差。因此,需要建立一套系统性的RAG测试方法论来回答以下问题:
- 检索到了吗:对于用户的查询,系统是否找到了正确的文档?是否有遗漏或误检?
- 检索够快吗:检索延迟是否在可接受范围内?高并发下性能如何?
- 生成准确吗:基于检索到的文档,模型生成的答案是否忠实于原文?
- 引用可靠吗:生成的回答是否正确引用了来源文档?用户能否追溯验证?
- 边界安全吗:当知识库无法覆盖用户问题时,系统是否诚实承认而非编造?
1.3 RAG系统的质量挑战
RAG系统的质量挑战横跨数据、检索、生成三个层面,且各个环节之间存在耦合关系。以下是主要的挑战分类:
| 挑战维度 | 具体问题 | 影响 |
|---|---|---|
| 文档预处理 | 分块粒度不当、文档格式混乱、表格/图表无法解析 | 检索时无法定位到准确信息片段 |
| 语义匹配 | 向量相似度无法捕捉逻辑关系、同义词映射失效 | 语义相近但逻辑不符的内容被错误召回 |
| 检索召回 | 知识覆盖不全、多义查询混淆、首次命中率低 | 缺失关键信息导致回答不完整或错误 |
| 上下文窗口 | 检索文档过多超出模型上下文限制、关键信息被截断 | 模型只能看到部分信息,回答片面 |
| 生成幻觉 | 模型脱离检索内容生成虚假信息、编造数据 | 用户无法区分哪些信息有来源依据 |
| 多源冲突 | 知识库中存在矛盾文档,新旧版本并存 | 模型引用矛盾信息,回答前后不一致 |
| 时效性 | 文档更新后向量索引未同步、缓存未失效 | 用户获取到的是已过时/废止的信息 |
2. 检索质量测试(核心)
检索环节是RAG系统的第一道关口,其质量直接决定了后续生成的上限。检索质量测试关注的是:对于给定的查询,系统能否从知识库中准确、完整地找到最相关的文档片段。
2.1 检索准确率指标
评估检索准确率的核心指标包括 Top-K 命中率、MRR(Mean Reciprocal Rank)和 NDCG(Normalized Discounted Cumulative Gain)。这些指标从不同角度衡量检索结果的质量。
| 指标 | 定义 | 衡量重点 | 适用场景 |
|---|---|---|---|
| Top-K 命中率 (Hit Rate@K) |
在前K个检索结果中至少有一个相关文档的查询比例 | 检索结果是否"覆盖"了正确答案 | 要求至少有一个相关文档的场景 |
| MRR (Mean Reciprocal Rank) |
第一个相关文档出现位置的倒数,对所有查询取均值 | 正确答案在结果中的排名 | 关注首个正确答案位置,排名越靠前越好 |
| NDCG (Normalized DCG) |
考虑排序位置和相关性分级的归一化折损累计增益 | 排序质量的综合评估 | 有多级相关性标注的场景(强相关/弱相关/不相关) |
| Precision@K | 前K个结果中相关文档的占比 | 检索结果的"纯度" | 用户仅浏览前几条结果的场景 |
| Recall@K | 前K个结果中相关文档占全部相关文档的比例 | 检索的完备性 | 需确保不遗漏关键信息的场景(如合规查询) |
2.2 召回率测试
召回率测试的核心目标是验证系统在不同类型的查询下能否将知识库中所有相关的文档片段检索回来。测试时需要构建包含"已知正确答案"的标注数据集(Ground Truth),标注每个查询对应的期望文档列表。
召回率测试的关键场景:
- 精确查询:用户问题包含明确的关键词,如"智能问答系统的额度审批流程"
- 模糊查询:表述不精确,需要语义理解,如"那个办贷款的功能怎么用"
- 多面查询:一个查询需要来自多个文档的信息,如"2023年和2024年贷款利率对比"
- 跨文档查询:答案分散在不同文档中,需要检索多个来源进行拼接
- 否定查询:知识库中确实不存在相关信息,系统应如实反映
2.3 检索延迟测试
在用户体验中,检索延迟直接影响系统响应速度。向量检索虽然能在大规模数据中高效搜索,但仍需关注以下性能维度:
- 单次检索延迟(P50/P95/P99):普通用户查询的响应时间分布
- 首字节时间(TTFB):从发起查询到获得第一个检索结果的时间
- 并发压力测试:多用户同时查询时的延迟变化和系统吞吐量
- 热/冷启动延迟:首次查询(冷启动)和缓存命中查询(热查询)的延迟差异
- 索引更新延迟:文档入库后到可检索的时间间隔
2.4 分块策略(Chunk Size)测试
文档分块策略是影响检索质量的关键预处理参数。Chunk 过大(如 2000 token)可能包含过多噪音,降低检索精度;Chunk 过小(如 100 token)可能导致语义碎片化,丢失上下文关联。测试需要对比不同分块策略下的检索效果:
- 固定大小分块:对比 256、512、1024、2048 token 的分块效果
- 语义分块:按段落/章节自然边界分块,测试语义完整性的提升
- 滑动窗口重叠:相邻 Chunk 之间设置重叠(如 10-20%),缓解边界截断问题
- 父子文档模式:用小 Chunk 检索,返回对应的大 Chunk 提供完整上下文
测试方法:使用同一份标注数据集,固定检索策略(如相同的 Embedding 模型和 Top-K),仅改变分块参数,对比 Hit Rate@3 和 MRR 的变化。
2.5 混合检索测试
混合检索(Hybrid Search)结合了语义检索(向量相似度)和关键词检索(BM25等稀疏检索)的优势。语义检索擅长理解意图和同义表达,关键词检索对精确术语、专有名词和代码片段效果更好。测试应对比以下模式:
| 检索模式 | 优势 | 劣势 | 适合场景 |
|---|---|---|---|
| 纯语义检索 | 理解语义意图,同义表达友好 | 专有名词/代码匹配弱 | 自然语言问答、模糊查询 |
| 纯关键词检索(BM25) | 精确匹配,术语/代码命中率高 | 无法理解同义改写 | 精确搜索、法规条款查询 |
| 混合检索(RRF融合) | 结合两者优势,互为补充 | 参数调优复杂,计算开销增加 | 企业知识库、多类型混合文档 |
| 重排序(Re-rank) | 在粗排基础上精细筛选 | 增加额外延迟和计算成本 | 对准确率要求极高的场景 |
3. 生成质量测试
生成环节是RAG系统面向用户的最终产出,其质量直接影响用户的信任度和使用体验。生成质量测试的核心原则是:答案必须基于检索文档,而非模型的内部知识。
3.1 忠实性(Faithfulness)
忠实性是RAG系统生成测试中最重要的指标。它衡量的是:生成答案中的每一个事实声明,是否都能在检索到的文档中找到依据。高忠实性的答案意味着"所说即所查",不会编造任何不在检索文档中的信息。
测试方法:将生成答案拆解为原子事实声明(Atomic Claims),逐条与检索文档对照,计算能找到依据的声明比例。
# 忠实性评估示例
生成答案:"贷款利率为3.45%,由人民银行2024年1月发布。"
拆解声明:
1. "贷款利率为3.45%" → 检索文档中找到依据 ✅
2. "由人民银行发布" → 检索文档中找到依据 ✅
3. "2024年1月发布" → 检索文档中未找到 ❌(幻觉)
Faithfulness = 2/3 = 66.7%(此项不达标)
3.2 答案相关性
答案相关性(Answer Relevancy)衡量的是生成答案是否真正回答了用户的问题,而非答非所问或绕圈子。即使答案忠实于检索文档,如果与用户原问题不匹配,仍然是一次失败的交互。
- 直接性:答案是否直接回应了用户的意图?还是绕了一个大弯?
- 完整性:用户问题中所有子问题是否都得到了回应?
- 简洁性:是否存在大量无关信息干扰用户获取核心答案?
- 一致性:同一问题的多次提问是否给出语义一致的答案(允许措辞不同)?
3.3 幻觉检测
幻觉(Hallucination)是RAG系统最棘手的问题之一。即使有了检索增强,模型仍可能在以下情况下产生幻觉:
- 拼凑式幻觉:将不同文档中的信息违法拼接,产生文档中不存在的新事实
- 补全式幻觉:检索文档信息不完整时,模型用内部知识"补充"了缺失信息
- 推理式幻觉:基于正确事实进行错误推理,得出看似合理但错误的结论
- 格式式幻觉:编造不存在的引用编号、章节编号、表格行号等
测试策略:构建"陷阱测试集"——包含模型内部知识中有但检索文档中不存在或被故意修改的信息点,验证模型是否严格遵守检索文档而非自身知识。
3.4 引用准确性
引用准确性测试验证生成的答案是否正确标注了信息来源。在银行合规场景中,来源追溯是刚性需求,用户必须能够通过引用回到原始文档进行验证。
- 引用存在性:每个关键事实声明是否都标注了引用来源?
- 引用正确性:标注的引用来源是否确实包含了该事实?是否存在张冠李戴?
- 引用粒度:引用是精确到段落/条款级别,还是模糊地指向整个文档?
- 引用可达性:引用的文档链接是否可访问、版本是否正确?
3.5 上下文利用率
上下文利用率衡量的是模型是否充分利用了检索到的所有相关文档。常见的问题是模型仅依赖排名最高的1-2个文档,而忽略了后续文档中包含的关键信息。测试方法:
- 关键信息分散测试:将回答问题所需的完整信息故意分散到多个检索文档中,检查答案是否覆盖了全部信息点
- 干扰文档测试:在检索结果中混入不相关文档,测试模型是否能过滤噪音并聚焦核心信息
- 文档间冲突测试:检索结果中包含相互矛盾的文档,观察模型的冲突处理能力
4. 端到端测试
端到端测试将RAG系统视为一个完整的黑盒,模拟真实用户的使用场景,从输入到输出全面评估系统表现。
4.1 完整流程的质量评估
端到端评估的核心要素包括:
| 评估维度 | 评估方法 | 关键指标 |
|---|---|---|
| 答案质量 | 人工标注 + LLM自动评分 | 忠实性、相关性、完整性、准确性 |
| 响应时间 | 压测工具监控 | P50/P95/P99 延迟、首Token时间 |
| 用户体验 | 满意度问卷 + 行为分析 | NPS、答案采纳率、追问频率 |
| 系统稳定性 | 长稳测试/混沌工程 | 错误率、OOM频率、服务可用率 |
| 知识覆盖 | 知识库覆盖率扫描 | 文档覆盖率、盲区识别率 |
4.2 多轮对话中的上下文保持
实际使用中,用户往往通过多轮追问来逐步获取信息。RAG系统需要在多轮对话中正确理解上下文继承关系:
- 指代消解:后续轮次中的"它"、"那个"、"前面提到的"能否正确关联到上文实体?
- 话题跟踪:用户切换子话题后,系统是否仍能保持对话连贯性?
- 上下文窗口复用:历史检索结果是否在多轮间合理复用,避免重复检索?
- 纠错能力:用户指出上一轮答案错误后,系统能否理解并重新检索纠正?
4.3 边界情况测试
RAG系统的边界情况测试尤为重要,因为边界场景往往是生产环境中最容易出问题的地方:
- 无相关文档(知识盲区):当知识库中确实不存在相关信息时,系统应诚实告知"我目前的知识库中未找到相关信息",而不是编造答案
- 多义查询:如"额度"在银行系统中可能指贷款额度、信用卡额度、转账额度等不同含义,测试系统能否根据上下文正确消歧
- 长查询:用户输入一段很长的描述,其中包含多个问题和大量背景信息,测试检索的准确性不因噪音而下降
- 超短查询:如仅输入"利率"两个字,测试系统是否能给出合理引导而非随机返回
- 特殊字符查询:包含 SQL 注入、XSS 代码、Emoji 等特殊字符的输入
4.4 用户满意度评估
用户满意度评估需要结合人工评估和自动评估两套体系:
- 人工评估:组织领域专家(如银行业务骨干)对一批问答进行打分,关注准确性、实用性、表达清晰度
- 自动评估:使用LLM作为评判器(LLM-as-Judge),对大批量问答自动评分,与人工评分做一致性校验
- 行为指标:采集用户的点赞/点踩、复制答案、追问次数、停留时长等行为数据作为辅助信号
- A/B测试:对于关键更新(如切换Embedding模型、调整分块策略),通过A/B实验对比用户满意度变化
5. RAG评估框架与工具
5.1 RAGAS评估框架
RAGAS(RAG Assessment)是目前最主流的RAG系统开源评估框架,由Exploding Gradients团队维护。它提供了一套标准化的评估指标,覆盖检索和生成两个环节:
| 指标 | 评估对象 | 计算方式 | 理想值 |
|---|---|---|---|
| Faithfulness | 生成答案的忠实性 | 将答案拆解为claims,逐条与检索文档对比 | ≥ 0.90 |
| Answer Relevancy | 答案与问题的相关性 | 基于答案反向生成问题,计算与原问题的语义相似度 | ≥ 0.85 |
| Context Precision | 检索上下文的精确度 | 检索文档中相关文档的排序位置 | ≥ 0.80 |
| Context Recall | 检索上下文的召回率 | 检索文档覆盖Ground Truth的比例 | ≥ 0.90 |
| Context Relevancy | 检索文档与问题的相关性 | 检索内容中不必要的冗余句子比例 | ≥ 0.70 |
| Answer Correctness | 答案的事实正确性 | 与Ground Truth答案的语义相似度+F1 | ≥ 0.85 |
pip install ragas 即可安装。RAGAS支持与LangChain、LlamaIndex等主流框架集成,评估时只需传入 question、answer、contexts、ground_truth 四个字段,即可一键计算所有指标。
5.2 TruLens评估
TruLens 是由TruEra推出的RAG应用评估与可观测性框架。相比于RAGAS更偏重离线批量评估,TruLens的优势在于提供了在线监控能力,可以在生产环境中持续追踪RAG系统的质量变化。其核心功能包括:
- 反馈函数(Feedback Functions):将评估指标封装为可复用的函数,支持LLM-as-Judge模式
- 仪表盘:提供可视化界面,实时监控答案质量、检索质量、延迟等指标的趋势
- 应用追踪:记录每个查询的完整调用链(检索→生成→反馈),便于问题回溯
- A/B实验:支持并排对比不同配置的RAG Pipeline效果
5.3 自定义评估方案的构建
通用评估框架虽然便捷,但在金融等垂直领域往往需要定制化评估方案。构建自定义评估方案的关键步骤:
- 构建领域测试集:由业务专家创建标注了标准答案和期望引用文档的问答对(建议至少200+条)
- 定义评估维度:根据业务场景确定核心评估指标(如合规性、风险提示、免责声明等金融特有维度)
- 设计评分标准:制定1-5分的评分细则(Rubrics),降低人工评分的主观差异性
- 自动化评估管线:使用LLM-as-Judge实现批量自动评分,抽取20%样本进行人工交叉验证
- 持续迭代:根据生产环境反馈的不良案例(Bad Cases),不断补充测试集和优化评分标准
6. 银行业RAG系统的测试重点
6.1 银行知识库问答系统的特殊性
银行知识库问答系统(对标行内"智能问答系统"等智能助手)在RAG系统测试上有其独特的要求。金融领域对信息的准确性、合规性和可追溯性有着远高于通用场景的标准:
- 零容忍幻觉:金融知识的错误可能直接导致客户资金损失或合规风险,幻觉得分要求应远高于通用场景(Faithfulness ≥ 0.95)
- 强制来源引用:每个关键事实必须能追溯到具体的政策文件、制度条款或操作规程
- 版本敏感:金融政策频繁更新,系统必须能区分新旧版本,避免引用已废止的条款
- 风险提示:回答涉及投资、利率、产品推荐等内容时,必须包含合规的风险提示语
- 权限感知:不同角色的用户(柜员/客户经理/风控/行领导)应有不同的知识访问范围
6.2 金融文档检索的质量要求
银行知识库中包含的文档类型多样,对检索质量提出了差异化要求:
| 文档类型 | 检索难点 | 测试关注点 |
|---|---|---|
| 政策法规 | 条文编号体系、法律术语密集、更新频繁 | 条款级精确检索、生效/废止时间判断 |
| 操作规程 | 步骤编号、流程图、条件分支逻辑 | 步骤完整性、条件分支覆盖 |
| 产品说明书 | 表格数据(利率表、费率表)中的结构化信息 | 表格数据提取准确性、数值范围匹配 |
| 培训材料 | 非正式表述、口语化内容、新旧知识混杂 | 核心概念的准确提取、过时内容的识别 |
| 问答FAQ | 问题相似度高、答案简短难以匹配语义 | 问法多样性的鲁棒性 |
6.3 合规性验证
合规性验证是银行业RAG系统测试中不可缺失的环节,主要包括:
- 来源追溯验证:从答案出发,反向验证每个事实声明是否能追溯到唯一的源文档位置(章节/段落/条款编号)
- 内容准确性验证:抽取一定比例的答案进行人工专家复核,验证关键数据(利率、期限、费率)的精确性
- 免责声明检查:验证答案在涉及建议、预测、分析等场景时是否包含了必要的风险提示
- 敏感信息保护:确保答案不会泄露客户隐私信息、内部机密或未公开数据
- 监管术语规范:验证使用的金融术语是否符合监管机构(人民银行、银保监会)的统一命名规范
6.4 我处可能涉及的RAG系统测试场景
结合AI测试的工作范围,以下RAG系统测试场景具有较高的落地可行性:
-
性能测试AI驾驶舱的知识库功能
性能测试AI驾驶舱是面向性能测试团队的知识赋能工具,其知识库功能基于RAG技术构建。测试重点包括:
- 性能测试术语(TPS、QPS、RT、并发数等)的检索与解释准确性
- 历史性能测试报告的检索能力——能否根据"去年核心系统压测报告"等自然语言查询精确定位
- 性能异常分析知识的召回——如"CPU使用率飙高"是否能检索到对应的排查文档
- 工具操作指南的生成质量——如"JMeter如何配置分布式压测"的步骤完整性
7. 常见坑点
以下是RAG系统测试和生产运营中最常见的坑点,提前了解有助于规避风险。
7.1 检索不到关键文档时的降级策略
当知识库中确实不存在相关信息(或检索无法召回关键文档)时,系统必须具备合理的降级策略。常见的问题和应对:
| 坑点 | 表现 | 应对策略 |
|---|---|---|
| 强行编造 | 检索为空时,模型仍生成了看似合理的答案 | 在Prompt中强制约束:"如果检索结果为空,只需回答'未找到相关信息'" |
| 过度降级 | 轻微检索不足就放弃回答,用户体验差 | 设置检索置信度阈值,低于阈值时主动引导用户细化问题 |
| 无提示降级 | 使用了通用知识替代但未告知用户 | 明确标注答案来源,区分"知识库内容"和"通用知识补充" |
| 盲目重试 | 检索失败后机械重试,延长响应时间 | 限制重试次数和总超时,设置熔断机制 |
7.2 多源文档冲突的测试
在企业知识库中,文档冲突是一个普遍存在的问题。常见冲突类型包括:
- 版本冲突:旧版操作规程和新版制度同时存在于知识库中
- 口径冲突:不同部门对同一业务名词的定义不同(如"风险敞口"在不同语境下的计算口径)
- 时效冲突:已废止的政策文件与现行文件共存
- 层级冲突:总行制度和分支行细则之间的差异
测试方法:在知识库中刻意放入矛盾文档,构造能触发冲突的查询,验证系统的冲突处理策略(应优先引用最新、最高层级、最权威的文档)。
7.3 文档更新后的缓存问题
知识库文档更新后,RAG系统的各层缓存可能未同步更新,导致用户看到的是过期内容:
- 向量索引缓存:文档更新后未触发向量重新Embedding,新/旧内容检索不到
- 检索结果缓存:热门查询的结果被缓存,文档更新后缓存未失效
- 生成结果缓存:对高频问题缓存了完整答案,更新后仍返回旧答案
- LLM内部知识:模型参数中可能固化了旧版知识,需要靠精确的Prompt约束来抑制
测试验证:在知识库更新后,构造针对新增/修改/删除内容的查询,验证检索和生成结果是否在预期时间内(如15分钟内)反映了最新内容。
8. 实战演练
以下三个实战任务由浅入深,帮助快速上手RAG系统的测试实践。建议按顺序完成,每个任务预计耗时 30-60 分钟。
任务1:搭建RAG测试环境
目标:使用 LangChain + ChromaDB 搭建一个简易RAG系统,并完成基本的检索质量评估。
环境准备:
# 创建虚拟环境
python -m venv rag-test-env
source rag-test-env/bin/activate # Windows: rag-test-env\Scripts\activate
# 安装依赖
pip install langchain langchain-community chromadb sentence-transformers ragas openai
操作步骤:
- 准备知识库文档:准备 3-5 份银行制度相关文档(如贷款管理办法、风控政策等),放入
./docs/目录 - 构建向量索引:使用 LangChain 的
TextLoader+RecursiveCharacterTextSplitter(chunk_size=512)对文档分块,调用sentence-transformers生成向量,存入 ChromaDB - 搭建检索链:创建
RetrievalQA链,指定检索 Top-K=3 - 评估检索质量:准备 10 个标注了期望文档的查询,计算 Hit Rate@3 和 MRR
pip install ragas && python -c "from ragas import evaluate" 即可体验。
任务2:检索质量对比测试
目标:对比不同配置对检索质量的影响,找到适合银行文档的最优参数组合。
对比维度:
| 对比项 | 方案A | 方案B | 方案C | 评估指标 |
|---|---|---|---|---|
| Chunk Size | 256 token | 512 token | 1024 token | Hit Rate@3 / MRR |
| Embedding 模型 | text2vec-large-chinese | BAAI/bge-large-zh | m3e-base | Hit Rate@3 / MRR |
| 检索策略 | 纯语义检索 | 混合检索(BM25+向量) | 混合检索+Rerank | Hit Rate@5 / NDCG@5 |
操作要点:
- 使用同一份标注数据集(Ground Truth),确保对比的公平性
- 每次仅改变一个变量(Chunk Size / Embedding 模型 / 检索策略),控制其他参数不变
- 记录 Hit Rate@3("能不能找到")和 MRR("找得靠不靠谱")两项指标
- 将结果填入对比表格,标注最优方案并附上简要分析
任务3:RAG端到端质量测试
目标:设计银行制度问答场景,使用 RAGAS 评估生成答案的整体质量。
场景设计:以下为 10 个典型的银行制度问答场景,覆盖不同查询类型:
| 编号 | 查询类型 | 示例问题 | 期望行为 |
|---|---|---|---|
| 1 | 精确查询 | 个人住房贷款的最低首付比例是多少? | 检索到具体条款,输出精确数值并引用来源 |
| 2 | 模糊查询 | 办房贷需要什么条件? | 召回贷款申请条件,列出关键要求 |
| 3 | 流程查询 | 企业开户的完整流程是什么? | 检索操作规程,按步骤输出并标注每步依据 |
| 4 | 数值对比 | 一年期和三年期定存利率分别是多少? | 检索利率表,输出精确数值并注明生效时间 |
| 5 | 跨文档查询 | 风控审批和贷后管理各有哪些要求? | 从多份文档中提取并合并信息 |
| 6 | 合规判断 | 这笔跨境汇款需要哪些合规审查? | 检索外汇管理规定,列出审查项及法规依据 |
| 7 | 知识盲区 | 2028年的贷款政策有什么变化? | 诚实告知知识库中无此信息,不编造 |
| 8 | 版本敏感 | 现行的不良贷款分类标准是什么? | 优先检索最新版本制度,标注生效日期 |
| 9 | 多义消歧 | "额度"不够怎么办? | 根据上下文判断是贷款/信用卡/转账额度 |
| 10 | 风险提示 | 推荐一款收益高的理财产品 | 必须包含风险提示和免责声明 |
使用 RAGAS 评估:
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision
# 准备评估数据
eval_dataset = Dataset.from_dict({
"question": questions, # 10个问题
"answer": generated_answers, # RAG系统生成的答案
"contexts": retrieved_docs, # 检索到的文档列表
"ground_truth": ground_truths # 人工标注的标准答案
})
result = evaluate(eval_dataset,
metrics=[faithfulness, answer_relevancy, context_precision])
print(result)
结果记录与分析:
- 记录 Faithfulness(忠实性,目标 ≥ 0.90)、Answer Relevancy(相关性,目标 ≥ 0.85)、Context Precision(检索精确度,目标 ≥ 0.80)
- 逐条分析不达标的场景,定位问题根源(检索失败 / 生成幻觉 / 上下文截断)
- 输出一份测试报告,包含指标汇总、问题分析、改进建议
9. 银行业RAG测试检查清单
以下检查清单覆盖银行RAG系统上线前必须验证的关键项目,建议作为发布门禁(Release Gate)逐项确认。
| 类别 | 检查项 | 验收标准 | 检查方法 |
|---|---|---|---|
| 检索质量 | Top-3 命中率 | Hit Rate@3 ≥ 0.85 | 使用 50+ 标注查询进行批量测试 |
| 召回完整性 | Recall@5 ≥ 0.90 | 关键业务场景的 Ground Truth 覆盖验证 | |
| 混合检索可用性 | 关键词+语义检索均正常工作 | 构造精确术语查询与模糊语义查询交叉验证 | |
| 分块策略合理性 | Chunk Size 通过对比测试选出最优 | 对比 3 种以上分块策略的检索效果并记录 | |
| 生成质量 | 忠实性(Faithfulness) | ≥ 0.95(金融场景从严) | RAGAS Faithfulness 指标 + 20% 人工抽检 |
| 答案相关性 | Answer Relevancy ≥ 0.85 | RAGAS 评估 + 业务专家打分 | |
| 幻觉发生率 | 关键事实幻觉率 = 0 | 陷阱测试集(含已知不存在的信息点)验证 | |
| 引用准确性 | 每条关键事实均可追溯到源文档 | 随机抽取 20 条答案进行人工追溯验证 | |
| 合规安全 | 来源可追溯 | 100% 关键事实有明确引用标注 | 逐条核对引用编号与源文档内容一致性 |
| 版本时效性 | 优先引用最新版本,废止文档不被引用 | 知识库中同时放入新旧版本,验证检索偏向 | |
| 免责声明 | 涉及投资/建议/预测时自动附加风险提示 | 构造 10+ 触发免责声明的场景进行验证 | |
| 敏感信息保护 | 不泄露客户隐私/内部机密/未公开数据 | 安全扫描 + 渗透测试 | |
| 权限隔离 | 不同角色用户的知识访问范围正确隔离 | 使用不同权限账号分别查询敏感内容 | |
| 性能指标 | 单次检索延迟 | P95 ≤ 500ms | JMeter / Locust 压测 |
| 端到端响应时间 | P95 ≤ 3秒(检索+生成) | JMeter 端到端压测,覆盖多场景并发 | |
| 并发吞吐量 | ≥ 50 QPS(视业务规模调整) | 阶梯式加压测试,找到吞吐拐点 | |
| 索引更新延迟 | 文档入库后 ≤ 15 分钟可检索 | 文档更新后定时查询直至命中,记录延迟 | |
| 边界鲁棒 | 知识盲区处理 | 无相关文档时明确告知而非编造 | 构造 10+ 知识库无法覆盖的查询 |
| 多义查询消歧 | 根据上下文正确理解歧义词 | 构造同形异义的银行术语查询(如"额度") | |
| 长/短查询适应性 | 长查询不因噪音降低精度,短查询合理引导 | 构造 200+ 字长查询和 2 字短查询各 5 条 | |
| 异常输入防护 | SQL注入/XSS/Emoji等异常输入不导致异常 | 使用安全扫描工具进行模糊测试 |
10. 我处JMeter适配建议
JMeter 是性能测试的核心工具,可以很好地适配 RAG 系统的性能测试需求。以下简要说明如何用 JMeter 测试 RAG 系统的检索延迟和吞吐量。
10.1 测试架构
RAG 系统的检索接口通常以 RESTful API 形式暴露,因此 JMeter 的 HTTP 请求采样器即可直接使用。典型测试架构如下:
┌─────────────┐ HTTP POST ┌──────────────┐
│ JMeter │ ─────────────────→ │ RAG 服务 │
│ (压测节点) │ ←───────────────── │ /api/search │
└─────────────┘ JSON Response └──────────────┘
│
┌────▼─────┐
│ 向量数据库 │
│ (ChromaDB │
│ Milvus) │
└──────────┘
10.2 JMeter 配置要点
| 配置项 | 说明 | 建议值 |
|---|---|---|
| HTTP Request | 采样器指向检索API端点 | POST /api/v1/search,Content-Type: application/json |
| 请求 Body | 检索查询的 JSON 体 | {"query": "${query}", "top_k": 3},query 变量从 CSV 文件读取 |
| CSV Data Set Config | 准备 100+ 条真实业务查询作为测试数据 | 覆盖短查询、长查询、精确查询、模糊查询等类型 |
| Thread Group | 并发线程数设置 | 从 10 起步,阶梯递增至 100/200/500,观察拐点 |
| 断言(Assertion) | 验证响应正确性 | HTTP 状态码 200 + JSON 响应中包含 results 字段且非空 |
| 监听器 | 结果收集与可视化 | 聚合报告(Aggregate Report)+ 响应时间图(Response Time Graph) |
10.3 关键指标与场景设计
核心监控指标:
- 检索延迟:P50 / P95 / P99 响应时间,关注长尾延迟
- 吞吐量:每秒处理请求数(TPS),找到系统吞吐上限
- 错误率:超时、5xx 错误、空结果响应的比例
- 资源消耗:结合 ServerAgent 监控 CPU/内存/磁盘 IO
推荐测试场景:
- 基准测试:单用户串行执行 100 条查询,建立延迟基线
- 负载测试:从 10 并发逐步加压到目标并发数,观察性能衰减曲线
- 压力测试:持续加压至系统瓶颈(错误率升高或延迟陡增),记录极限 TPS
- 稳定性测试:在 60% 极限负载下持续运行 30 分钟,观察内存泄漏和延迟抖动
- 混合场景测试:同时模拟检索请求和文档入库(索引更新),验证互不干扰
📋 案例研究:银行制度问答RAG系统的测试实战
背景:某银行构建了基于RAG的内部制度问答系统(类似智能问答系统),覆盖200+份行内制度文档。上线前需要对其检索质量和生成质量进行全面评估。
测试方案
- 构建50条测试问题(20条精确查询、15条模糊查询、10条跨文档查询、5条无答案边界)
- 使用RAGAS评估faithfulness、answer_relevancy、context_precision、context_recall
- 人工抽检20%的测试结果做一致性验证
测试过程
- 步骤1:文档分块测试(chunk_size=256/512/1024对比)
- 步骤2:检索策略测试(仅语义/仅关键词/混合检索对比)
- 步骤3:端到端质量评估
测试结果
三种chunk_size × 三种检索策略的端到端评估对比(RAGAS指标):
| Chunk大小 | 检索策略 | Faithfulness | Answer Relevancy | Context Precision | Context Recall |
|---|---|---|---|---|---|
| 256 | 仅语义检索 | 0.72 | 0.68 | 0.61 | 0.55 |
| 256 | 仅关键词检索 | 0.65 | 0.59 | 0.72 | 0.63 |
| 256 | 混合检索 | 0.74 | 0.71 | 0.75 | 0.67 |
| 512 | 仅语义检索 | 0.77 | 0.74 | 0.67 | 0.62 |
| 512 | 仅关键词检索 | 0.63 | 0.61 | 0.78 | 0.69 |
| 512 | 混合检索 | 0.86 | 0.83 | 0.84 | 0.78 |
| 1024 | 仅语义检索 | 0.79 | 0.76 | 0.62 | 0.59 |
| 1024 | 仅关键词检索 | 0.61 | 0.58 | 0.74 | 0.65 |
| 1024 | 混合检索 | 0.82 | 0.80 | 0.79 | 0.73 |
最佳组合:chunk_size=512 + 混合检索,四项指标均为最优。无答案边界的拒答率仅为 60%(5条中仅3条正确拒答),需重点改进。
发现的问题
- 部分陈旧文档检索排序靠后,导致答案引用不准确
- 跨文档查询的context_recall偏低(均值0.55),说明跨文档关联检索能力不足
- 建议引入文档时效性权重,提升最新制度文档的检索排名
启示
- RAG系统的端到端评测是必要的,仅测检索或生成都不够
- Chunk策略和检索策略需要联合调优,二者存在交叉影响
- 银行业RAG对引用准确性要求极高,需建立持续回归评测机制