AI 知识库答错了怎么查?用引用来源、置信度和人工复核搭一套可追踪的纠错流程

最危险的不是 AI 胡说,而是它带着引用胡说。

员工问企业知识库:“试用期员工可以休年假吗?”

系统很快给出答案:

不可以。根据《员工休假管理制度》,试用期员工暂不享受年假。

语言流畅、结论明确,下面甚至附着制度名称。乍一看,这比没有引用的回答可靠得多。

问题是,它引用了案例中的 2022.1 版旧制度。当前有效的 2024.2 版制度已经修改为:“员工在试用期内可按实际工作年限申请年假。”

这类错误比普通幻觉更隐蔽:答案不是没有依据,而是拿错了依据。

此时继续修改提示词,要求模型“认真回答”“不要编造”,通常解决不了根本问题。因为错误可能发生在文档管理、文本切分、检索召回、结果排序、答案生成等任意环节。

真正专业的知识库,不是承诺永远不出错,而是做到:

错误可以被发现、定位、拦截、修正,并且不会反复发生。

下面以一个企业员工制度知识库的教学案例为主线,搭建一套完整的纠错闭环。

提示:案例中的制度内容、版本和编号用于演示排查方法,不代表任何企业的真实人事规定。实际回答应以企业当前有效制度及适用法规为准。

一、AI 答错时,先别急着怪模型

知识库页面最终只显示一段答案,但在这段答案背后,至少经过了以下链路:

用户问题 → Query 改写 → 文档召回 → 结果排序 → 引用选择 → 模型生成 → 置信度计算 → 审核与修正

只看最后的回答,很难知道问题到底出在哪里。

以“试用期员工可以休年假吗”为例,系统中同时存在两份资料:

  • 《员工休假管理制度》2022.1 版:试用期员工暂不享受年假
  • 《员工休假管理制度》2024.2 版:试用期员工可按实际工作年限申请年假

旧版文档中的措辞与用户问题更接近,因此检索相关度更高;新版文件更新时间更近,却在排序中落到了后面。模型没有识别版本冲突,直接采用了第一条结果。

这不是单纯的“模型幻觉”,而是至少包含三个问题:

1. 文档层:旧版本没有归档或下线;

2. 排序层:只考虑语义相关度,没有考虑版本与时效性;

3. 生成层:发现来源冲突后,没有停止回答或提示风险。

图 1:错误答案页面低保真示意

| 页面内容 | 实际问题 | | 结论:试用期员工不能休年假 | 与当前有效制度冲突 | | 引用:《员工休假管理制度》 | 没有显示版本号 | | 引用原文:试用期暂不享受年假 | 来自 2022.1 旧版本 | | 风险提示:无 | 系统没有识别跨版本冲突 |

因此,排查知识库错误时,第一步不是问“模型为什么这么笨”,而是调出这次请求的完整轨迹。

至少要检查以下内容:

  • 用户原始问题是什么;
  • 系统有没有改写 Query;
  • Top-K 召回了哪些片段;
  • 正确资料是否被召回;
  • 召回后排在第几位;
  • 模型实际看到了哪些资料;
  • 最终答案引用了哪一段;
  • 是否存在新旧版本或多来源冲突。
没有完整日志,就没有真正的纠错,只有猜测。

二、先把引用来源做实,让每句话都有证据可查

不少知识库已经支持“显示引用”,但页面上往往只有一个文件名,例如:

来源:《员工休假管理制度》

这还不够。文件名相同,不代表内容和版本相同。

一个合格的引用记录,至少应包含:

  • 文档名称;
  • 文档版本;
  • 更新时间或生效时间;
  • 页码、章节或段落位置;
  • 被引用的原文片段;
  • 检索分数与重排分数;
  • 文档状态,如有效、过期、待确认;
  • 原文链接或内部文档 ID。

图 2:检索追踪页面低保真示意

| 排名 | 文档 | 版本 | 更新时间 | 片段摘要 | 检索分数 | 状态 | |---|---|---|---|---|---:|---| | 1 | 员工休假管理制度 | 2022.1 | 2022 年 | 试用期暂不享受年假 | 0.89 | 已过期 | | 2 | 员工休假管理制度 | 2024.2 | 2024-06-01 | 试用期内可按实际工作年限申请 | 0.86 | 当前有效 | | 3 | 员工入职手册 | 2024.1 | 2024 年 | 年假申请流程 | 0.63 | 当前有效 |

这里的分数仅用于演示字段结构。不同向量模型和检索系统的分数尺度并不相同,不能直接横向比较。

看到这张表,问题已经很清楚:正确资料不是没被找到,而是旧资料排得更靠前。

一个引用要真正支持答案,必须同时满足三个条件:

1. 来源真实:文档确实存在,原文没有被模型改写;

2. 内容支持结论:引用片段能够直接或合理地支撑回答;

3. 版本仍然有效:来源没有过期、废止或被更新版本替代。

四类常见引用错误怎么查

#### 1. 正确资料根本没有召回

检查文档是否成功入库、切分是否破坏语义,以及用户问题是否需要 Query 改写。

#### 2. 正确资料召回了,但排名靠后

