用「跨查询一致性」筛掉噪声幻觉:CQC-RAG 评注

  • 关联论文:2606.13438
  • 作者:flyP
  • 更新:2026-07-21

一句话结论

本文提出 CQC-RAG:把原问题改写成多个同义不同形的查询、分别检索后看答案的「置信度稳定性」,不依赖外部监督、不要求扩大检索覆盖面,就能把检索噪声诱发的幻觉过滤掉,在 TriviaQA 和 MuSiQue 上相对最强多查询基线分别 +4.76 pp 和 +9.12 pp EM。

解决的真问题

RAG 系统在落地时普遍栽在两件事上:

  1. 同一语义多种问法,检索结果却天差地别——提问者把「谁创立了 X 公司」换成「X 公司的创始人是」,向量库返回的 top-k 文档能完全不同,下游 LLM 答案也跟着抖。
  2. 检索里混入的无关或误导文档直接诱导幻觉——LLM 很难独立判断「这段证据可靠吗」,一旦被带偏,输出就开始幻觉。

现有「多路径推理」方案(self-consistency、multi-query RAG 等)已经在多路采样 + 投票/置信度选择上有进展,但它们仍有两块没盖住:

  • 多样性来源不稳定:往往靠解码随机性或简单查询改写,无法保证生成的多条 query 真的「语义等价、表面不同」。
  • 评估只在单一证据视图下进行:投票时各路答案用的还是各自 query 召回的证据,相当于「各说各话,没在同一坐标系比较」。

核心假设:跨查询一致性

作者提出 Cross-Query Consistency Hypothesis

正确答案在多个语义等价但句式不同的 query 下,置信度都稳定偏高;而被噪声诱导的错误答案,在 query 形式变化下置信度会剧烈抖动。

这个假设把「幻觉」重新定义为 「置信度不稳定」的副产品,而不是「置信度低」或「事实错误」。这是个值得记下的视角切换。

CQC-RAG 框架:四步流水线

CQC-RAG 是个协同设计(co-design)的方案:query 级多样性 + 跨 query 一致性评估一体设计。

步骤 1 — Query 级多样性注入

把原问题 $q$ 改写成 $K$ 个「语义等价但句式多样」的查询 ${q_1, q_2, \dots, q_K}$。

论文强调这里不是简单 paraphrase:要让结构、词序、表述角度都发生变化,否则多样性不够,下游评估信号会糊掉。

步骤 2 — 共享文档池上的 query-条件重排

对所有 $q_i$ 共享同一文档池 $D$,但分别做 query-conditioned 上下文构建:

$$ C_i = \text{Rerank}(D, q_i)[: k] $$

这一步的关键是不依赖扩大检索覆盖面——同一批文档进多路,差异化来自「query 视角」,不是「文档池更大」。

步骤 3 — 证据接地:抽取「答案-证据」对

对每路 $(q_i, C_i)$,用一个 evidence-grounded protocol 抽取:

$$ (a_i, e_i) = \text{Extract}(q_i, C_i) $$

其中 $a_i$ 是候选答案,$e_i$ 是支撑该答案的具体证据段落。这避免「直接 LLM 答题」带来的答案与证据脱钩。

步骤 4 — 跨查询置信度稳定性选择

对所有候选答案 $a_i$ 计算在多路上下文下的置信度稳定性

$$ S(a) = \text{stability}\big(\text{conf}(a \mid q_1, C_1), \dots, \text{conf}(a \mid q_K, C_K)\big) $$

最终选 $S$ 最高的答案作为输出。直觉上:

  • 正确答案:每路 query 召回的证据都指向同一个事实 → 置信度齐刷刷高。
  • 噪声诱导的幻觉:只有某一路 query 偶然召回相关文档,其他路召回的是噪声 → 置信度随 query 抖动 → 被筛掉。

伪代码:

D       = retrieve_corpus(q)              # 共享文档池
queries = [q1, ..., qK] = rewrite(q)       # 语义等价改写

answers = []
for qi in queries:
    Ci   = rerank(D, qi)[:k]
    ai, ei = grounded_extract(qi, Ci)     # 证据接地
    answers.append((ai, ei))

final = select_by_cross_query_stability(answers)

关键实验与数据

在四个开放域 QA benchmark 上评估:

Benchmark 基线(最强多查询) CQC-RAG Δ
TriviaQA EM 基准 +4.76 pp +4.76 pp
MuSiQue EM 基准 +9.12 pp +9.12 pp
其他两个 benchmark 论文未在 abstract 给出具体数字,原文未明确

MuSiQue 是多跳 QA 专门集,提升更显著这件事很说明问题——跨查询一致性假设在多跳场景下收益更大,因为多跳问题天然依赖多个证据片段能否被稳定召回。

