新闻详情

新闻详情

首页 / 资讯中心 / 详情

检索评测只报质量不报延迟:同一套四格消融,P95 从 781ms 到 9216ms 却没人拦

发布时间:2026/9/28 18:04:25来源:尧图网络
检索评测只报质量不报延迟:同一套四格消融,P95 从 781ms 到 9216ms 却没人拦
现象四个格子两个指标纹丝不动另外两个塌了先把结果摆在桌面上。同一个数据集examples/demo_rag/dataset.jsonl30 题hash1385126cffea同一个裁判模型deepseek-chat只动两个旋钮top_k1 或 3和prompt_stylegrounded或weak。四格跑满得到下面这张表运行 IDtop_kprompt_stylecontext_precisioncontext_recallfaithfulnessanswer_correctness延迟均值延迟中位P9520260827T094242Z3grounded1.01.00.95560.8164589.0ms593.4ms781.22ms20260827T095152Z1weak1.01.00.32570.39254022.7ms3180.4ms9216.3ms20260921T005917Z1grounded1.01.00.93060.8198623.2ms583.5ms907.47ms20260921T010853Z3weak1.01.00.69320.62741306.9ms1107.0ms1729.59ms注意第一件反常识的事检索类指标 context_precision 和 context_recall 在四格里全是 1.0差值是 0.0。也就是说如果你的评测报告只印检索质量这四个格子看起来一模一样你会得出这四次跑的是同一个系统的结论。真正在动的是 faithfulness 和 answer_correctness以及完全不在指标表里的延迟。第二件反常识的事延迟最大的那一格恰恰是 top_k 最小的那一格。top_k1 weak的延迟均值 4022.7ms、P95 9216.3ms而top_k3 grounded只有 589.0ms / P95 781.22ms。直觉上召回少一点、上下文短一点会更快这里反过来了。实验设置2x2 消融读者可以照着复现要复现这套结论你需要四个运行缺一格都不能归因数据集examples/demo_rag/dataset.jsonl30 题hash1385126cffea四次运行完全同一份。旋钮top_k ∈ {1, 3}prompt_style ∈ {grounded, weak}2x2 四格齐全。裁判模型deepseek-chat四次一致。指标context_precision、context_recall、faithfulness、answer_relevancy、answer_correctness外加被测系统的延迟均值/中位/P95。裁判开销用来判断这次评测本身贵不贵运行 ID裁判调用次数失败输入 token输出 token约合美元20260827T094242Z3150234321260170.091920260827T095152Z25502360081284060.20520260921T005917Z2420164638245160.071420260921T010853Z3100248693585070.1315整轮耗时分别是 527.13s、594.9s、556.96s、715.08s。为什么必须四格齐全因为看配对对比会骗人。比如20260827T094242Zvs20260827T095152Zfaithfulness 从 0.9556 到 0.3257差 -0.6299看起来像某一个旋钮造成的巨大退化。但这两次之间top_k和prompt_style同时变了这个差值不能归因到单个旋钮。同理20260921T005917Zvs20260921T010853Z也是两个变量一起动。只有把 2x2 补满主效应才可引用指标top_k 主效应1→3prompt_style 主效应grounded→weak交互项context_precision1.0 → 1.0效应 0.01.0 → 1.0效应 0.00.0context_recall1.0 → 1.0效应 0.01.0 → 1.0效应 0.00.0faithfulness0.6281 → 0.8244效应 0.19630.9431 → 0.5094效应 -0.43370.3425answer_relevancy0.7699 → 0.7506效应 -0.01930.7525 → 0.768效应 0.01550.0168answer_correctness0.6061 → 0.7219效应 0.11580.8181 → 0.51效应 -0.30810.2383faithfulness 的交互项是 0.3425answer_correctness 是 0.2383。这两个数字的意思是一个旋钮的效果强烈依赖另一个旋钮的取值主效应不能直接相加。比如 faithfulness 上top_k 从 1 到 3 在grounded下只带来 0.025 的变化在weak下却带来 0.3675 的变化。你如果只跑单变量对比会得出完全相反的结论。机制分析为什么质量指标动了、检索指标没动context_precision和context_recall四格全 1.0不是检索变得完美了而是这两个指标的判别粒度太粗。top_k从 1 变到 3只要命中的那一条始终在上下文里precision 和 recall 的均值就能一直维持 1.0。它们对上下文里多塞了两条无关内容这件事不敏感——而这恰恰是top_k3真正带来的变化。真正敏感的是 faithfulness。看运行20260827T095152Ztop_k1, weak的失败归因分布OK4UNKNOWN4HALLUCINATION22。30 题里 22 题被判幻觉。同一份数据在top_k3, grounded下是 OK27、UNKNOWN3。但这里有个必须拆穿的坑规则归因器的标签不可信。运行20260827T095152Z的规则归因→裁判复核是HALLUCINATION-OK11、HALLUCINATION-None10、HALLUCINATION-HALLUCINATION1复核统计是确认 1 条、推翻 11 条、未复核 18 条。也就是说规则判出来的 22 条幻觉里抽去复核的部分有 11 条被裁判推翻成 OK。运行20260921T010853Z更直接HALLUCINATION-OK7复核推翻 10 条、确认 0 条。所以归因分布只能当待复核队列用不能当结论。真正能直接引用的还是指标均值加配对检验。框架自带的回归报告diff_20260827T095152Z_vs_20260827T094242Z.md给出的判定是指标基线当前95%CICohens dzp判定context_precision1.0001.000[0.000, 0.000]0.0001.000无明显变化context_recall1.0001.000[0.000, 0.000]0.0001.000无明显变化faithfulness0.9560.326[-0.746, -0.514]-2.0320.000显著退化answer_relevancy0.7390.774[-0.060, 0.130]0.1380.457无明显变化answer_correctness0.8160.393[-0.526, -0.321]-1.5440.000显著退化faithfulness 的 Cohens dz 是 -2.032配对 30 题p0.000。这是强信号。而answer_relevancy的 p0.457判定无明显变化——它在这个实验里基本是个噪声指标别拿它做门禁。还有一个更隐蔽的假通过拒答算对attribution.modeUNKNOWN是归因器标签不等于系统拒答。这两件事经常被混为一谈。证据包里做了反事实重算把识别出的拒答样本分数替换成 1.0 再算均值差值就是拒答算对带来的虚高。运行 ID识别出拒答作答率answer_correctness 虚高faithfulness 虚高20260827T094242Z0 条100.0%0.00.020260827T095152Z1 条96.7%0.02750.025620260921T005917Z0 条100.0%0.00.020260921T010853Z0 条100.0%0.00.0这次虚高不大最大 0.0275但机制值得记住拒答样本的真实分数是answer_correctness0.1747、faithfulness0.2321一旦被算成拒答即正确均值就被抬起来。同时注意20260827T095152Z归因器判了 4 条 UNKNOWN其中并非拒答的有 4 条——UNKNOWN 和拒答是两个集合别画等号。代码照抄这套归因与回归的判定规则归因的核心是句级支撑度它先切句再做字符 n-gram 重叠def ngram_overlap(a: str, b: str, n: int 2) - float: 字符 n-gram 重合率用于证据链的文本支撑判断。 grams_a _char_ngrams(a, n) grams_b _char_ngrams(b, n) if not grams_a: return 1.0 if a b else 0.0 return len(grams_a grams_b) / len(grams_a)切句这一步直接决定后面所有归因的上限中文标点和列表编号必须一起处理def split_sentences_zh(text: str) - list[str]: 按中文句读切分句子过滤过短片段与列表编号等噪声。 parts re.split(r[。\n]|(?[.!?])\s, text) sentences: list[str] [] for part in parts: cleaned re.sub( r^\s*[\d一二三四五六七八九十][.、):]?\s*, , part ).strip() # 只保留包含汉字/字母/数字的句子过滤 1. 这类编号残片 if cleaned and re.search(r[\u4e00-\u9fffA-Za-z0-9], cleaned): sentences.append(cleaned) return sentences句级支撑度的入口签名如下threshold0.35是默认判定线def sentence_supported( sentence: str, contexts: list[str], threshold: float 0.35而配对回归检测是这套流程里唯一能给出显著/不显著结论的地方def compare_runs( current: dict[str, Any], baseline: dict[str, Any], metrics: list[str], alpha: float 0.05, min_effect_size: float 0.1, min_paired_samples: int 5,注意它同时卡了alpha、min_effect_size和min_paired_samples三个阈值。只卡 p 值不卡效应量在 30 题这种小样本上会频繁把微小差异判成显著只卡效应量不卡样本量则在样本不足时给出过度自信的结论。工程落地CI 该卡什么基于这次四格消融我建议 CI 门禁分两层第一层质量门禁只卡能通过配对检验的指标。具体到这套数据faithfulness20260827T095152Z相对20260827T094242Z是 0.956 → 0.326Cohens dz -2.032p0.000显著退化必须卡。answer_correctness0.816 → 0.393Cohens dz -1.544p0.000显著退化必须卡。context_precision/context_recall两次都是 1.000 → 1.00095%CI [0.000, 0.000]p1.000判无明显变化。这两个指标在当前数据集上已经饱和卡它们不会拦住任何回归。answer_relevancy0.739 → 0.774p0.457判无明显变化。当前分辨率下它不构成有效门禁。第二层延迟门禁必须和质量门禁并列用同一批运行的数据延迟均值从 589.0ms 到 4022.7ms延迟中位从 593.4ms 到 3180.4msP95 从 781.22ms 到 9216.3ms。P95 是最该卡的那个。均值和中位会被长尾稀释P95 从 781.22ms 到 9216.3ms 这种量级变化在均值上只表现为 589.0ms → 4022.7ms容易被人脑读成同一档。另外一条容易漏的把归因分布当门禁会误伤。20260827T095152Z的规则归因报了 22 条 HALLUCINATION复核后推翻 11 条20260921T010853Z报了 7 条 HALLUCINATION复核推翻 10 条、确认 0 条。如果 CI 直接卡HALLUCINATION 数量 N你会被规则归因器的假阳性反复打断。正确做法是规则归因只产出待复核队列CI 门禁看复核后的确认数。边界与不适用场景这套结论有明确的适用范围越界会得出错误答案。第一延迟门禁的阈值不能跨场景复制。这次数据全部来自本地 RAG 场景被测系统延迟量级在 589.0ms 到 4022.7ms 之间。离线批处理、非实时链路里P95 到 9216.3ms 是可以接受的此时只卡质量指标是合理的。但线上问答链路必须把延迟和 nDCG 类质量指标一起卡——因为用户感知到的失败模式里超时和答错是同一种失败。第二context_precision/context_recall全 1.0 是这份数据集的特性不是普适规律。30 题、hash1385126cffea粒度偏粗指标饱和。换更大、更难的数据集这两个指标会重新有区分度那时它们应该重新进入门禁。第三2x2 消融只在两个旋钮上成立。top_k和prompt_style的交互项faithfulness 0.3425、answer_correctness 0.2383已经说明它们不独立。再加第三个旋钮比如 chunk 参数、embedding 模型就必须扩成更高阶的设计不能继续用单变量配对对比做归因。第四拒答口径这件事必须每次重算。这次四格里只有20260827T095152Z识别出 1 条拒答虚高 0.0275 / 0.0256其余三格虚高都是 0.0。样本一换这个偏差可能完全不同。把拒答算对当成默认口径等于给自己埋一个随时会变大的偏差。最后回到那个最容易被忽略的点如果你只印质量指标20260827T094242Z和20260827T095152Z在 context_precision、context_recall 上完全一样faithfulness 差了 -0.6299 你还能看见但延迟差了近 7 倍均值 589.0ms vs 4022.7msP95 781.22ms vs 9216.3ms你完全看不见。上线后你会在超时告警里第一次见到它。想要一份免费质量体检把你的测试集或评测脚本发我我按上面的指标跑一遍告诉你哪几项其实是假通过。私信我。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

