RAG 进阶变体与 LangGraph
来源:技术讨论整理
一、RAG 进阶变体
基础 RAG(检索增强生成)的流程是 检索 → 生成 → 输出,但存在检索不准、回答质量差等问题。以下是常见的改进方案。
1. Agentic RAG
用 Agent(智能体)驱动整个 RAG 流程。Agent 自主决定:
- 该不该检索
- 检索什么
- 用哪个工具(搜索引擎、数据库、API)
- 检索结果够不够,要不要再搜
核心思想: 把 RAG 当成 Agent 的一个工具,而非固定流水线。
2. Self-Reflective RAG
LLM 生成回答后自我反思,用特殊 token(如 [Yes]/[No])评估:
- 这段检索结果相关吗?
- 我的回答有依据吗?
- 需要重新检索吗?
核心思想: 让模型自己当自己的审核员,多轮迭代直到满意。
3. Corrective RAG (CRAG)
加一个轻量级评估器,在检索后先判断文档质量:
检索结果 → 评估器打分 →
✅ 直接用
❌ 放弃,改用网络搜索等备用方案
⚠️ 混合使用(精炼后保留有用的)核心思想: 检索完别急着用,先”纠个错”。
4. Adaptive RAG
根据查询复杂度动态选择策略:
- 简单问题 → 直接 LLM 回答(不检索)
- 中等问题 → 单次检索
- 复杂问题 → 多步检索 + 推理
核心思想: 不是所有问题都需要检索,按需选择路径。
5. Iterative Retrieval
多轮迭代检索:
- 第一轮检索 → 生成部分答案
- 根据已有答案,发现新问题
- 再次检索 → 补充信息
- 重复直到信息充分
核心思想: 一次检索不够,多查几次,逐步完善。
6. ReAct + Retrieval Tool
把检索封装成一个工具(Tool),用 ReAct 框架(Reasoning + Acting)驱动:
Thought: 我需要查一下 X 的定义
Action: search("X 定义")
Observation: 检索结果是...
Thought: 还需要查 Y
Action: search("Y 和 X 的关系")
Observation: ...
Answer: ...核心思想: 推理和行动交替进行,边想边查。
7. RAG with Evaluator / Grader Loop
生成回答后,加一个外部评估器打分,不合格就重来:
检索 → 生成回答 → 评估器打分 →
✅ 分数达标 → 返回
❌ 分数不够 → 重新检索/重新生成核心思想: 用外部质量把关形成闭环。
二、RAG 变体对比总结
| 变体 | 核心机制 | 关键词 |
|---|---|---|
| Agentic RAG | Agent 自主决策流程 | 工具调用、自主规划 |
| Self-Reflective RAG | 模型自我评估 | 自省、特殊 token |
| CRAG | 检索后先评估文档质量 | 纠错、备用方案 |
| Adaptive RAG | 按问题复杂度选策略 | 动态路由、按需检索 |
| Iterative Retrieval | 多轮迭代逐步完善 | 渐进式、多次检索 |
| ReAct + Retrieval | 推理与行动交替 | Thought-Action-Observation |
| Evaluator Loop | 外部评估器打分闭环 | 质量把关、循环优化 |
改进方向
基础 RAG: 检索 → 生成 → 输出
进阶思路围绕两个方向改进:
- 检索质量 → CRAG、Adaptive RAG、Iterative Retrieval
- 生成质量 → Self-Reflective、Evaluator Loop
而 Agentic RAG 和 ReAct 是”框架层面”的改进,把上面这些策略都变成可调用的工具/步骤。
三、LangGraph
核心概念
LangGraph 是 LangChain 团队开发的框架,用于构建基于图(Graph)的 AI 工作流。
把 AI 应用的流程画成一张有向图:
- 节点(Node) = 一个个步骤(调用 LLM、工具、判断逻辑)
- 边(Edge) = 步骤之间的连接(决定下一步去哪)
[开始] → [检索] → [LLM 判断] → [生成回答] → [结束]
↘ [再检索] ↗为什么需要它
基础 LangChain 的链是线性的(A → B → C),但实际场景需要:
- 条件分支:结果不好就走另一条路
- 循环:不满意就重来
- 并行:同时做多件事
- 状态管理:记住之前做了什么
LangGraph 用图结构天然支持这些。
核心组件
| 组件 | 作用 |
|---|---|
StateGraph | 定义图结构和共享状态 |
Node | 每个处理步骤(函数) |
Edge | 节点之间的连接 |
Conditional Edge | 根据条件选择下一步 |
State | 在节点间传递的共享数据 |
简单示例
from langgraph.graph import StateGraph, END
# 定义状态
class State(TypedDict):
question: str
docs: list
answer: str
# 定义节点
def retrieve(state):
docs = search(state["question"])
return {"docs": docs}
def generate(state):
answer = llm(state["question"], state["docs"])
return {"answer": answer}
def check_quality(state):
if 质量达标:
return "end"
return "retrieve" # 不好就重来
# 构建图
graph = StateGraph(State)
graph.add_node("retrieve", retrieve)
graph.add_node("generate", generate)
graph.set_entry_point("retrieve")
graph.add_edge("retrieve", "generate")
graph.add_conditional_edges("generate", check_quality, {
"end": END,
"retrieve": "retrieve" # 循环回去
})
app = graph.compile()四、LangGraph 与 RAG 变体的关系
LangGraph 是实现工具,前面那些 RAG 变体是策略/模式。
| RAG 变体 | 用 LangGraph 怎么实现 |
|---|---|
| CRAG | 节点:检索 → 评估 → 条件分支(用/不用) |
| Adaptive RAG | 入口节点判断复杂度 → 条件边选路径 |
| Iterative Retrieval | 循环边:检索 → 判断 → 不够就再检索 |
| Agentic RAG | 节点可以是 Agent,边是工具调用 |
| Evaluator Loop | 生成 → 评估 → 条件边(通过/重来) |
一句话总结: LangGraph = 用”图”的方式编排 AI 工作流,支持分支、循环、状态管理,是实现各种高级 RAG 策略的实用框架。