注:完整对比表(含 PopQA、NQ 等其他 benchmark)见论文 v1 HTML,本文依公开 abstract 整理。

与现有工作的差异

  • vs Self-RAG / Corrective-RAG:后者在「单一 query 视角下」做后过滤;CQC-RAG 强调多 query 视角下的置信度稳定性
  • vs Self-Consistency / Multi-Path:后者靠 LLM 解码多样性 + 投票;本文靠 query 改写 + 证据接地 + 稳定性筛选。多样性来源更可控、评估更对齐。
  • vs 多路检索扩展:CQC-RAG 不依赖「召回更多文档」,对检索成本友好。

亮点与局限

亮点

  • 不需外部监督:自评估机制让它不依赖金标答案或人评。
  • 可插拔:改写模型、重排模型、抽取模型都可替换。
  • 检索开销零增量:检索仍是一次(共享文档池),多样性从 query 来。
  • 多跳场景收益明显:对 RAG 实践中真正棘手的多跳任务更友好。
  • 机理清晰:假设一句话能讲清楚,实验又接得住。

局限

  • 依赖改写模型质量:若改写出的 $q_i$ 不够「语义等价」,下游稳定性指标就被污染。
  • 证据接地协议本身的误差:若 Extract 阶段就漏证据或胡编证据,再稳定的置信度也没意义(幻觉从 Extract 模块迁移到选择模块)。
  • 缺乏对单跳场景的清晰边界说明:多跳收益大,但单跳收益是否稳定?abstract 未明确。
  • 未给出 token 成本对比:跨多 query + 重排 + 稳定性筛选显然比单 query 检索贵,原文未明确给出相对开销。
  • 未在大模型级别评估:abstract 没披露基座 LLM 规模。

对工程落地的启发

  • 可立即试点:把 CQC-RAG 当作 query-rewrite 增强包接到现有 RAG 后端,改写 3-5 个查询、在你的现有重排模型上跑稳定性筛选。
  • 多跳客服 / 知识库问答:用 MuSiQue 类思想验业务问题集,预期收益更大。
  • 答案置信度面板:把跨 query 的置信度分布作为 UI 给到用户——用户能看到「这个答案在不同问法下的稳定度」,是天然的可信度信号。
  • 不需要专门训练:纯推理时技巧,不污染现有训练流程。
  • 降本路径:可以早期用小模型做改写、用大模型做最终答案,节省成本。

与同方向工作的关系

  • Self-RAG(2310.11511):单 query 自反思纠错,正交关系可叠加。
  • Corrective-RAG(2401.15884):检索后过滤,更接近 CRAG 的横向工序。
  • Self-Consistency(2203.11171):多路解码 + 投票,多样性来源是采样而非 query 改写。
  • Multi-Query RAG(langchain 标配):本文是其原理化升级。
  • RA-DIT / Retriever-and-LLM 联合训练:与本文思路正交,可叠加。
  • Chain-of-RAG / Iterative RAG(2407.16833):用多步推理扩展证据,方向互补。

适合谁读

  • RAG 应用工程师:想让现有系统在「幻觉率」上有确定改善,又不想引入监督训练成本。
  • 搜索/问答 PM:理解 CQC-RAG 能带来什么工程化改进,以及它的边界。
  • LLM 研究员:做 RAG 鲁棒性 / 幻觉研究的人,把 CQC-RAG 当稳定基线。
  • 多跳 QA 评测者:在 MuSiQUE / HotpotQA 类集合上做 benchmark 的读者。

阅读与落地建议

  • 30 分钟读法:只看 abstract + 算法 1-3 的伪代码。
  • 落地优先级:先在 TriviaQA / 你自己的评测集上跑一遍 5-query 改写版本,看 EM 是否能涨 3-5 pp。
  • 集成点:放在你现有 RAG 的 retriever 后、generator 前即可;需要的能力:query rewriting(可用 LLM 或专门小模型)+ reranker + 答案置信度计算。

典型落地场景

场景 A:企业内外知识问答客服

用户问「我们的 X 产品能否在 Y 场景使用」,同一问题经常被不同业务线的人问得五花八门。如果后端只用单 query 检索,很可能某一路召回出的是误导文档。CQC-RAG 在这种场景下天然合适,因为客服高价值的属性是「错答代价高」,稳定性筛选比多跳要更值钱。

  • 抽 3-5 个改写 query。
  • 共享同一文档池,各自 rerank 得出答案。
  • 多 query 置信度都顶住同一个答案才输出。

场景 B:医疗/法律高风险领域 RAG

