Corrective RAG(自我纠正的RAG)
本文介绍 Corrective RAG(自我纠正的 RAG)范式。
核心概念
Corrective RAG 是 RAG(检索增强生成)的改进范式,通过引入实时反馈与纠正机制,在生成过程中动态检测和修正错误,显著提升输出的准确性和可靠性。
核心思想:
- "生成-评估-纠正"闭环:在传统RAG的单次检索生成基础上,增加对生成内容的实时验证与迭代优化
- 多粒度纠错:从事实准确性、逻辑一致性、上下文连贯性等维度进行自我修正
与传统 RAG 的区别
| 特性 | 传统 RAG | Corrective RAG |
|---|---|---|
| 错误处理 | 依赖检索库质量,无主动纠错 | 动态检测并修正生成中的错误 |
| 生成流程 | 单向(检索→生成) | 循环(生成→评估→纠正→再生成) |
| 反馈信号 | 无或人工反馈 | 自动化验证(如事实核查、逻辑验证) |
| 输出可靠性 | 易受检索噪声或LLM幻觉影响 | 通过多次迭代降低错误率 |
核心思想
纠正性 RAG(Corrective RAG,简称CRAG)的核心思想是:先验证检索结果的可靠性,再决定是否使用或重新检索。
迭代式检索生成流程
流程说明:
- 用户问题首先进入智能体决策节点
- 智能体判断是否需要检索:
- 需要检索 → 进入检索+验证相关性节点
- 直接生成 → 进入生成答案节点
- 检索后评估结果是否可靠:
- 不可靠 → 重写查询,返回智能体决策重新判断
- 可靠 → 生成最终答案
实现要点
结果评估机制
def evaluate_retrieval(results):
"""评估检索结果的质量"""
if not results:
return False, "检索结果为空"
# 检查相似度分数
scores = [r.score for r in results]
if min(scores) < threshold:
return False, "相似度分数过低"
# 检查内容相关性
for doc in results:
if not is_relevant(doc, query):
return False, "内容不相关"
return True, "检索结果可靠"
查询重写策略
def rewrite_query(query, feedback):
"""根据反馈重写查询"""
prompt = f"""
原始查询: {query}
反馈信息: {feedback}
请重写查询,使其更准确地表达用户意图。
"""
return llm.invoke(prompt)