RAG 进阶变体与 LangGraph

6 min

来源:技术讨论整理


一、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

多轮迭代检索:

  1. 第一轮检索 → 生成部分答案
  2. 根据已有答案,发现新问题
  3. 再次检索 → 补充信息
  4. 重复直到信息充分

核心思想: 一次检索不够,多查几次,逐步完善。


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 RAGAgent 自主决策流程工具调用、自主规划
Self-Reflective RAG模型自我评估自省、特殊 token
CRAG检索后先评估文档质量纠错、备用方案
Adaptive RAG按问题复杂度选策略动态路由、按需检索
Iterative Retrieval多轮迭代逐步完善渐进式、多次检索
ReAct + Retrieval推理与行动交替Thought-Action-Observation
Evaluator Loop外部评估器打分闭环质量把关、循环优化

改进方向

基础 RAG: 检索 → 生成 → 输出

进阶思路围绕两个方向改进:

  1. 检索质量 → CRAG、Adaptive RAG、Iterative Retrieval
  2. 生成质量 → 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 策略的实用框架。