医疗和法律领域对错误答案的容忍度极低。CQC-RAG 的「跨 query 稳定性」可以作为置信度展示层:当所有改写 query 都指向同一答案,可信度高;当 query 改写后答案发散,就主动拒答或转人工。

  • 配合答案拒绝机制用:稳定性低于阈值即不回答,转人工坐席。
  • 这种「保守不答」在医疗领域经常是合规要求,比硬给个错答要负责任得多。

场景 C:教育/学习领域的多角度解释

学生问同一个概念,从不同表述、例子、定义角度都要能给出稳定答案。CQC-RAG 提供「同义不同问」框架,正好契合教学场景对「多角度稳定解释」的需求。

  • 工程上把它打包成一个「多角度讲解」产品特性:后台自动改写 3-5 个问法,输出最稳的解释和一组置信度分布,作为学习仪表盘的一部分。

工程实现注意点

  • 改写多样性 vs 语义等价:LLM 在做 query 改写时容易「改过头」——把语义改了。要在 prompt 里明确「保持语义不变,只变句式 / 用词 / 提问角度」。可以加一道轻量 LLM-as-judge 把守,如果改写 query 的语义偏离原 query 太多(比如 embedding cosine 相似度 < 0.85),就丢弃。
  • 重排模型的稳定性:如果重排模型对 query 关键词依赖过强,会把不同改写退化成同一排序,浪费多样性。建议用 cross-encoder 而非仅 embedding-based 重排。
  • 置信度计算的可比性:不同 query 下同一个答案的置信度要可比较,否则「稳定性」指标失效。建议固定输出 logprob 阈值校准,或者用 token 维度的对数概率的平均作为置信度,并统一温度参数。
  • 成本核算:改写 3-5 个 query + 多次重排 + 多次生成,总 token 量翻 3-10 倍,要算 ROI。落地到中等规模客服(每天 1-10 万次问答)一般可承受,到千万级就要做异步批处理。

与现有 RAG 框架的衔接

  • LangChain / LlamaIndex 的 MultiQueryRetriever:是 query 改写 + 多次召回 + 简单合并的轻量版,但不做「跨 query 置信度稳定性选择」,属于 CQC-RAG 的前置组件,可以替换选择策略升级。
  • DSPy:可以编程化地实现「稳定性选择」模块,把 CQC-RAG 的核心思想变成 declarative pipeline,方便自动 prompt 与权重优化。
  • Haystack / LlamaIndex 的 Reranker 组件:可被复用作 query-conditioned rerank,已有跨 query 重排能力。
  • Haystack 的 ConfidenceFilter / FaithfulFilter:把 CQC-RAG 的稳定性分数接入现有过滤器,就能获得「错误拒答」能力。

阅读路线建议

  • 想理解思想:abstract + Cross-Query Consistency Hypothesis 段 + 选择策略。
  • 想做对比:v1 HTML 中的四张实验表 + 附录里改写 query 的样例。
  • 想落地:先在 TriviaQA 上复现 +4.76 pp,再迁移到你自己的评估集。

工程落地与核查(Jay)

事实核查

  • 实验数据对应性:解读中"相对最强多查询基线分别 +4.76 pp 和 +9.12 pp EM"与 abstract 描述一致,来源可靠。
  • MuSiQue 提升更大的推断:"多跳场景收益更大"是合理解读,但原文未明确说这是主要发现,只是数据呈现。存疑处:多跳收益大是"因为多跳问题天然依赖多个证据片段能否被稳定召回"——这是解读的机理推断,原文是否有这一因果链的实证支撑,需查正文。
  • "检索仍是一次":伪代码中 D = retrieve_corpus(q) 是共享文档池,但每路 query 仍需分别 rerank。严格说"检索仍是一次"指的是 initial retrieve,后续每路 rerank 是额外开销。解读表述可能略显简化。
  • 改写质量依赖:原文局限中明确提到了这一点,解读如实呈现,无过度引申。

可读性精修

  • 解读整体流畅,逻辑清晰。术语"evidence-grounded protocol"译为"证据接地协议",为合理中译。
  • 伪代码中 retrieve_corpus(q) 实为 initial retrieval call,命名略显模糊但不影响理解。

工程落地与坑

1. 改写质量是整个 pipeline 的瓶颈

CQC-RAG 的效果上限由 query 改写质量决定。如果改写出的 $q_i$ 不够"语义等价",整个跨查询一致性假设就不成立。实际落地时:

  • LLM-as-judge 过滤是必需的:不要省掉这道工序。推荐用 embedding cosine similarity > 0.85 作为语义等价的阈值。低于这个值的改写 query 要么丢弃、要么让人工审核。
  • 改写数量 K 的选择:K=3~5 是论文暗示的 range。K 太小(<3)稳定性信号不够;K 太大(>7)token 成本线性叠加,收益递减。建议 K=5 作为默认,在置信度面板中展示各路置信度分布,帮助人工判断 K 值是否足够。
  • 温度控制:改写时建议 temperature=0.7~0.9,既要多样性又不能改过头。temperature=0 会让所有改写几乎相同,失去信号意义。

