RAGFlow · 第 4 章:第二节 Self-RAG:让系统先判断证据是否足够
系列导航
- 第 0 章 前言:为什么企业 AI 工程师必须掌握 RAGFlow
- 第 1 章:安装部署与基础配置**——从零跑通第一个 RAG Pipeline
- 第 2 章:RAGFlow RAGFlow 代码介绍
- 第 3 章:攻克企业复杂文档——理解 DeepDoc、Naive、MinerU 与 Docling 的区别
- 第 4 章:理解 Agentic RAG 核心——定义与低代码实现
- 第一节 Agentic RAG 的目标、局限和适用场景
- 第二节 Self-RAG:让系统先判断证据是否足够 (本文)
- 第三节 Self-RAG:补充说明和进一步思考Agentic RAG的组成
- 第四节 Adaptive-RAG:先判断问题该走哪条路
- 第五节 Agentic-RAG 实验:它不是更会回答,而是更会决定怎么回答
- 第六节 高风险合规问答:规则、路由和保守模板
- 第七节 测试题对照实验:普通 RAG、Self-RAG、Agentic RAG 谁更可靠
- 第八节 工程保障:如何让 Agentic RAG 尽量稳定、可审计、可回归
- 第 5 章:工作流编排——构建基于图(Graph)的 RAG
- 第 6 章:Deep Research 模板应用——部署自动拆解子问题的深度研究智能体
- 第 7 章:企业级扩展——API 接入与外部工具集成(MCP)
- 第 8 章:评估与复盘——从"玄学"到量化 RAG 性能指标评测
本文记录一次在 RAGFlow 0.23 Agent Canvas 中搭建 Self-RAG 工作流的完整实验。
实验重点不是证明“Self-RAG 一定比基础 RAG 强”,而是验证:当第一次检索证据不足时,Agent 工作流能否通过证据判断、条件分支、精准改写或泛化改写,完成一次有控制的二次检索。
0. 实验结论
这次实验的核心结论如下:
| 结论 | 说明 |
|---|---|
| Self-RAG 不是默认更先进的 RAG | 如果第一次检索已经完整命中证据,Self-RAG 应直接 answer,不应为了“看起来智能”强行二次检索 |
| Self-RAG 的价值在于“证据不足时的下一步动作” | 它解决的是:当前证据是否够、缺什么、应该精准补检还是泛化重检 |
| 不要无限循环,最多二次检索 | 因为企业知识库场景中,二次检索后如果还找不到,继续循环大概率只是增加成本和延迟。 |
| 小型、高质量、结构清晰的知识库中,Self-RAG 可能没有可观察增益 | 本实验早期多个问题都被第一次检索直接回答,说明RAGFlow基础检索已经足够强 |
| 要验证 Self-RAG,必须设计能暴露检索缺口的问题 | 不能只靠“把问题说得绕一点”,而要观察第一次检索是否真的缺字段、跑偏或为空 |
rewrite 与 retry_broaden 的区别必须清楚 |
rewrite 是“方向对但缺字段”;retry_broaden 是“结果为空、跑偏或术语没有命中” |
| RAGFlow Canvas 中各分支需要独立组件链路 | 实践中,除常量 Message 外,不把多个条件分支接到同一个 Answer Generator,避免未执行路径变量为空或上下文混杂 |
Self-RAG 与 Agentic RAG 的思想并不是“多检索几次”。Self-RAG 论文强调的是按需检索、生成、评价和自反思;Agentic RAG 相关综述强调的是通过反思、规划、工具使用等方式动态管理检索策略。本文在 RAGFlow 中实现的是一种低代码近似:用 Evidence Grader 模拟“反思”,用条件组件实现“路由”,用 Query Rewriter 和多个 Retrieval 实例实现“按需再检索”。
本文中实验的Self-RAG工作流文件可以下载导入后,直接跳转到 测试问题开始测试。当然,你也可以按照实验步骤手动建立自己的Self-RAG工作流。
1. 实验目标
本文只验证一个具体问题:
当第一次检索结果不足时,RAGFlow Agent 是否能判断不足原因,并进入正确的二次检索分支?
因此,本实验直接围绕一个完整 Self-RAG 工作流展开。
2. 实验知识库
2.1 知识库名称
在可下载的RAGFlow工作流文件中, 知识库名称是: “厂内异常处理和检修记录”
2.2 知识库文件
| 文件 | 类型 | 用途 |
|---|---|---|
| 文档 A:火电厂运行异常处理规程 | 运行规程 | 提供低真空、凝汽器真空下降、循环水、真空泵、测点判断等规程性内容 |
| 文档 B:设备缺陷与检修记录汇编 | 缺陷记录 | 提供 QX-2025-071、QX-2025-088、QX-2025-094、QX-2025-103 等缺陷案例 |
2.3 Markdown 解析配置
RAGFlow 文本分段标识符使用:
`\n---``\n## ``\n### ``\n#### `
| 配置点 | 操作 |
|---|---|
| 多字符分隔符 | 用两个反引号包裹,例如 ## |
普通换行 \n |
不作为主分隔符, 会导致Markdown中表格被截断 |
| 修改解析参数后 | 删除已上传文件,重新上传并重新解析 (实际测试参数保存后, 对已经解析过的文件重新解析, 参数没有生效) |

