Skip to content

04.1 - Agentic RAG

定位: RAG 与 Agent 的结合——让 LLM 自主决策何时检索、检索什么、是否需要多步检索 面试高频度: ⭐⭐⭐⭐ 考查方式: Agent 架构、工具调用、多步推理流程

一、这是什么?为什么需要它?

是什么

Agentic RAG 是将 AI Agent(智能体)的规划/推理/工具调用能力与 RAG 相结合,让系统可以自主决策何时检索、用什么工具检索、是否需要多次检索,而不是固定的"检索一次 -> 生成"流程。

传统 RAG:固定流程
  查询 -> 检索 -> 生成(每次都走完整流程)

Agentic RAG:自主决策
  查询 -> Agent 分析 -> 决定:
    ├-- 需要检索 -> 选择检索工具 -> 评估结果 -> 可能再次检索 -> 生成
    ├-- 直接回答 -> 不需要检索(问候/计算等)
    └-- 需要其他工具 -> 调用代码/计算器等

为什么需要 Agentic RAG?

传统 RAG 的局限性:
  1. 每次都检索:问候也要检索,浪费
  2. 只检索一次:复杂问题需要多步推理
  3. 无法判断检索质量:检索到垃圾也照用
  4. 没有工具思维:只能检索无法计算

Agentic RAG 解决:
  1. 按需检索:需要时才检索
  2. 多步推理:一次不够可以再查
  3. 自我评估:判断检索结果是否够用
  4. 工具扩展:检索 + 计算 + 代码执行

二、原理拆解

2.1 Agent 的核心能力

Agent = LLM + 规划 + 工具 + 记忆

传统 LLM:        输入 -> 生成输出
Agent:           输入 -> 思考 -> 决策(用工具/直接回答) -> 观察结果 -> 再次思考 -> 最终输出

关键能力

1. 推理/规划:分析问题,拆解为子任务
2. 工具使用:调用检索器、计算器、API
3. 记忆管理:记住之前的检索结果
4. 自我评估:判断当前信息是否足够

2.2 Agentic RAG 的三种模式

模式 1:简单 Tool-use Agent

查询:"公司年假政策是什么?"

Agent 决策流程:
  Step 1: 分析查询 -> "这是知识性问题,需要检索"
  Step 2: 调用检索工具 -> 检索器.invoke("年假政策")
  Step 3: 接收结果 -> 文档块
  Step 4: 判断信息是否足够 -> "是的,信息完整"
  Step 5: 基于检索结果生成回答

模式 2:多步推理 Agent

查询:"年假最多的员工能休多少天?"

Agent 决策流程:
  Step 1: 分析 -> "需要先了解年假制度,再算最大值"
  Step 2: 检索 -> "公司年假制度"
  Step 3: 分析结果 -> "找到工龄对应关系,但需要员工工龄数据"
  Step 4: 再次检索 -> "员工工龄统计数据"
  Step 5: 合并信息 -> "5年以上工龄占比..."
  Step 6: 生成回答

模式 3:自省 Agent

查询:"公司年假政策是什么?"

Agent 流程:
  Step 1: 检索 -> 得到结果 A
  Step 2: 自评 -> "结果 A 只说了天数,没提申请流程,可能不完整"
  Step 3: 再次检索 -> "年假申请流程"
  Step 4: 合并 A 和 B -> 完整回答

2.3 Agentic RAG 架构

