企业知识库RAG怎么验收 从检索到答案的四层检查
把文档上传进知识库,再问一个示例问题,通常只能证明演示链路可以运行。企业知识库真正难验收的地方,是资料更新、权限变化和问题没有答案时,系统还能否给出可信的结果。 ## 第一层检查资料是否可用 先选一组有代表性的文档,记录文件版本、负责人和生效时间。表格、扫描件、跨页条款需要检查解析结果。正文丢失时,后面换检索模型或换提示词都不能补回缺失内容。旧制度与新制度也要有明确的替换关系。 ## 第二层检查检索是否找到依据 对每个测试问题,人工标注应找到的文档和段落,再查看系统实际取回的材料。检查同义问法、产品简称和编号查询。答案错时先区分“没有找到资料”与“找到资料却解释错”,这两类问题需要不同的修复方式。 ## 第三层检查权限与引用 用普通员工和负责人两类账号提问,确认越权材料不会进入检索上下文,也不会通过引用标题泄露。答案应标明支持结论的出处;只在文末挂几个链接,却无法对应关键判断,仍然不方便核验。权限收回后,还要检查缓存和历史入口。 ## 第四层检查未知问题和更新 准备知识库没有答案、资料冲突和前提错误的问题,检查系统是否承认信息不足。更新一份文档后重跑同一组测试,验证旧内容不会继续作为现行规则回答。验收报告分别记录检索问题、生成问题和业务判断问题,让后续维护有明确落点。 ## 用最小程序检查文档级结果 下面的独立Python示例检查人工标注与取回文档是否一致,并把越权结果单独报出。它使用教学数据,不运行模型,也不代表真实项目的效果测试。实际项目应把检索结果接入同样的检查,再增加段落相关性、引用正确性和答案人工评价。 ``` from dataclasses import dataclass @dataclass(frozen=True) class Case: name: str expected: frozenset[str] retrieved: frozenset[str] allowed: frozenset[str] # 以下文档编号为教学数据,不对应任何客户或实际检索结果。 cases = [ Case("正常命中", frozenset({"v2"}), frozenset({"v2"}), frozenset({"v2"})), Case("仍返回旧版", frozenset({"v2"}), frozenset({"v1"}), frozenset({"v1", "v2"})), Case("权限泄漏", frozenset(), frozenset({"private"}), frozenset()), Case("未知问题", frozenset(), frozenset(), frozenset()), ] for case in cases: # 将权限泄漏与内容缺失分开报告,防止汇总分掩盖严重问题。 leaked = case.retrieved - case.allowed missed = case.expected - case.retrieved unexpected = case.retrieved - case.expected passed = not (leaked or missed or unexpected) print(case.name, {"通过": passed, "越权": sorted(leaked), "漏检": sorted(missed), "额外结果": sorted(unexpected)}) ``` 示例中“正常命中”和“未知问题”通过;“仍返回旧版”报告漏检v2,“权限泄漏”报告private越权。这里对额外文档采用严格比较,便于展示;真实任务应按问题定义可接受证据集合,不能把所有相关补充资料都判错。 本文由AI辅助创作。