检查 Rerank、关键词权重、文档权限、版本权重和时间权重。

#### 3. 引用片段与答案并不一致

这通常发生在生成阶段。模型看到了相关资料,却加入了资料中不存在的推断。

#### 4. 新旧制度同时被召回

不要让模型自己“猜哪个更新”。系统应读取结构化版本字段,优先使用当前有效文档,并将冲突显式记录下来。

更理想的答案展示方式是:

图 3:可追溯答案卡片

结论
根据案例中当前有效的 2024.2 版制度,试用期员工可以按规定申请年假,具体天数仍需结合实际工作年限确认。

>

置信度
0.72,中等置信度

>

引用依据
《员工休假管理制度》2024.2 版,第 3 章第 2 条
“员工在试用期内可按实际工作年限申请年假。”

>

风险提示
系统同时检索到 2022.1 版相反规定,已进入人工复核。

引用最好支持点击查看原文上下文,而不是只展示一条孤立句子。因为制度中的“除外条款”“适用范围”和“生效日期”,往往就在前后段落里。

三、置信度不能让模型自己打分

一种常见做法是继续问模型:

请判断你刚才回答的可信度,并给出 0 到 100 分。

问题在于,模型可能对错误答案同样表现得非常自信。让模型给自己评分,就像让考生自己批卷:可以作为辅助信号,但不能作为唯一标准。

更可靠的置信度应该由多项工程信号共同计算,例如:

  • retrieval_score:召回内容与问题的相关程度;
  • rerank_score:重排模型对相关性的判断;
  • citation_coverage:答案中的关键结论有多少被引用覆盖;
  • source_freshness:来源是否为当前有效版本;
  • conflict_penalty:不同来源之间是否存在冲突;
  • risk_level:问题属于普通咨询还是高风险决策。

教学阶段可以使用一套简化公式:

confidence = (

retrieval_score * 0.30

+ rerank_score * 0.25

+ citation_coverage * 0.25

+ source_freshness * 0.20

- conflict_penalty

)

需要强调:这些权重只是用于理解设计思路,不是通用标准。 实际权重必须根据自己的业务测试集和人工标注进行校准。

有了综合评分后,可以做基础路由:

if high_risk_topic or source_conflict:

route = "human_review"

elif confidence >= 0.80:

route = "answer"

elif confidence >= 0.55:

route = "answer_with_warning"

else:

route = "abstain_or_review"

这些阈值同样只是示例。不要因为 0.80 看起来像“80% 正确率”,就把两者画等号。

置信度不是正确率,而是用于风险分流的工程指标。

医疗、法律、财务、人事制度等问题,还应增加强制规则。例如,即使综合评分较高,只要存在版本冲突、缺少生效日期或涉及员工权益,也可以直接进入人工复核。

可追踪答案的结构化返回

{

"trace_id": "qa_20250308_001",

"question": "试用期员工可以休年假吗?",

"answer": "根据当前制度,试用期员工可以按规定申请年假。",

"confidence": 0.72,

"risk_level": "medium",

"citations": [

{

"document": "员工休假管理制度",

"version": "2024.2",

"updated_at": "2024-06-01",

"section": "第 3 章第 2 条",

"quote": "员工在试用期内可按实际工作年限申请年假。",

"retrieval_score": 0.86

}

],

"conflicts": [

{

"document": "员工休假管理制度",

"version": "2022.1",

"reason": "旧版本规定与当前版本不一致"

}

],

"review_required": true,

"review_reason": "存在跨版本来源冲突"

}

其中最重要的并不是答案文本,而是 trace_id。它像快递单号一样,把一次问答中的检索、生成、审核和修复记录串联起来。

四、把人工复核变成流程,而不是临时救火

很多团队的人工复核方式是:用户投诉后,在群里问一句“谁来看看这个答案”。

这种方式最大的问题不是慢,而是修完没有留下根因,下一次还会继续错。

建议建立统一复核队列,以下请求可以自动进入:

  • 置信度低于业务阈值;
  • 新旧文档或多个来源存在冲突;
  • 没有有效引用;
  • 用户点踩或举报;
  • 命中医疗、法律、财务、人事等高风险主题;
  • 同类问题连续出现错误;
  • 答案包含结论,但引用覆盖不足。

图 4:人工复核队列示意

| Trace ID | 进入原因 | 风险等级 | 当前状态 | 处理人 | | qa_20250308_001 | 跨版本来源冲突 | 高 | 待处理 | 未分配 | | qa_002 | 缺少有效引用 | 中 | 处理中 | 审核员 A | | qa_003 | 用户点踩 | 中 | 已修复 | 审核员 B |

审核人员不能只看到最终答案,还需要看到用户原问题、改写后的检索词、Top-K 片段、文档版本、模型输入、历史修改记录和相似错误。

复核完成后,也不能只把“错误答案”改成“正确答案”,而要标注根因。

| 字段 | 示例 | | Trace ID | qa_20250308_001 | | 错误类型 | 文档版本冲突 | | 用户问题 | 试用期员工可以休年假吗 | | 错误答案 | 不可以 | | 正确依据 | 2024.2 版休假制度 | | 根因 | 旧文档未下线,排序未考虑时效 | | 修复动作 | 旧版本降权并增加版本冲突检测 | | 是否加入回归集 | 是 | | 复核人/时间 | 张三 / 2025-03-08 |