+------------------------------------------------------------------+
|                    Agentic RAG 系统架构                            |
|                                                                   |
|        +------------------+                                       |
|        |   用户查询        |                                       |
|        +--------+---------+                                       |
|                 |                                                 |
|                 v                                                 |
|        +------------------+                                       |
|        |  Agent (LLM)     |  <-- 核心:推理 + 规划                   |
|        |  思考:该怎么做? |                                       |
|        +--------+---------+                                       |
|                 |                                                 |
|       +--------+--------+--------+--------+                      |
|       |        |        |        |        |                       |
|       v        v        v        v        v                       |
|   +------+ +------+ +------+ +------+ +------+                   |
|   |知识库 | |关键词 | |网页  | |计算器 | |其他  |  <-- 工具集       |
|   |检索   | |检索   | |搜索  | |      | |工具  |                   |
|   +------+ +------+ +------+ +------+ +------+                   |
|       |        |        |        |        |                       |
|       +--------+--------+--------+--------+                      |
|                 |                                                 |
|                 v                                                 |
|        +------------------+                                       |
|        |  Agent 评估结果   |  <-- 判断是否足够                      |
|        +--------+---------+                                       |
|            |          |                                           |
|       不够 |          | 够了                                       |
|       再查 |          v                                           |
|            |     +------------------+                             |
|            +-->  | 生成最终回答     |                             |
|                  +------------------+                             |
+------------------------------------------------------------------+

三、图解全景

Agentic RAG vs 传统 RAG 决策流程对比

传统 RAG:
  用户输入 -> [总是检索] -> [总是生成] -> 输出
  无判断、无分支、单次

Agentic RAG:
  用户输入 -> [分析]
                    |
            +-------+--------+
            |                |
        需要检索         无需检索
            |                |
        选择工具         直接回答
            |
        执行检索
            |
        评估结果
            |
      +-----+-----+
      |           |
   不够好       够好了
      |           |
    再检索      生成回答
      |           |
      +--> 合并 --+

四、实战验证

4.1 LangGraph Agentic RAG 实现

python
# 安装:pip install langgraph langchain

from langgraph.graph import StateGraph, MessageGraph
from typing import TypedDict, List
from langchain_core.messages import HumanMessage, AIMessage
from langchain.tools import tool

class AgentState(TypedDict):
    messages: List
    documents: List

# 定义检索工具
@tool
def retrieve_knowledge(query: str) -> str:
    """从知识库检索相关信息"""
    docs = vectorstore.similarity_search(query, k=3)
    return "\n\n".join([doc.page_content for doc in docs])

tools = [retrieve_knowledge]

# 构建 Agent 图
from langgraph.prebuilt import ToolNode
from langgraph.graph import END

def should_continue(state):
    """决定是否继续检索或生成"""
    last_message = state["messages"][-1]
    if last_message.content == "NEED_MORE_INFO":
        return "continue_retrieval"
    return "generate"

# 构建 LangGraph
workflow = StateGraph(AgentState)
workflow.add_node("agent", agent_node)
workflow.add_node("retrieve", ToolNode(tools))
workflow.add_node("generate", generate_node)

workflow.set_entry_point("agent")
workflow.add_conditional_edges(
    "agent",
    should_continue,
    {"continue_retrieval": "retrieve", "generate": "generate"}
)
workflow.add_edge("retrieve", "agent")
workflow.add_edge("generate", END)

app = workflow.compile()

五、面试视角

问题答案要点
Agentic RAG 相比传统 RAG 的核心改进?Agent 自主决策"是否需要检索"、"用什么工具"、"检索结果是否够用"。传统 RAG 是固定流程,Agentic RAG 是自适应流程
Agentic RAG 的主要挑战?1) 决策可能出错(Agent 误判是否需要检索);2) 多步推理增加延迟;3) Agent 可能陷入循环(不断检索不生成);4) 成本增加(多次 LLM 调用)
什么场景适合 Agentic RAG?复杂问题(需要多步推理)、混合类型查询(需要判断是否检索)、需要结合多种工具的场景。简单 FAQ 不适合(过度设计)
如何避免 Agent 陷入循环?1) 设置最大检索步数限制;2) 设置超时时间;3) 设计明确的终止条件("信息足够"的判断);4) 利用 LangGraph 等框架的状态管理

📚 相关链接

  • **SelfRAG与CorrectiveRAG** — 自我反思的 RAG 变体
  • **RAG系统架构总览** — Modular RAG 作为 Agentic 的基础
  • **LangChain实践指南** — LangChain Agent 框架
  • <- 返回 **进阶RAG索引**

Knowledge4J — Java 知识库