赛博私塾CYBER SISHU
BADCASE GALLERY

Badcase 展柜

评估的价值不在均值,在失败样本。这里陈列 48 条全量评测挖出的三个高价值 badcase: 一个是评估指标自己的缺陷,一个是比编公式更隐蔽的推理幻觉,一个是检索层埋、生成层背锅的盲区。 每个 case 按同一格式陈列——问题 / 期望 / 实际 / 根因定位到具体层——可复现、可证伪。

CASE 01 · s1 / t3 / t4(成批复现)指标缺陷0%CASE 02 · t6推理幻觉33%CASE 03 · f11 / q11(成批复现)检索盲区0%
指标缺陷CASE 01 · s1 / t3 / t4(成批复现)faith 0%正确行为 · 被判 0 分
问题
系统的分片策略是什么?chunk_size 和 overlap 各多少?为什么要有重叠?
期望
正确行为 = 拒答。知识库只收录了消费信贷业务文档和 README,不含系统内部实现细节的完整描述,检索不到相关 chunk 时,模型应当说「资料里没有」。
出题依据:eval_dataset.json s1(README 有技术点但语料库未收录对应文档)
实际
「根据现有资料无法回答关于系统的分片策略、chunk_size 和 overlap 的具体数值。资料中并未提供……建议查阅相关技术文档或直接咨询系统开发者。」
这是教科书级的正确拒答:明确说没资料、不编造、给出可行建议。s 组 11 条几乎全部如此。
声明级判定 · NLI 逐条溯源
  • – neutral现有资料无法回答关于系统的分片策略的具体数值
  • – neutral资料中未提供关于系统分片策略的详细信息
  • – neutral如果有关于系统分片策略的具体问题,建议查阅相关技术文档
  • – neutral建议直接咨询系统开发者
根因 · 定位到层
检索✕ 出事层知识库不含系统设计文档,召回为空或不相关
生成✓ 无责守住了知识边界,正确拒答
评估✕ 出事层faithfulness 对拒答声明结构性记 0 分

faithfulness 的语义是「回答中的每条声明是否被检索上下文支持」。拒答声明的形式是「资料里没有 X」——上下文里当然「没有」,所以 NLI 全判 neutral,得分归零。指标把「承认不知道」和「编造」压成了同一个 0 分。这就是 s 组均值 2% 的真相:11 条里大部分是正确行为被误判。

复盘修复方向不是改模型,是改评估:拒答类样本需要单独的 refusal-accuracy 维度(拒答率 × 拒答正确率),和 faithfulness 分开统计。把这个坑公开展示出来,比藏一个虚高的均值有说服力——评估层自己也会犯错,这本身就是 RAGAS 四指标边界的第一手案例。
推理幻觉CASE 02 · t6faith 33%危险:结论与硬规则相反
问题
小明 22 岁,内部评分 720 分,在白名单核心企业干了 3 年公积金也满 24 个月,他想借 30 万买理财,能批吗?
期望
不能批。准入规则引擎是硬规则一票否决:R008 用途合规——「借款用途声明不涉及购房、投资、理财、虚拟货币」。用途涉理财,直接拒件,不进入评分环节,前面年龄/评分/白名单条件再漂亮也没用。
出题依据:data/products/信贷政策与风控规则.md · 准入规则引擎 R008(硬规则,一票否决)
实际
「1. 符合年龄条件……2. 内部信用评分满足条件……3. 符合白名单准入规则……综合以上条件,小明可以申请贷款购买理财。」 (末尾补了一句「如果借款用途为购房、投资、理财等可能涉及违规」,但结论已经先给出了)
比 q3 那种编公式更隐蔽:每一项子判断单看都对,推理链也通,唯独把「逐条通过的准入条件」错当成了「放款结论」——一票否决规则被放进了备注而不是判决。
声明级判定 · NLI 逐条溯源
  • ✓ supported小明年龄22岁,满足『22-55周岁』要求
  • – neutral内部信用评分达到720分,超过优享版白名单要求的>=700分
  • – neutral连续缴存公积金满24个月,满足优享版白名单条件
  • – neutral小明可以申请贷款购买理财
  • – neutral若借款用途为购房、投资、理财之外的其他用途,该申请可能会被批准