3. RAGFlow Canvas 设计原则
3.1 连线理解
RAGFlow Agent Canvas 中的连线表示:
执行顺序 + 上下文传递
不是传统编程里的函数调用,也不是多个分支同步执行。
3.2 条件组件的使用
本文使用 条件(if-elseif) 组件,不使用“问题分类”组件来判断 Grader 输出。
原因如下:
| 组件 | 适用场景 | 本实验用途 |
|---|---|---|
| 条件(if-elseif) | 根据上游输出的确定值走分支 | 判断 DECISION=answer/rewrite/retry_broaden/insufficient |
| 问题分类 | 让模型判断用户问题属于哪类 | 不用于 Evidence Grader 后的分支判断 |
3.3 所有流程使用独立下游组件
实践中,多个条件分支不要共用同一个 Answer Generator。
错误画法:
条件 1 answer ┐
条件 2A answer ├── Answer Generator
条件 2B answer ┘
本文采用的画法:
条件 1 answer → Answer Generator 1
条件 2A answer → Answer Generator 2A
条件 2B answer → Answer Generator 2B
原因:
| 原因 | 说明 |
|---|---|
| 避免空变量 | 未执行分支的 Retrieval 结果可能为空 |
| 避免上下文混杂 | 不同分支使用不同证据集合 |
| 便于调试 | 每条路径可单独查看输入输出 |
| 便于截图教学 | 初学者能直接对应每条执行路径 |
4. Self-RAG 工作流总览
4.1 工作流结构
Begin
→ Query Analyzer
→ Retrieval 1
→ Evidence Grader 1
→ 条件 1
→ answer → Answer Generator 1 → Answer Checker 1 → Final Message
→ rewrite → Rewrite Query Precise → Retrieval 2A → Evidence Grader 2A → 条件 2A
→ retry_broaden → Rewrite Query Broaden → Retrieval 2B → Evidence Grader 2B → 条件 2B
→ insufficient → Insufficient Message
二次判断后:
条件 2A
→ answer → Answer Generator 2A → Answer Checker 2A → Final Message
→ partial_answer → Partial Answer Generator 2A → Answer Checker 2A-Partial → Final Message
→ insufficient → Insufficient Message 2A
条件 2B
→ answer → Answer Generator 2B → Answer Checker 2B → Final Message
→ partial_answer → Partial Answer Generator 2B → Answer Checker 2B-Partial → Final Message
→ insufficient → Insufficient Message 2B
4.2 Mermaid 流程图