2. 置信度可比性是技术难点

CQC-RAG 的核心是"同一答案在不同 query 上下文下的置信度可比"。但实际实现中:

  • 模型输出的 logprob 不是天然的置信度:同一个答案 "Paris" 在不同 context 下输出的 logprob 不可直接比,因为 token 分布受 context 影响极大。正确做法:让 LLM 输出一个标准化的置信度分数(如"请给出 0~1 的置信度"),或者用 token-level logprob 的归一化版本。
  • 答案归一化:不同 query 可能生成"同一个答案的不同表述"——"法国的首都"和"法國首都"都指向"巴黎"。在计算稳定性前,需要一个答案归一化步骤(如 entity linking 或简单字符串标准化),否则 "Paris" 和 "巴黎" 会被当作两个答案,稳定性计算失效。
  • 多答案共存的情况:有些问题本身就是多答案的("列举所有创始人"),跨 query 出现不同数量的答案时,稳定性指标怎么定义?论文未明确。建议:先确定答案的 cardinality(有几个答案),再在同 cardinality 下比较置信度分布。

3. 证据接地(Evidence-Grounded Extract)模块的误差

Extract 阶段如果漏证据或编造证据(hallucinate within extract),后续的置信度稳定性分析就是在"垃圾输入上建高楼"。这是一个级联误差风险:

  • Extract 输出需做忠实度校验:让 LLM 在 Extract 阶段也输出"evidence 中是否有支撑 a_i 的内容"的二元判断。如果 evidence 不支撑答案,该路直接不参与稳定性计算。
  • Extract 模块本身的幻觉率监控:可以构造一些"已知答案"的问题(如 TriviaQA 里的 factual QA),周期性测 Extract 模块的保真度,作为系统健康度的监控指标。

4. 端到端延迟与成本的权衡

CQC-RAG 比单 query RAG 多了 K 路 rerank + K 路 extract + 稳定性选择。实际落地时:

  • 延迟估算:以 K=5 为例,额外延迟 = K × (rerank latency + extract latency)。如果 rerank 是 50ms、extract 是 200ms,每路 250ms,5 路是 1.25s 额外延迟。加上 initial retrieval 的 100~300ms,总延迟增加约 1.5~2s。对客服场景(用户预期 1~3s)来说需要做异步化改造。
  • 成本估算:改写 K 个 query(每次约 200 tokens) + K 次 rerank(每路约 50 tokens input + 20 tokens output) + K 次 extract(每路约 500 tokens) + 最终生成(约 300 tokens)。单次 CQC-RAG 约消耗单 query RAG 的 3~5 倍 token 成本。建议在产品层设置"触发阈值":只有置信度低于 0.7 的答案才触发 CQC-RAG 重验,高置信度答案直接输出。

5. 与现有 RAG 框架集成的架构陷阱

  • LangChain MultiQueryRetriever 的局限:MultiQueryRetriever 只是简单地把所有 query 的检索结果 union 在一起,不做跨 query 的置信度分析。CQC-RAG 是对它的升级,但架构上不能直接替换,需要把"选择策略"模块插入 retriever 和 generator 之间。
  • DSPy 集成:DSPy 的 COMPILE 机制可以自动优化 CQC-RAG 的 prompt 和权重,但 DSPy 目前对"置信度稳定性"这类自定义指标的支持需要写 custom metric,如果团队没有 DSPy 经验,迁移成本不低。
  • Haystack 生态:Haystack 的 ConfidenceFilter 可以直接消费 CQC-RAG 的稳定性分数,但需要把 stability_score 注入到 document 的 metadata 中,需要 pipeline 的数据流做相应改造。

6. 生产环境的监控指标

上线 CQC-RAG 后,除了常规的 EM / F1,还需要监控:

  • 改写 query 的语义相似度分布:均值应该高(> 0.85)、方差应该低。如果语义相似度均值下降,说明改写模型退化。
  • 答案发散率:各路 query 给出的答案不一致的比率。高发散率(> 50%)说明检索噪声严重或者问题本身不适合当前文档库。
  • 稳定性分数阈值有效性:如果大量答案的稳定性分数刚好在阈值附近(0.4~0.6),说明阈值设置需要调参,或者问题本身就处于"灰色地带",建议设置细粒度的阈值策略而非全局单阈值。

术语表(保留英文):RAG / Retrieval-Augmented Generation / LLM / Cross-Query Consistency / Hallucination / Multi-hop QA / Query Rewriting / Confidence Stability / Reranker / Evidence-Grounded / Self-Evaluation