不同根因应对应不同修复动作:

  • 文档过期:归档旧版本,增加生效与失效字段;
  • 切分错误:重新划分 Chunk,保留标题和上下文;
  • 召回失败:调整 Query 改写或增加关键词检索;
  • 排序失败:引入 Rerank、版本权重和时效性权重;
  • 生成偏离:收紧回答规则,要求逐项引用;
  • 资料冲突:交由业务负责人确认唯一有效依据。

修复后,再用“试用期年假”“入职未满一年是否有年假”“转正前能不能申请年假”等相似问题重跑测试。否则,你修复的可能只是一个句子,而不是一类问题。

五、用最小闭环落地,不必先造复杂平台

个人开发者或小团队不需要一开始就建设完整的知识治理后台。先实现以下四步,系统就已经具备基本追踪能力:

1. 每次问答生成唯一 trace_id

2. 保存问题、召回片段、文档版本、答案和引用;

3. 低置信度或来源冲突请求写入审核表;

4. 人工修复后,自动重跑历史错题。

图 5:纠错闭环流程图

用户问题

Query 改写

召回与排序

生成答案与引用

计算置信度、检查来源冲突

├── 风险可接受 → 返回答案

└── 高风险/低置信度 → 人工复核

标注错误根因

修复文档、检索或生成策略

回归测试

更新测试集与规则

用 60 道题建立第一版测试集

如果目前没有历史测试集,可以先整理 60 道真实业务问题:

  • 20 道可直接从制度中找到答案的问题;
  • 15 道不同说法、口语表达或简称问题;
  • 10 道新旧版本冲突问题;
  • 10 道资料中没有明确答案的问题;
  • 5 道必须人工确认的高风险问题。

数字是测试集设计示例,不代表所有业务都应使用相同构成。测试时不要只挑系统容易回答的问题,否则结果没有诊断价值。

优化前后至少记录以下指标:

| 指标 | 优化前 | 优化后 | 说明 | |---|---:|---:|---| | 引用准确率 | 实测填写 | 实测填写 | 引用是否真正支持结论 | | 答案证据覆盖率 | 实测填写 | 实测填写 | 关键结论是否都有证据 | | 无依据回答率 | 实测填写 | 实测填写 | 没有有效资料仍给出结论的比例 | | 来源冲突识别率 | 实测填写 | 实测填写 | 新旧版本冲突是否被识别 | | 人工复核命中率 | 实测填写 | 实测填写 | 进入复核的请求是否确有风险 | | 用户点踩率 | 实测填写 | 实测填写 | 用户明确反馈错误或无帮助 | | 平均错误修复时间 | 实测填写 | 实测填写 | 从发现到完成修复的时间 | | 历史错题回归通过率 | 实测填写 | 实测填写 | 修复后历史错误是否不再出现 |

这里故意不填写“漂亮数字”。指标必须来自实际测试,不能用几个成功案例代替整体结果。

上线前检查清单

  • [ ] 每次请求都有唯一 trace_id
  • [ ] 引用包含文档、版本、位置和原文
  • [ ] 旧文档有明确的失效或归档状态
  • [ ] 答案中的关键结论能够对应到证据
  • [ ] 来源冲突会触发提示或人工审核
  • [ ] 低置信度请求不会强行回答
  • [ ] 审核结果会记录错误根因
  • [ ] 修复后的问题会加入回归测试集
  • [ ] 已使用真实业务问题完成优化前后对比

对企业知识库而言,知道什么时候不该回答,与回答正确同样重要。

从今天开始,先让错误变得可追踪

不要把目标设成“彻底消灭幻觉”。任何模型、任何知识库都有可能出错,区别只在于:错误发生后,你能不能知道它用了哪份资料、在哪个环节偏离,以及应该修文档、修检索还是修生成策略。

最小可行的行动只有三件事:

1. 给每次问答增加 trace_id

2. 返回结构化引用、置信度和审核状态;

3. 用一组真实问题建立回归测试集。

下一步不是继续堆提示词,而是把这些字段接入真实 API 请求。需要接入或对比不同模型接口的读者,可以访问 api.884819.xyz,选定模型后,使用文中的 JSON 模板完成第一轮可追踪问答测试。

8848AI 平台内置 AI 对话功能,用户名和密码即可注册,不需要邮箱验证;国产模型如 Deepseek、千问等可免费使用。平台没有月租和订阅,其他模型采用按量付费方式。

新用户注册即送体验token。

引用、置信度和人工复核解决了“答错后怎么查”,但还有一个更棘手的问题:同一份资料,为什么换一种问法就搜不到?

下一篇将继续拆解知识库的文档切分、Query 改写、混合检索和 Rerank,看看怎样提高召回率,同时避免把看似相关、实际无关的内容硬塞给模型。

本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。

#AI知识库 #RAG #人工智能 #AI教程 #检索增强生成 #企业知识库 #8848AI #大模型应用