5. 组件配置总表
| 顺序 | 组件类型 | 组件名称 | 输入 | 输出 | 连接 |
|---|---|---|---|---|---|
| 1 | Begin | Begin | 用户问题 | /sys.query |
Query Analyzer |
| 2 | Agent | Query Analyzer | /sys.query |
保守初始 query | Retrieval 1 |
| 3 | Retrieval | Retrieval 1 - Initial | /QueryAnalyzer.output |
第一次检索结果 | Evidence Grader 1 |
| 4 | Agent | Evidence Grader 1 | 用户问题 + 初始 query + 第一次检索结果 | DECISION=xxx |
条件 1 |
| 5 | 条件 | 条件 1 | /EvidenceGrader1.output |
分支路径 | answer / rewrite / retry_broaden / insufficient |
| 6 | Agent | Answer Generator 1 | 第一次检索证据 | 完整答案 | Answer Checker 1 |
| 7 | Agent | Rewrite Query Precise | 第一次证据 + Grader 输出 | 精确化 query | Retrieval 2A |
| 8 | Retrieval | Retrieval 2A - Precise | /RewriteQueryPrecise.output |
精确化检索结果 | Evidence Grader 2A |
| 9 | Agent | Evidence Grader 2A | 用户问题 + 两次检索结果 | 二次判断 | 条件 2A |
| 10 | 条件 | 条件 2A | /EvidenceGrader2A.output |
分支路径 | 2A 独立回答链路 |
| 11 | Agent | Rewrite Query Broaden | 第一次证据 + Grader 输出 | 泛化 query | Retrieval 2B |
| 12 | Retrieval | Retrieval 2B - Broaden | /RewriteQueryBroaden.output |
泛化检索结果 | Evidence Grader 2B |
| 13 | Agent | Evidence Grader 2B | 用户问题 + 两次检索结果 | 二次判断 | 条件 2B |
| 14 | 条件 | 条件 2B | /EvidenceGrader2B.output |
分支路径 | 2B 独立回答链路 |
| 15 | Message | Final Message | 各分支最终输出 | 用户可见答案 | 结束 |
6. 组件配置明细
6.1 Query Analyzer
| 项目 | 配置 |
|---|---|
| 组件类型 | Agent |
| 组件名称 | Query Analyzer |
| 输出格式 | 一行 query |
| 设计原则 | 保守改写,不提前完成 Self-RAG 的扩展工作 |
System Prompt
你是企业知识库检索前置分析器。你的任务是把用户问题改写为适合第一次检索的一行 query。
输出要求:
1. 只输出一行 query。
2. 不输出 JSON。
3. 不解释。
4. 只保留用户原问题中已经明确出现的对象、现象、设备、时间、状态。
5. 不主动补充用户没有提到的具体设备、缺陷点、历史记录编号、检修结论。
6. 不主动扩展同义词。
7. 不把口语表达直接改写成多个专业术语。
8. 第一次检索只做保守改写,术语扩展交给 rewrite 或 retry_broaden 分支完成。
User Prompt
用户问题:
/sys.query

6.2 Retrieval 1 - Initial
| 参数 | 配置 |
|---|---|
| Input Variables | /QueryAnalyzer.output |
| Dataset | 文档 A + 文档 B |
| Similarity Threshold | 按实际已跑通配置填写 |
| Top N | 按实际已跑通配置填写 |
| Vector Weight | 按实际已跑通配置填写 |
| Keyword Weight | 按实际已跑通配置填写 |
| Rerank | 按实际已跑通配置填写 |
| PageIndex | 按实际已跑通配置填写 |

