让答案"可核对",而不是"听起来对"
生成式回答最大的问题是无法核对:句子通顺、语气自信,但你不知道它依据什么。
解法是让检索与生成之间多一层显式的证据表:先把片段整理成结构化事实,再基于事实写答案。
证据表长什么样
每条一行,字段固定:
| 字段 | 说明 |
|---|---|
| 事实 | 一句话陈述(不含推断) |
| 来源 | 文档标题 + 章节/页码 |
| 原文片段 | 支撑该事实的原话(截断到 80~120 字) |
| 时间 | 该文档的发布日期 |
| 置信 | 高 / 中 / 低(人工或规则给的) |
这张表是纯抽取产物,不允许出现"因此""说明"这类推断词。
三步流程
- 抽取:从检索到的片段里抽出事实,逐条附原文与出处;抽不出就写"未找到相关事实";
- 校验:程序检查每条事实的原文片段确实出现在该来源片段中(子串比对),不通过就丢弃;
- 成文:只允许基于证据表写答案,每条结论标注引用编号;证据表里没有的,不许写。
三个直接收益
- 可核对:用户能点开引用看到原话;
- 可评测:事实错误率、引用一致性都能自动算(引用编号与事实是否对得上);
- 可降级:证据表为空时,明确回"资料里没有提及",而不是让模型编。
常见错误
- 把推断写进证据表("这说明 X 已经失败")→ 后面所有结论都建立在推断上;
- 引用不核对(引用编号乱标)→ 必须做子串级校验,别只看编号存在;
- 证据表太长(几十条)→ 用户不看、模型也读不完;按相关度截断(例如前 8 条);
- 只给结论不给原文 → 等于回到"听起来对"。
落地顺序
- 先做抽取 + 子串校验(这两步就能显著降低编造);
- 再把引用编号写进答案模板;
- 最后做"证据表为空时的明确回复"与引用一致性指标。