第 16 / 21 篇

第15章 检索评估必须包括负例与权限

如果评估只收集系统能回答的问题,模型很容易显得无所不能。企业知识库还必须面对不存在的事实、无权访问的文档、旧版本和错误租户。它们不是正例召回的附属指标,而是系统是否会在不该输出时停下来的证据。

固定比较单位

本书语料八篇,查询十三条,其中十条有相关文档、三条没有当前上下文可用的相关文档。评估固定为 acme/alice,每次搜索最多十个片段,按文档编号去重后只保留前三篇。当前每条正例只有一篇标注相关文档。

Recall@3 计算前三篇覆盖相关文档的比例,MRR@3 使用第一个相关文档名次的倒数,找不到记零,最后仅在十条正例上求平均。三条负例不被当成“零相关文档所以召回满分”,而是单列空候选次数。

表示方式 模式 Recall@3 MRR@3 负例空候选
词项计数 词面 0.9 0.9 3/3
词项计数 向量 0.9 0.9 3/3
词项计数 混合 0.9 0.9 3/3
量化 BGE 词面 0.9 0.9 3/3
量化 BGE 向量 1.0 1.0 3/3
量化 BGE 混合 1.0 1.0 3/3

所有模式都开启标题规则重排。量化 BGE 模式下的词面通道仍然只使用 FTS5;表格把它保留下来,是为了让比较条件透明。

一分差异来自哪条查询

两个表示方案的差异集中在 q07,同义表达没有共享足够词项,模型向量却返回了住宿规定。只有十条正例,命中一条就改变零点一,所以不能把这个差值描述成稳定业务提升。报告逐条保存排名,让读者能发现总体变化究竟由几条样例贡献。

三条负例分别搜索当前用户无权读取的合成标记、其他租户标记和无关词串。权限断言还检查所有命中的租户及已知私有文档编号,违反时直接中止评估。报告中的 access_violations=0 表示这些断言全部通过,没有覆盖任意文档权限组合或未知攻击类型。

静态排序不能替代生命周期测试

评估报告在初始语料上计算相关性。政策从三十天变十四天、撤权、删除和重放属于另一组状态变化,由演示和单元测试验证。不能因为静态 Recall@3 满分,就宣称新版本不会残留或权限缓存一定安全。

同样,负例空候选是本书的拒答代理:没有候选,摘录函数便无法形成证据。它没有评估生成模型是否会在空上下文中编造答案,因为本书根本没有生成模型。将来接入 LLM 后,需要另测回答层的事实支持与拒答行为。

扩充评估的正确方向

真实业务应增加跨时间独立测试集、多个相关来源、难负例、同名制度、不同权限角色和撤权后的缓存查询。标签说明应写清文档相关还是片段足以回答,必要时由独立人员复核。调过阈值的查询不应继续冒充从未见过的验收样本。

当前数据全部由作者构造,没有做总体统计推断,也没有模型排行榜意义。把这些限制留在报告里,能够防止未来换了标题以后,教学样例被误用成商业效果证明。一个可解释的小结果,比一个没有边界的大数字更适合指导下一次实验。