6.3 Evidence Grader 1
| 项目 | 配置 |
|---|---|
| 组件类型 | Agent |
| 组件名称 | Evidence Grader 1 |
| 输出格式 | 固定纯文本或结构化输出均可;条件组件需要能判断 DECISION |
| 可选决策 | answer / rewrite / retry_broaden / insufficient |
System Prompt
你是 Self-RAG 工作流中的证据评估器。你的任务是判断当前检索结果是否足够回答用户问题,并决定下一步动作。
可选 DECISION 只有四种:
1. DECISION=answer
检索结果与用户问题高度相关,并且已经覆盖回答所需的主要信息。
2. DECISION=rewrite
检索结果与用户问题属于同一主题,但信息不完整。例如缺少现场检查结果、处理措施、验证结果、记录编号、判断依据或关键上下文。此时需要精准改写问题后再次检索。
3. DECISION=retry_broaden
检索结果为空、明显跑偏、命中的是另一个专业或另一个故障类型,或者用户使用现场口语、间接描述、非标准表达,导致正式术语没有命中。此时需要扩展同义词、上位词和相关术语后再次检索。
4. DECISION=insufficient
检索结果明显无法支持回答,并且当前知识库很可能没有相关资料,继续检索价值较低。
判断规则:
- 只有检索结果覆盖用户问题中的全部约束,才能输出 DECISION=answer。
- 如果只是缺少字段,输出 DECISION=rewrite。
- 如果主题不匹配、检索为空或需要把非标准表达扩展为正式术语,输出 DECISION=retry_broaden。
- 不因为检索内容很多就 answer;必须逐项核对用户问题要求。
- 不因为检索结果不完美就 insufficient;只有明显知识库缺资料时才 insufficient。
输出字段:
DECISION
RETRYABLE
REASON
MISSING_INFO
REWRITE_STRATEGY
relevance_score
coverage_score
confidence_score
User Prompt
用户问题:
/sys.query
初始检索 query:
/QueryAnalyzer.output
第一次检索结果:
/Retrieval1.formalized_content
请判断当前证据是否足够回答,并给出下一步动作。


6.4 条件 1
| 分支 | 条件 | 下游组件 |
|---|---|---|
| IF | DECISION=answer |
Answer Generator 1 |
| ELSE IF | DECISION=rewrite |
Rewrite Query Precise |
| ELSE IF | DECISION=retry_broaden |
Rewrite Query Broaden |
| ELSE IF | DECISION=insufficient |
Insufficient Message 1 |
| ELSE | 无法识别 | Debug Message |

