Grounded-Generation-RAG

上下文里已有正确段落,模型仍会编造统计或把条件写丢。根因是生成目标没有「必须被证据蕴含」的约束。本方法先证据后结论,并用 Faithfulness/NLI 过滤。检索为空时应拒答,而不是靠模型补全。

本文属于 RAG 工程框架中的「4 生成与智能体编排」环节,聚焦「Grounded Generation(证据绑定生成)」方法。

定位

维度 内容
角色 生成侧的证据约束
输入 → 输出 query + ctx → 仅含被支持 claim 的答案(否则拒答)
默认组合 RAGAS Faithfulness + 生成后 NLI
何时不用 必须靠工具计算、ctx 本来就不该回答的题

核心机制

$$
\mathrm{Faithfulness}=\frac{|{c_i:\mathrm{supported}(c_i,\mathrm{ctx})}|}{|C|}
$$

实现路径与心智:提示强制先贴证据再写结论,生成后用 NLI/Faithfulness 过滤或重写无支撑 claim。底层心智:模型输出是待检验假说,不是事实。上下文为空应拒答。

优缺点

  • 优点:降幻觉。
  • 缺点:过严会拒答正确的同义改写。

契约与走通样例

输入

1
{"query": "siRNA 浓度?", "ctx": "20 nM siRNA targeting GAPDH for 48 h"}

中间量

草稿「20 nM,24 h」:浓度支持、时程不支持。过滤后只保留 20 nM,时程删除或改写为未知。Faithfulness 从 $0.5$ 到 $1.0$。

输出

1
{"answer": "20 nM siRNA targeting GAPDH.", "unsupported_dropped": ["24 h"]}

社区实现

RAGAS Faithfulness;TruLens groundedness。风险:LLM-judge 不锁温度则门禁抖动。

工程落地

最小可运行示例

复制为 .py 后直接运行(仅标准库)。教学用字面蕴含;生产换成 RAGAS Faithfulness / NLI 模型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
"""先草拟再按证据过滤 claim;空上下文或全不支持则拒答。"""
from __future__ import annotations

import re


def split_claims(draft: str) -> list[str]:
"""抽出带数字的原子命题。"""
return re.findall(r"\d+\s*(?:nM|h)", draft)


def entailed(claim: str, evidence: str) -> bool:
"""字面包含判定。生产:entailment.holds(claim, evidence)。"""
return claim.lower() in evidence.lower()


def grounded_generate(query: str, evidence: str, draft: str) -> str:
"""输入证据与草稿;输出仅含被支持 claim 的答案,否则 refuse。"""
del query
if not evidence.strip():
return "refuse"
kept = [c for c in split_claims(draft) if entailed(c, evidence)]
return "; ".join(kept) if kept else "refuse"


if __name__ == "__main__":
ctx = "20 nM siRNA targeting GAPDH for 48 h"
print(grounded_generate("siRNA 浓度?", ctx, "20 nM, 24 h"))
print(grounded_generate("siRNA 浓度?", "", "20 nM"))

参数

参数 起点 影响
NLI 阈值 偏严 过严误杀同义
空 ctx 拒答 禁止补全

失效—信号—螺丝

  • 有证据仍编造:螺丝:后置 NLI,不通过则重写。
  • 同义被杀:螺丝:调阈值或加领域同义。
  • 空检索仍作答:螺丝:短路拒答。

规模(100 篇生物学 PDF)

附加 NLI GPU 4–8 GB。每问 +0.5–3 s

-------------本文结束感谢您的阅读-------------