跳到主要内容
OSSpark

搜索文章

2608 字
13 分钟

知识库问答为什么只答了一半:沿证据链定位问题

目录

本文是基于虚构制度的教学推演,不是真实线上故障复盘;分数和参数均为示例设定。

同样是漏答,原因可能出现在不同环节#

用户问:“培训环境的账号找谁申请,审批后多久能开通?”系统只回答了申请对象,没有给出时限。

这时增加 TopK 可能有用,也可能完全无效:正确片段可能排在第二名,也可能早已被门槛排除;它甚至可能已经出现在检索列表里,却没有进入最终请求。

只看答案,无法区分这些情况。排查要回到证据经过的路径:资料里有没有这个事实,检索是否取回,输入是否保留,模型是否忠实使用,引用是否支持结论。

001:Spring AI 的 RAG 示意图,上半部为文档解析切分与入库,下半部为检索片段、与问题组成提示并生成回答

图 001:先把资料准备、检索、输入组装和生成分开看。来源:Spring AI:AI Concepts,上游许可为 Apache License 2.0,原图直链引用,未修改。图中是该项目的向量检索方案,本篇排查方法不限定框架,也不要求所有 RAG 都使用向量数据库。

先明确一次回答需要哪些事实#

假设知识库中有三条虚构规则:

片段示例内容适用环境
A向培训负责人提交申请,由培训负责人审批培训
B审批通过后,由管理员在 1 个工作日内开通培训
C向信息安全负责人申请,审批后 3 个工作日内开通生产

这个问题需要 A、B 两条证据。判断回答是否完整,要检查申请对象、审批关系、开通前提、执行角色与时限,而不只是观察答案里有没有数字。

如果问题改成“账号何时自动过期”,三条资料都没有适用的期限依据。此时缺的是原始事实,调大候选数量并不能补出规定。

排查的第一步因此是写出问题需要的事实和预期证据。有了这张对照,后面才能判断某一步到底丢了什么。

正确片段被数量限制排除了#

先构造一个可手工检查的排序。以下分数是教学设定,不是某个 Embedding 模型的真实输出:

片段示例相关分数培训范围检查
C0.990不通过
A0.951通过
B0.848通过

假设先排除范围不匹配的 C,再用 0.50 作门槛,按分数排序,并最多保留前 K 条。输入预算暂时足够。

K 为 1 时,A 入选,B 落选,时限证据缺失。K 改为 2 后,A、B 都能入选。在这个确定的教学规则下,增加 K 修复了证据覆盖。

这里能得出的结论仅限于这组规则。真实系统还可能分别设置初次召回数量、重排候选数量和最终证据数量。先确认自己改的是哪一步的数量,再判断它是否会改变最终输入。

正确片段在比较名次之前就被过滤了#

保持同样的分数,把门槛从 0.50 提高到 0.90。B 的 0.848 低于门槛,已经被排除。此时即使 K 增加到 10,B 也不会重新出现。

漏答现象没有变,修改点却变了:需要检查门槛、编码与查询是否合适,而不能继续只改 K。

002:同样的 A 和 B 分数,在门槛 0.50 且 TopK 为 1 时 B 因数量限制落选,在门槛 0.90 且 TopK 为 2 时 B 因未达门槛被排除

图 002:两种条件都会漏掉 B,但对应的排除原因不同。分数和规则均为本文的教学设定,不能当作真实模型效果或生产参数。依据本文示例自绘。

范围过滤也要检查。如果 B 被错误标成生产环境,或者新版资料被错误的生效条件排除,它同样可能消失。排查日志应记录具体排除原因,不能只留下最终几条候选。

同时,高分 C 不能因为“看起来更相关”就进入培训答案。适用环境与访问权限各有自己的判断依据:即使用户有权阅读生产规则,也不代表这条规则适用于培训问题。不能通过关闭权限控制来追求更高召回。

门槛是否合适,需要对具体编码、计分方式和问题集做验证。本文的 0.50 与 0.90 只用于展示筛选逻辑,不是上线建议。