6.5 Rewrite Query Precise
| 项目 | 配置 |
|---|---|
| 触发条件 | DECISION=rewrite |
| 目标 | 在同一主题内补齐缺失字段 |
| 下游 | Retrieval 2A - Precise |
System Prompt
你是检索问题精准改写器。你的任务是根据证据评估结果,生成一个更精准的二次检索 query。
输出要求:
1. 只输出一行 query。
2. 不解释。
3. 不改变用户原始意图。
4. 只围绕 MISSING_INFO 补齐缺失字段。
5. 保留第一次检索已经命中的主题方向。
6. 使用知识库中可能出现的正式术语。
7. 不做大范围泛化,不扩展到无关系统。
User Prompt
用户原始问题:
/sys.query
第一次检索结果:
/Retrieval1.formalized_content
证据评估结果:
/EvidenceGrader1.output
请生成精准化二次检索 query。
6.6 Retrieval 2A - Precise
| 参数 | 配置 |
|---|---|
| Input Variables | /RewriteQueryPrecise.output |
| Dataset | 文档 A + 文档 B |
| Similarity Threshold | 0.2 |
| Top N | 10 |
| Vector Weight | 0.6 |
| Keyword Weight | 0.4 |
| Rerank | Yes |
| PageIndex | No |
6.7 Evidence Grader 2A
| 项目 | 配置 |
|---|---|
| 组件类型 | Agent |
| 组件名称 | Evidence Grader 2A |
| 可选决策 | answer / partial_answer / insufficient |
| 循环规则 | 二次检索后不再继续 rewrite |
System Prompt
你是 Self-RAG 的二次证据评估器。当前已经完成精准化改写和二次检索。
可选 DECISION 只有三种:
1. DECISION=answer
二次检索结果已经足够回答用户问题。
2. DECISION=partial_answer
二次检索结果只能支持部分回答,必须明确哪些内容资料不足。
3. DECISION=insufficient
二次检索后仍没有足够证据,必须停止,不继续检索。
输出字段:
DECISION
REASON
SUPPORTED_POINTS
UNSUPPORTED_POINTS
relevance_score
coverage_score
confidence_score
User Prompt
用户原始问题:
/sys.query
第一次检索结果:
/Retrieval1.formalized_content
精准化二次检索 query:
/RewriteQueryPrecise.output
二次检索结果:
/Retrieval2A.formalized_content
请判断二次检索结果是否足够回答用户问题。
6.8 条件 2A
| 分支 | 条件 | 下游组件 |
|---|---|---|
| IF | DECISION=answer |
Answer Generator 2A |
| ELSE IF | DECISION=partial_answer |
Partial Answer Generator 2A |
| ELSE IF | DECISION=insufficient |
Insufficient Message 2A |
| ELSE | 无法识别 | Debug Message |
6.9 Rewrite Query Broaden
| 项目 | 配置 |
|---|---|
| 触发条件 | DECISION=retry_broaden |
| 目标 | 将非标准表达、空结果或跑偏结果扩展为知识库正式术语 |
| 下游 | Retrieval 2B - Broaden |
System Prompt
你是检索问题泛化改写器。你的任务是在第一次检索为空、跑偏或术语没有命中的情况下,生成更宽泛的二次检索 query。
输出要求:
1. 只输出一行 query。
2. 不解释。
3. 保留用户核心意图。
4. 扩展同义词、上位词、设备相关术语和现象描述。
5. 只扩展到当前知识库所在专业范围内。
6. 不引入无关专业、无关设备或无关故障。
7. 对汽机排汽侧、凝汽器、真空相关问题,不扩展到燃气轮机、锅炉炉膛负压、给水泵等无关方向。
User Prompt
用户原始问题:
/sys.query
第一次检索结果:
/Retrieval1.formalized_content
证据评估结果:
/EvidenceGrader1.output
请生成泛化扩展后的二次检索 query。
6.10 Retrieval 2B - Broaden
| 参数 | 配置 |
|---|---|
| Input Variables | /RewriteQueryBroaden.output |
| Dataset | 文档 A + 文档 B |
| Similarity Threshold | 0.15 |
| Top N | 16 |
| Vector Weight | 0.7 |
| Keyword Weight | 0.3 |
| Rerank | Yes |
| PageIndex | No |
6.11 Evidence Grader 2B
与 Evidence Grader 2A 相同,但 User Prompt 使用 Retrieval 2B:
用户原始问题:
/sys.query
第一次检索结果:
/Retrieval1.formalized_content
泛化二次检索 query:
/RewriteQueryBroaden.output
二次检索结果:
/Retrieval2B.formalized_content
请判断二次检索结果是否足够回答用户问题。
6.12 条件 2B
| 分支 | 条件 | 下游组件 |
|---|---|---|
| IF | DECISION=answer |
Answer Generator 2B |
| ELSE IF | DECISION=partial_answer |
Partial Answer Generator 2B |
| ELSE IF | DECISION=insufficient |
Insufficient Message 2B |
| ELSE | 无法识别 | Debug Message |
6.13 Answer Generator 与 Answer Checker
每条路径使用独立组件。
| 路径 | Answer Generator | Answer Checker |
|---|---|---|
| 条件 1 answer | Answer Generator 1 | Answer Checker 1 |
| 条件 2A answer | Answer Generator 2A | Answer Checker 2A |
| 条件 2A partial | Partial Answer Generator 2A | Answer Checker 2A Partial |
| 条件 2B answer | Answer Generator 2B | Answer Checker 2B |
| 条件 2B partial | Partial Answer Generator 2B | Answer Checker 2B Partial |
Answer Generator 通用 System Prompt
你是企业知识库问答助手。你必须基于给定检索内容回答问题。
规则:
1. 只使用检索内容。
2. 不编造知识库外的原因、定值、条款或操作命令。
3. 涉及运行处理、故障排查、制度要求时,用步骤化结构输出。
4. 证据不足时写明“不足以判断”。
5. 保留证据中的关键限定条件。
Answer Checker 通用 System Prompt
你是答案审查器。你的任务是检查答案是否严格基于证据。
检查规则:
1. 答案必须回答用户问题。
2. 删除没有证据支持的内容。
3. 不把“可能原因”写成“确定原因”。
4. 不编造保护定值、设备编号、规程条款。
5. 证据不足时,保留“当前资料不足以判断”的说明。
6. 不解释审查过程,直接输出修正后的最终答案。