根因 · 定位到层
检索✓ 无责规则文档已召回,证据在手
生成✕ 出事层顺向逐条推理,跳过了一票否决检查
评估✕ 出事层33% 分数偏低但『方向性错误』没有被显式捕获

检索层把「准入规则表」和「优享版白名单条件」都召回了(评分 33% 说明部分声明有据),但生成层做的是「逐条件 AND」的顺向推理,没有先扫一票否决项。硬规则决策的正确逻辑是「先查否决清单再谈资格」——这是推理顺序错误,不是知识缺失。faithfulness 只能标出哪几条声明无据,抓不住「结论与资料中的硬规则直接矛盾」这种语义级错误。

复盘这类 badcase 是 NLI 防幻觉兜不住的:每条声明几乎都能在上下文里找到影子,错在组合逻辑。修复要靠决策类问题的规则前置——prompt 里显式要求「先核对一票否决清单」,或者对含硬规则的领域加一层规则引擎校验。信贷风控场景里,这种幻觉的代价是直接的资金损失,也是面试里最能讲出深度的一个案例。
检索盲区CASE 03 · f11 / q11(成批复现)faith 0%答得出的问题 · 被迫拒答
问题
结清证明怎么开?多久能拿到?
期望
全部结清后在 App「我的-借款记录」申请电子结清证明,一般 1 个工作日内生成;纸质证明联系客服邮寄,收取工本费 20 元。
出题依据:data/products/还款与逾期FAQ.md · Q12(知识库里白纸黑字写着)
实际
「根据现有资料无法回答关于结清证明的开具和领取时间的问题。参考资料中未提供相关信息。建议您直接联系信消贷客服或访问其官方网站获取相关信息。」
知识库里明明有完整答案,模型却「诚实地拒答了本可回答的问题」。同批 q11(标准版资金能否炒股——文档明确写着不得用于购房炒股理财投资)同样中招:faithfulness 0%。
声明级判定 · NLI 逐条溯源
  • – neutral无法回答关于结清证明的开具和领取时间的问题
  • – neutral参考资料中未提供相关信息
  • – neutral建议您直接联系信消贷客服
  • – neutral建议您访问信消贷官方网站
根因 · 定位到层
检索✕ 出事层mock 向量无语义,BM25 单腿召回漏检目标 chunk
生成✓ 无责上下文为空 → 按设计拒答,行为正确
评估✕ 出事层0% 分数把锅甩给了生成层,真凶在检索层

当前 embedding provider 是 mock(无 key 的降级模式):向量无语义,语义召回整条腿是瘸的,只剩 BM25 关键词单腿走路。「结清证明」四个字若与 chunk 分词/加权重合度不够,这个 chunk 就进不了上下文。这是检索层失败被生成层的「诚实」掩盖了——模型行为无可指摘,用户拿到的却是错误的服务质量。对照实验(s5)已经证明 BM25 能补一部分盲区,但补不全。

复盘这张 case 是「为什么需要 Hybrid 检索 + 真实 embedding」的最好数据证据——不是我跟你讲概念,是 48 条评测里实打实的漏检清单。也提醒一个工程直觉:faithfulness 低分先别急着骂模型,把召回 chunk 拉出来看一眼,锅经常在检索。接真实 embedding(text-embedding-3 / bge-small-zh)后这批样本是第一组回归验证对象。

证据原始出处:rag-finance-qa 仓库 docs/spot_check.txt(声明级明细)与 docs/eval_full_48.txt(全量 48 条)。 知识库为脱敏后的虚构消费信贷产品文档,仅用于 RAG 评测。