聚水潭开放平台接入:从注册开发者到调通第一个接口(附官方签名算例) 2026/9/28 18:53:44

聚水潭开放平台接入:从注册开发者到调通第一个接口(附官方签名算例)

目录一、先说结论二、注册和资质认证2.1 注册2.2 资质认证:只能用企业三、创建应用:服务商还是自有商城四、申请接口权限五、测试环境:先在沙箱里跑通六、调第一个接口6.1 公共参数6.2 签名规则6.3 用官方算例验证你的签名6.4 第一个请求&…

阅读更多 →
Oracle考试总结:用TaoToken统一Key跑通OCP题库环境配置 2026/9/28 18:53:44

Oracle考试总结:用TaoToken统一Key跑通OCP题库环境配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
GitHub 46k Star 的 Claude Code 最佳实践开源了:TaoToken 统一 Key 接入配置骨架 2026/9/28 18:53:44

GitHub 46k Star 的 Claude Code 最佳实践开源了:TaoToken 统一 Key 接入配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
PCIe Gen6点亮实战:17道硬关与系统级稳定性指南 2026/9/28 18:53:37

PCIe Gen6点亮实战:17道硬关与系统级稳定性指南

1. 一张 PCIe Gen6 卡,从点亮到稳定,到底要过多少关?你手头刚拿到一块标着“PCIe Gen6 Ready”的加速卡,插进主板,按下电源——风扇转了,LED亮了,但系统 BIOS 里压根没识别到设备;或…

阅读更多 →
JVM跨平台与JIT即时编译:Java如何从字节码到机器码实现越跑越快 2026/9/28 18:53:37

JVM跨平台与JIT即时编译:Java如何从字节码到机器码实现越跑越快

2. 从源码到机器码:所谓"跨平台"其实是三层翻译的功劳面试Java岗位的时候,十有八九会被问到这个问题:JVM为什么能跨平台?标准答案谁都能背——"Java编译一次,到处运行",源码编译成字节…

阅读更多 →
一体化关节模组设计:从选型到热管理及可靠性实战 2026/9/28 18:53:37

一体化关节模组设计:从选型到热管理及可靠性实战

1. 一体化关节模组到底在解决什么问题第一次接触一体化关节模组的人,脑子里冒出来的画面通常是“电机加减速器拧在一起”。这个理解不算错,但只看到了壳子。真正做过机器人本体设计的人都知道,关节模组是把电机、减速器、编码器、驱动器、制动…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