7. 三个最终测试问题
7.1 运行和调试方法

7.2 问题 A:直接 answer
凝汽器真空下降时,运行人员应优先检查哪些系统?
| 项目 | 内容 |
|---|---|
| 目的 | 验证证据足够时,Self-RAG 不进行无意义二次检索 |
| 预期路径 | Retrieval 1 → Evidence Grader 1 → DECISION=answer → Answer Generator 1 |
| 预期答案要点 | 循环水系统、抽真空系统、真空严密性、凝汽器水位/端差/排汽压力、负荷控制和保护关注 |
7.3 问题 B:进入 2A 精确化改写分支
高温高负荷期间,凝汽器侧参数变差,同时循环水旋转滤网压差升高。请说明这类问题为什么会影响真空,并找出缺陷记录中的现场检查结果和处理措施。
| 项目 | 内容 |
|---|---|
| 目的 | 验证第一次检索相关但缺字段时,进入 rewrite → Retrieval 2A |
| 预期路径 | Retrieval 1 → Evidence Grader 1 → DECISION=rewrite → Rewrite Query Precise → Retrieval 2A → Evidence Grader 2A → Answer Generator 2A |
| 预期缺失字段 | 现场检查结果、影响真空的技术原理、具体缺陷处理记录 |
| 预期二次 query | 循环水旋转滤网压差升高 高温高负荷 真空偏低 凝汽器换热效果下降 循环水量不足 现场检查 旋转滤网局部附着杂物 冲洗水压力不足 处理措施 |
| 预期答案要点 | 循环水量不足导致凝汽器换热下降;旋转滤网局部附着杂物;冲洗水压力不足;提高冲洗水压力、人工辅助清理、检查循环水泵出口门/水室压差/循环水流量 |
7.4 问题 C:进入 2B 泛化改写分支
值班员说“汽机尾部参数不对劲,负荷越高越明显,投入备用辅机后只改善了一点”。请从知识库中判断它可能对应哪些历史缺陷,并按优先级列出排查方向。
| 项目 | 内容 |
|---|---|
| 目的 | 验证第一次检索为空、偏弱或术语未命中时,进入 retry_broaden → Retrieval 2B |
| 预期路径 | Retrieval 1 → Evidence Grader 1 → DECISION=retry_broaden → Rewrite Query Broaden → Retrieval 2B → Evidence Grader 2B → Answer Generator 2B |
| 预期二次 query | 汽机尾部参数异常 低压缸排汽压力升高 凝汽器真空下降 低真空报警 负荷升高后明显 备用真空泵缓解 真空偏低 循环水滤网压差 空气漏入 抽气能力不足 真空泵 凝汽器人孔门 |
| 预期答案要点 | QX-2025-071、QX-2025-094、QX-2025-088、QX-2025-103;优先排查真空严密性、循环水系统、抽真空系统、测点异常 |
8. 实验结果记录表
8.1 总体路径记录
| 测试问题 | 第一次 query | Retrieval 1 命中摘要 | Grader 1 decision | 二次 query | Retrieval 2 命中摘要 | Grader 2 decision | 最终路径是否符合预期 |
|---|---|---|---|---|---|---|---|
| A:凝汽器真空下降时优先检查哪些系统 | 凝汽器真空下降优先检查系统 循环水 抽真空 凝结水 真空泵 汽轮机 | doc_A 1 chunk |
answer confidence_score: 95 coverage_score: 95 relevance_score: 100 |
不适用 | 不适用 | 不适用 | 是 |
| B:循环水旋转滤网压差升高 | 高温高负荷凝汽器侧参数变差 循环水旋转滤网压差升高 影响真空的原因 缺陷记录 检查结果 处理措施 | doc_A 1 chunk |
rewrite REASON: “检索内容提供了循环水滤网压差升高对凝汽器真空的影响机制和一般性的运行处理措施,但用户要求查找缺陷记录中的现场检查结果和处理措施,当前文档是运行规程而非具体缺陷记录” MISSING_INFO: “缺陷记录中的具体现场检查结果(如具体数值、具体发现的缺陷描述)、具体处理措施及处理结果” |
凝汽器真空 循环水旋转滤网压差 缺陷记录 现场检查结果 处理措施 高温高负荷 | doc_A & doc_B | “answer” REASON: “二次检索已找到与用户问题直接相关的缺陷记录QX-2025-094,包含现场检查结果和处理措施” |
是 |
| C:汽机尾部参数不对劲 | 汽轮机尾部参数异常负荷越高越明显备用辅机投入后改善有限的缺陷原因及排查方向 | 空 | retry_broaden REASON: “检索结果为空,可能因为问题涉及的具体缺陷场景在知识库中缺少完全匹配的内容,或者检索关键词不够宽泛” MISSING_INFO: “无法从空结果中判断,但用户问题指向汽轮机高负荷工况下的尾部参数异常,常见可能原因包括叶片/转子问题、冷凝系统真空不足、循环水系统效率下降、给水泵或循环水泵出力不足等” REWRITE_STRATEGY: “需要扩展检索词,可尝试:1)用更通用的上位词如’汽轮机缺陷’、‘汽机故障’、‘机组异常’;2)分别检索’负荷高振动’、‘冷凝器真空低’、‘循环水泵’、‘给水泵’等子问题;3)或者检索’备用辅机改善有限’、'辅机并联运行’等相关表述” |
汽轮机 汽机 尾部参数 负荷关系 真空系统 排气温度异常 低真空 备用辅机 凝结水泵 循环水泵 故障排查 汽机运行异常 负荷升高参数恶化 | doc_A & doc_B | answer REASON: “检索结果包含多个与负荷升高相关低真空缺陷的历史记录(缺陷071、088、094),并详细描述了凝汽器真空系统、循环水系统、抽真空系统的故障特征和排查方向,与值班员描述高度吻合” |
是 |
8.2 分支效果记录
| 分支 | 测试问题 | 是否触发 | 触发原因 | 二次检索是否补齐证据 | 结论 |
|---|---|---|---|---|---|
| answer | A | 否 | 不适用 | 不适用 | 满足 |
| rewrite / 2A | B | 是 | 检索内容提供了循环水滤网压差升高对凝汽器真空的影响机制和一般性的运行处理措施,但用户要求查找缺陷记录中的现场检查结果和处理措施,当前文档是运行规程而非具体缺陷记录 | 二次检索已找到与用户问题直接相关的缺陷记录QX-2025-094,包含现场检查结果和处理措施 | 满足 |
| retry_broaden / 2B | C | 是 | 检索结果为空,可能因为问题涉及的具体缺陷场景在知识库中缺少完全匹配的内容,或者检索关键词不够宽泛 | 检索结果包含多个与负荷升高相关低真空缺陷的历史记录(缺陷071、088、094),并详细描述了凝汽器真空系统、循环水系统、抽真空系统的故障特征和排查方向,与值班员描述高度吻合 | 满足 |


