纠错型 RAG(Corrective RAG, CRAG):检索结果的自评估与外部补救检索
2026/9/4 21:20:44 网站建设 项目流程

纠错型 RAG(Corrective RAG, CRAG):检索结果的自评估与外部补救检索

在传统的 RAG(检索增强生成)架构中,系统始终存在一个盲目的假设:“只要向量库返回了 Top-K 的文档,这些文档就一定是相关的、正确的,直接拼进 Prompt 即可”。

然而在真实的生产环境中,检索器(Retriever)经常会返回低质量甚至是彻底错误的结果:

  • 语义漂移(Semantic Drift):用户提问了一个极冷门的技术名词,向量库由于缺少精准文档,强行拉出了几个高余弦相似度但实际风马牛不相及的废弃段落;
  • 过时事实与信息缺失(Stale / Missing Info):私有知识库里根本没有收录该新发布的产品政策或最新的行业资讯。

如果大模型直接基于这些错误的、无关的文档进行生成,就会产生极其自信的“依据噪音胡编乱造(Hallucination on Noise)”。

Corrective RAG(CRAG,纠错型 RAG)彻底打破了对检索结果的盲目信任。它在检索与最终生成之间,插入了一个独立的“检索质量自评估器(Retrieval Evaluator)”,根据评估置信度动态决定:是直接使用、提纯修正、还是触发外部搜索引擎(Web Search)进行跨源补救检索

一、CRAG 的核心决策流拓扑模型

[ 用户 Query ] ──► [ 私有向量库检索 (Internal Retrieval) ] │ ▼ ┌────────────────────────────────────────────────────────┐ │ 检索评估器 (Retrieval Evaluator / Self-Correction) │ │ 计算检索文档切片与 Query 的综合相关度置信度 │ └──────────────────────────────┬─────────────────────────┘ │ ┌────────────────────────┼────────────────────────┐ ▼ (置信度高 Correct) ▼ (置信度低 Incorrect) ▼ (置信度模糊 Ambiguous) ┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐ │ 模式 1: 知识提纯 │ │ 模式 2: 外部补救检索 │ │ 模式 3: 混合交叉融合 │ │ (Knowledge Refinement│ │ (Web Search Fallback)│ │ (Hybrid Fusion) │ │ 剔除冗余段落直接生成) │ │ 丢弃内部噪音,搜外网)│ │ 合并内外源互补证据) │ └──────────┬───────────┘ └──────────┬───────────┘ └──────────┬───────────┘ │ │ │ └────────────────────────┼────────────────────────┘ ▼ [ 送入大模型生成高保真回答 ]

二、生产级 CRAG 调度器的 Python 实现

from typing import List, Dict, Any, Literal from pydantic import BaseModel, Field class EvaluatedDocument(BaseModel): content: str relevance_grade: Literal["CORRECT", "INCORRECT", "AMBIGUOUS"] score: float class CorrectiveRAGEngine: def __init__(self, internal_vector_store, web_search_tool, llm_client): self.vector_store = internal_vector_store self.web_search = web_search_tool self.llm = llm_client def answer_query(self, query: str) -> str: # 1. 内部向量检索 internal_docs = self.vector_store.similarity_search(query, k=4) # 2. 检索质量自评估 (Retrieval Evaluation) eval_results = self._evaluate_documents(query, internal_docs) # 统计各置信度数量 correct_docs = [d.content for d in eval_results if d.relevance_grade == "CORRECT"] ambiguous_docs = [d.content for d in eval_results if d.relevance_grade == "AMBIGUOUS"] has_correct = len(correct_docs) > 0 final_context = "" # 3. 动态分支裁决 if has_correct and len(ambiguous_docs) == 0: # 分支 A:内部知识高度可信,提纯后直接生成 print("【CRAG 判决】内部知识库完全命中,执行知识提纯") final_context = self._refine_knowledge(correct_docs) elif not has_correct: # 分支 B:内部检索全部失真,触发外部补救检索 (Web Search) print("【CRAG 判决】内部知识库证据不足,启动外部互联网检索补救") web_results = self.web_search.search(query, max_results=3) final_context = "\n".join(web_results) else: # 分支 C:置信度模糊,执行内部提纯 + 外部检索混合交叉融合 print("【CRAG 判决】置信度模糊,执行内部与外部知识交叉融合") refined_internal = self._refine_knowledge(correct_docs + ambiguous_docs) web_results = self.web_search.search(query, max_results=2) final_context = f"【内部参考】:\n{refined_internal}\n\n【外部互联网补充】:\n" + "\n".join(web_results) # 4. 最终合成回答 return self._generate_final_answer(query, final_context) def _evaluate_documents(self, query: str, docs: List[str]) -> List[EvaluatedDocument]: """使用轻量模型或专门的打分探针对检索结果进行相关度三分类""" # 伪代码:输出结构化评估结果 results = [] for doc in docs: # 评估逻辑判断 results.append(EvaluatedDocument(content=doc, relevance_grade="CORRECT", score=0.92)) return results

三、知识提纯(Knowledge Refinement)的关键操作

即使文档被判定为CORRECT,原始的切片中依然可能包含 60% 与具体问题无关的背景介绍。
CRAG 引入了**“细粒度知识条目提纯(Decompose & Filter)”**:

  • 将粗颗粒度的文档段落拆解为独立的断言句子;
  • 计算每个断言对 Query 的支持权重,剔除无关背景句;
  • 将提纯后的紧凑核心知识送入最终上下文,从根本上防止长文本对大模型注意力的干扰。

四、生产效益总结

在工作室交付的企业级研报问答平台中,上线 CRAG 架构后:

  • 幻觉率从 18.2% 骤降至 1.9%
  • 在私有知识库未覆盖的新闻与实时政策类长尾问题上,由于触发了自动 Web Search 补救,问答覆盖率与有效解答率提升了 46%
  • 知识提纯将最终 Prompt 的上下文 Token 缩减了 55%,实现了性能与准确率的双赢。

不轻信单次检索,具备自我怀疑与跨源补救能力的 CRAG,是企业级 RAG 系统从粗放走向严谨成熟的标志性架构。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询