检索列表里有 B,模型却没读到 B#

候选入选后,还要经过输入组装。应用可能需要在上下文容量内保留任务说明、用户问题、历史消息和资料,因此会给证据分配预算。

如果 B 太长、与其他片段重复,或排在已经占满预算的内容后面,它可能没有进入请求。此时检索页面看起来是对的,模型仍然没有开通时限的依据。

应该检查实际发送的输入,而不是由检索列表推断模型看到了什么。原文中的完整规则是:

审批通过后,由管理员在 1 个工作日内开通。

只留下“1 个工作日内开通”还不够,因为计时前提被删掉了。切片和组装都要检查条件是否完整。按结构切分、调整片段长度、减少重复或补充相邻内容,各有适用情形;Microsoft 的切片说明提供了相关方法,但不能替具体资料决定最佳边界。

003:检索列表中有申请流程 A 和开通时限 B,但 B 因示例中的证据预算没有进入模型输入,最终回答缺少时限

图 003:候选列表、实际输入和回答是三个不同的检查位置。本图仅示意预算排除 B 的一种情形,不代表所有漏答都由预算造成。依据本文虚构案例自绘。

证据完整进入输入,答案仍然写错#

如果请求里已经完整包含 A、B,答案却写成“3 天开通”,排查重点才转向生成与核验。

需要检查任务要求是否明确、是否混入其他环境或旧版本的证据,以及回答中的每个事实能否由对应原文支持。可以改进提示和示例、明确资料不足时的处理,也可以检查并拦下不满足要求的输出,但不能用“提示写得更严格了”代替复测。

引用也要单独查。回答可能引用 A,却给出了 A 从未规定的时限。带了出处不等于出处支持答案。ALCE 研究把流畅性、正确性和引用质量分别评价,这一划分也提示我们不要把“有引用”直接当成“已答对”。

把四个检查点分开记录#

检查点应保留什么本例要核对什么
原始资料与版本生效正文、来源位置、范围及权限条件B 是否存在,是否为培训环境的当前规则
候选与筛选候选 ID、分数、顺序、排除原因B 是未召回、低于门槛,还是数量限制落选
最终输入实际发送的资料正文与必要条件B 是否完整进入,审批前提有没有丢失
输出与引用回答、事实对应的证据、缺失处理时限是否忠实于 B,引用是否真的支持结论

这些是诊断需要的信息,不意味着应该把所有内部资料长期写入日志。记录范围、可见权限和保留期限仍需按实际数据要求处理。

沿着这些记录,可以把一次漏答定位成具体问题:

flowchart TD
Q[回答缺少时限] --> D{有效资料有时限吗}
D -->|没有| N[说明缺失并确认资料]
D -->|有| R{正确片段被取回了吗}
R -->|没有| F[检查解析 切片 编码与检索]
R -->|取回了| S{筛选后仍被保留吗}
S -->|没有| K[检查范围 门槛与数量限制]
S -->|保留了| I{完整进入模型输入了吗}
I -->|没有| B[检查预算 去重与组装]
I -->|进入了| G[检查生成偏离与引用支持]
图 004:沿资料、检索、筛选、实际输入和生成逐步定位缺失证据,不只根据最终答案判断原因。

修改之后,用同一组问题确认变化#

本文建议先固定问题、资料版本、条件和配置,留存修改前的证据与回答,再围绕已定位的原因做一次调整。

如果增加 K 后,A、B 都进入输入,这是证据覆盖的变化;如果回答也正确保留申请对象和时限,才进一步说明本题的答案得到了改善。两个结果应分别检查。

复测还应包括原本正确的问题、不同环境的干扰问题,以及资料没有答案的问题。降低门槛可能让 B 回来,也可能让无关片段进入;修好一个漏答,不代表整套问答都变好了。速度与成本需要另外测量,不能由回答是否顺畅推断。

知识库问答的漏答,常常要沿不同环节逐项排除。把失败定位到“哪条证据在哪一步丢失或被误用”,才能知道下一次该改什么,以及修改后该验证什么。

参考资料#