9. 如何判断实验是否成功
| 检查项 | 成功表现 | 失败表现 |
|---|---|---|
| 问题 A | 第一次检索证据足够,直接 answer | 证据足够却进入 rewrite 或 retry_broaden |
| 问题 B | 第一次检索相关但缺字段,进入 rewrite | 直接 answer,或误判成 retry_broaden |
| 问题 C | 第一次检索为空/偏弱/术语未命中,进入 retry_broaden | 直接 answer,或扩展到无关专业 |
| 2A 二次检索 | 补齐现场检查结果、影响机理、处理措施 | 仍只返回通用规程 |
| 2B 二次检索 | 找到正式术语和历史缺陷记录 | 跑偏到燃气轮机、炉膛负压、给水泵等无关方向 |
| 最终答案 | 严格基于检索证据 | 答案更完整但证据不支持 |
10. 实验中的重要发现
10.1 不是所有问题都会触发 Self-RAG
实验初期,多道问题都被第一次检索直接回答。这个结果不是失败,而是说明:
当前知识库规模小、结构清晰、证据集中,第一次检索已经足够。
此时 Self-RAG 的正确动作就是:
DECISION=answer
10.2 不能为了证明 Self-RAG 而强行二次检索
如果第一次证据已经完整,再强行进入 rewrite 或 retry_broaden,会带来两个问题:
| 问题 | 后果 |
|---|---|
| 增加调用成本 | 多一次 LLM 和 Retrieval 调用 |
| 引入噪声 | 二次检索可能召回不必要内容,反而降低答案质量 |
10.3 Self-RAG 的验证要看“证据缺口”
本实验最终可观察到三类路径:
| 路径 | 触发条件 |
|---|---|
| answer | 第一次证据已经足够 |
| rewrite | 第一次证据相关但缺字段 |
| retry_broaden | 第一次证据为空、跑偏或术语未命中 |
这个结论比“Self-RAG 一定更强”更重要。
11. 实验结论
本实验最终得到一个实事求是的结论:
Self-RAG 不是原生优于基础 RAG 的固定流程,而是一种在证据不足时动态选择下一步动作的工作流策略。
在 RAGFlow Agent 中,Self-RAG 的价值主要体现在三个方面:
| 价值 | 说明 |
|---|---|
| 证据充分性判断 | 通过 Evidence Grader 判断当前证据是否足够回答 |
| 检索策略分流 | 通过条件组件区分 answer、rewrite、retry_broaden、insufficient |
| 二次检索可控 | 通过不同 Retrieval 实例分别处理精准补齐和泛化召回 |
但它也有边界:
| 边界 | 说明 |
|---|---|
| 小知识库不一定有增益 | 如果第一次检索已经完整命中,Self-RAG 不会表现出额外收益 |
| 需要严格的 Grader 规则 | Grader 如果只看“内容很多”,会过早 answer;如果过度保守,会无意义二次检索 |
| Query Analyzer 不能过度聪明 | 如果第一次 query 已经完成大范围同义词扩展,retry_broaden 没有触发空间 |
| 分支组件要独立 | 共用 Answer Generator 容易造成空变量、上下文混杂和调试困难 |
| 二次检索不能无限循环 | 二次检索后仍不足,应该 partial_answer 或 insufficient |
因此,Self-RAG 更适合以下场景:
| 场景 | 适配原因 |
|---|---|
| 企业知识库规模大、文档类型多 | 第一次检索容易只命中部分证据 |
| 同一问题需要跨规程、缺陷记录、试验报告 | Grader 能识别缺失字段并触发补检 |
| 用户表达口语化、现场化 | retry_broaden 可以把现场表达扩展为正式术语 |
| 对答案可追溯性要求高 | Answer Checker 能削弱无证据生成 |
不适合以下场景:
| 场景 | 原因 |
|---|---|
| 知识库很小且结构清晰 | 单次检索通常足够 |
| 问题答案集中在一个 chunk 内 | Self-RAG 无需发挥 |
| 低成本、低延迟优先 | 多 Agent + 多 Retrieval 会增加调用成本 |
| Grader 规则不清晰 | 分支判断会不稳定 |
最终判断标准不是“有没有触发二次检索”,而是:
该问题在当前证据下是否真的需要二次检索。
这也是 Self-RAG 实验最重要的结论。
12. 参考资料
- Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection
https://arxiv.org/abs/2310.11511 - Self-RAG Project
https://selfrag.github.io/ - Agentic Retrieval-Augmented Generation: A Survey on Agentic RAG
https://arxiv.org/abs/2501.09136 - RAGFlow Agent Introduction
https://ragflow.io/docs/agent_introduction - RAGFlow Retrieval Component
https://ragflow.io/docs/retrieval_component - RAGFlow Switch Component
https://ragflow.io/docs/switch_component
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)