文件名 Agentic RAG:从线性流水线到自主决策的检索增强.md

Agentic RAG:从线性流水线到自主决策的检索增强

本文目录

正文

本文配套一段 QA 对话整理而成。原对话给出了 Agentic RAG 的整体轮廓,但有若干用词/选型上的不准确之处,本文在「易错点澄清」一节集中给出更精确的版本,并在正文中扩展了完整架构、代码示例与工程经验。

一、Agentic RAG 是什么

Agentic RAG(代理式检索增强生成)是把「自主智能体(Agent)」的决策循环嵌入到 RAG 流程里的高级范式。

与其把它说成「传统 RAG 是线性流水线,Agentic RAG 是带 Agent 的流水线」,更准确的描述是:

  • 朴素 RAG(Naive RAG):固定流水线,Retrieve → Augment → Generate,只走一趟,对就是对、错就是错。
  • 高级 / 模块化 RAG:在检索前后插入查询改写、Rerank、HyDE 等模块,但流程仍由开发者静态编排
  • Agentic RAG:把「下一步做什么」交给一个 LLM 驱动的 Agent 在运行时决策——它可以选择检索哪个数据源、改写查询、再检索一次、调用计算工具、放弃检索改用网页搜索、甚至判断「这题不用查、直接答就行」。

核心区别不在「是否使用了 LLM」(朴素 RAG 也用 LLM),而在于 控制流(control flow)是否由 LLM 自身决定

注:原 QA 中说「大模型不再只是最后的”文字包装工”」容易引起误解。LLM 的角色并没有变,变的是架构层面给它授予了哪些权力——工具调用、自我反思、循环执行。

二、完整架构

一个生产级 Agentic RAG 系统通常包含五层。

┌─────────────────────────────────────────────────────────────┐
│                      用户问题 (Query)                          │
└──────────────────────────────┬──────────────────────────────┘
                               │
┌──────────────────────────────▼──────────────────────────────┐
│ 1. 意图理解与路由 (Query Understanding & Routing)             │
│    - 改写 (Rewrite / HyDE / Step-Back)                       │
│    - 分类 (闲聊 / 简单事实 / 复杂多跳 / 计算 / SQL ...)        │
│    - 路由到下游工具/数据源                                     │
└──────────────────────────────┬──────────────────────────────┘
                               │
┌──────────────────────────────▼──────────────────────────────┐
│ 2. 工具/动作层 (Tooling Layer)                                │
│    Vector Search │ BM25 │ SQL │ Graph │ Web │ Code Interpreter│
└──────────────────────────────┬──────────────────────────────┘
                               │
┌──────────────────────────────▼──────────────────────────────┐
│ 3. 决策循环 (Reasoning Loop) ← Agentic RAG 的核心            │
│    Thought → Action → Observation → Reflection → ...         │
│    常见模式:ReAct / Plan-and-Execute / Reflexion             │
└──────────────────────────────┬──────────────────────────────┘
                               │
┌──────────────────────────────▼──────────────────────────────┐
│ 4. 记忆 (Memory)                                              │
│    短期:对话历史、Scratchpad                                  │
│    长期:用户画像、过往结论(向量化或 KV 存储)                  │
└──────────────────────────────┬──────────────────────────────┘
                               │
┌──────────────────────────────▼──────────────────────────────┐
│ 5. 答案合成与引用 (Synthesis & Citation)                       │
└─────────────────────────────────────────────────────────────┘

2.1 意图理解与路由

收到用户问题后的第一步,决定后续整条链路。常见子任务:

子任务 作用 典型实现
查询改写 把口语化/带指代的查询变成更适合检索的表达 LLM Rewrite、HyDE、Step-Back Prompting
查询分解 把复杂问题拆成多个子问题 Decomposition、Least-to-Most
路由 选择数据源(结构化 / 非结构化 / 实时) 分类器、LLM Function Call、规则

易错点:很多人在朴素 RAG 上直接套一个改写模块,就以为做了 Agentic。路由 + 反思才是 Agentic 的入门门槛。

2.2 工具/动作层

检索只是众多工具中的一种。一个典型工具箱:

  • Vector Search:语义检索,处理「意思相近但措辞不同」的问题。
  • BM25 / 关键词:处理专有名词、产品编号、错别字等向量检索翻车的情况。
  • 混合检索 + RRF:BM25 与向量结果用 Reciprocal Rank Fusion 融合。
  • SQL / Text-to-SQL:结构化数据。例如订单、报表。
  • Graph / Cypher:知识图谱多跳查询。
  • Web Search:实时信息(Tavily、Serper、Brave Search、Exa 等)。
  • Code Interpreter:数学/统计/数据处理。
  • 业务 API:天气、股价、内部 CRM 接口。

2.3 决策循环

这是 Agentic RAG 与传统 RAG 真正的分水岭。常见三种循环模式:

(a) ReAct(Yao et al., 2022)——Thought / Action / Observation 交错,最常用。

Q: 我们公司 2024 年的净利润比 2023 年增长了多少?
Thought: 我需要先找到 2023 和 2024 年的净利润数据。
Action: vector_search("2023 2024 年度净利润")
Observation: 检索到「2024 财报:营业收入 120 亿,净利润 8.4 亿;2023 财报:净利润 7.0 亿」
Thought: 拿到数据了,计算增长率 (8.4-7.0)/7.0 = 20%。
Action: finish("约 20%")

(b) Plan-and-Execute(Wang et al., 2023)——先一次性生成完整计划,再串行执行,适合复杂多步骤任务。

(c) Reflexion(Shinn et al., 2023)——在生成后增加一个「自我批评」步骤,发现错误就重做。

更专门的 RAG 反思模式:

  • Self-RAG(Asai et al., 2023):LLM 在生成过程中输出 [Retrieve] / [NoRetrieve] / [Critique] 等反思 token,自主决定何时检索、何时停止。
  • CRAG(Corrective RAG)(Yan et al., 2024):检索后用评估器打分,低质量结果触发网页搜索兜底重写后重检
  • Adaptive-RAG(Jeong et al., 2024):用一个小分类器根据问题复杂度选「不检索 / 单次检索 / 多步检索」。

2.4 记忆

  • 短期记忆:当前会话上下文、ReAct scratchpad、已访问工具的中间结果。
  • 长期记忆:跨会话的用户偏好、历史结论。可以放在向量库(语义查询)或 KV 库(精确查询)中。
  • 实践上要小心:记忆不是越多越好,无关历史会污染检索和生成,需要做 summary 或滑动窗口裁剪。

2.5 答案合成与引用

  • 收敛多轮观察得到的证据,组装成最终 Prompt。
  • 强制要求 LLM 在答案中引用来源(chunk_id / URL / 表名),便于追溯和审计。
  • 对于高风险场景(医疗/法律/金融),加一道事实校验(claim verification)。

三、技术栈选型

推荐组件 备注
编排框架 LangGraph(首选)、LlamaIndex Agents、AutoGen、CrewAI LangGraph 提供「状态图 + 循环」语义,比纯 LangChain 链条更适合 Agentic
LLM(决策大脑) Claude Opus 4.8 / Sonnet 4.6、GPT-5 / GPT-5-mini、Qwen3-Max、DeepSeek-V3.x 必须具备稳定的 Function Calling / Tool Use 能力
LLM(轻量节点) Claude Haiku 4.5、GPT-5-nano、Qwen3-7B/32B 用于路由分类、改写、reranker prompt 等高频低复杂度调用
Embedding BGE-M3text-embedding-3-large、Nomic Embed、Voyage-3 BGE-M3 同时支持稠密 / 稀疏 / multi-vector
Reranker bge-reranker-v2-m3、Cohere Rerank v3、Jina Reranker Cross-Encoder,召回后做精排
向量库 Milvus、Qdrant、Weaviate、PGVector、Pinecone(云托管 SaaS) 中大规模优先 Milvus / Qdrant;小项目可用 Chroma / PGVector
稀疏检索 Elasticsearch / OpenSearch(BM25)、Tantivy 与向量结果用 RRF 融合
图谱 Neo4j、NebulaGraph、Kùzu 配合 GraphRAG / Microsoft GraphRAG
Web 搜索 Tavily、Serper、Brave Search、Exa Bing Search API 已于 2025 年下线,原文档要避坑
观测/评测 LangSmith、Arize Phoenix、Ragas、TruLens 必须能看到每一步 Thought/Action,否则无法调优

易错点:很多教程仍然推荐 GPT-4o / Claude 3.5 Sonnet / Bing Search API——这些在 2026 年都已过时。选型时记得查最新型号;本博客的 claude-api 参考表里有 Claude 全系最新 ID。

四、最小可运行示例(LangGraph)

下面给出一个能跑通的最小 Agentic RAG:路由 → 工具循环 → 反思 → 答案。

# pip install langgraph langchain langchain-anthropic langchain-community
from typing import TypedDict, Annotated, List
from langgraph.graph import StateGraph, END
from langgraph.graph.message import add_messages
from langchain_anthropic import ChatAnthropic
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
from langchain_core.tools import tool

# ---- 1. 工具定义 ----
@tool
def vector_search(query: str) -> str:
    """从公司内部知识库做语义检索,返回相关片段。"""
    # 这里替换成你的 Milvus / Qdrant 检索
    return f"[KB] 与「{query}」最相关的 3 段内容:..."

@tool
def web_search(query: str) -> str:
    """当内部知识库不足以回答(如时效性问题)时,调用 Tavily 联网搜索。"""
    # 这里替换成 tavily / serper SDK
    return f"[WEB] 搜索「{query}」的前 5 条结果摘要:..."

@tool
def python_repl(code: str) -> str:
    """执行 Python 计算(数学、统计、单位换算)。"""
    # 生产环境用沙箱
    return str(eval(code, {"__builtins__": {}}, {}))

tools = [vector_search, web_search, python_repl]

# ---- 2. 状态 ----
class AgentState(TypedDict):
    messages: Annotated[List, add_messages]

# ---- 3. LLM(开启 tool calling) ----
llm = ChatAnthropic(model="claude-sonnet-4-6").bind_tools(tools)

# ---- 4. 节点 ----
def agent_node(state: AgentState):
    """大脑:决定下一步是调工具还是直接答。"""
    response = llm.invoke(state["messages"])
    return {"messages": [response]}

def tool_node(state: AgentState):
    """执行 LLM 选中的工具。"""
    last = state["messages"][-1]
    outputs = []
    for call in last.tool_calls:
        fn = {t.name: t for t in tools}[call["name"]]
        result = fn.invoke(call["args"])
        outputs.append(ToolMessage(content=str(result), tool_call_id=call["id"]))
    return {"messages": outputs}

def should_continue(state: AgentState) -> str:
    """循环条件:LLM 还要不要继续调工具?"""
    last = state["messages"][-1]
    return "tools" if last.tool_calls else END

# ---- 5. 组图 ----
graph = StateGraph(AgentState)
graph.add_node("agent", agent_node)
graph.add_node("tools", tool_node)
graph.set_entry_point("agent")
graph.add_conditional_edges("agent", should_continue, {"tools": "tools", END: END})
graph.add_edge("tools", "agent")  # 关键:执行完工具回到 agent,形成循环

app = graph.compile()

# ---- 6. 跑一下 ----
SYSTEM = """你是带工具的助手。回答前请思考:
1) 这个问题需要查内部知识库吗?→ vector_search
2) 涉及时效性(新闻/最新数据)吗?→ web_search
3) 需要计算吗?→ python_repl
4) 检索结果不充分时,请改写查询再试一次(最多 3 次)。
最终答案需引用证据来源。"""

result = app.invoke({
    "messages": [
        AIMessage(content=SYSTEM),
        HumanMessage(content="我们 2024 年的客户留存率比 2023 年提升了多少个百分点?")
    ]
})
print(result["messages"][-1].content)

这段代码的循环结构 agent ⇄ tools 就是 Agentic RAG 的骨架。你可以在 agent_node 之后再插一个 reflect_node 来实现 Reflexion,或者在入口加一个 route_node 实现路由式分发。

五、易错点澄清(针对原 QA 对话)

# 原说法 问题 更准确的说法
1 agntic rag 拼写错误 Agentic RAG(”agent” + “-ic”)
2 「大模型不再只是最后的”文字包装工”」 误导:LLM 角色没变 LLM 仍是同一个 LLM,只是被赋予了工具调用反思能力;变化在架构层而非模型层
3 「传统 RAG = 线性流水线 vs Agentic RAG = 引入 Agent」 二分法过粗 中间还有「Advanced RAG / Modular RAG / Self-RAG / CRAG / Adaptive-RAG」等过渡形态
4 「ReAct 循环就是 Agentic RAG」 ReAct 只是诸多模式之一 还有 Plan-and-ExecuteReflexionSelf-RAGCRAG 等,应按任务复杂度选择
5 推荐 LLM「GPT-4o、Claude 3.5 Sonnet」 2026 年已过时 GPT-5 系列、Claude Opus 4.8 / Sonnet 4.6 / Haiku 4.5、Qwen3-Max、DeepSeek-V3.x
6 推荐 Web 搜索「Tavily、Bing API」 Bing Search API 已于 2025 年下线 Tavily、Serper、Brave Search、Exa;Bing 用户需迁移
7 BGE-m3 大小写不规范 BGE-M3(官方写法)
8 把 Pinecone 单独列为「云原生」 用词模糊 Pinecone 是云托管 SaaS 向量库;Milvus/Qdrant/Weaviate 都有云托管版本,”云原生” 区分意义不大
9 「直到得出完美的结论」 过度承诺 Agentic RAG 提高了上限,但仍可能幻觉;必须配合引用、事实校验、人工兜底
10 没提观测/评测 工程上遗漏严重 必须加 LangSmith / Phoenix / Ragas 等工具,看到每一步 Thought / Action / Observation,否则无法定位坏 case

六、什么时候不要用 Agentic RAG

Agentic RAG 不是银弹。以下场景反而应该退回简单 RAG:

  • 延迟敏感:多轮工具调用容易让响应时间从 2s 涨到 20s+。客服首屏问答慎用。
  • 成本敏感:每一次 Thought 都是一次 LLM 调用,token 消耗成倍。
  • 任务足够单一:固定的产品手册问答、单一 SQL 报表查询,写死的流程更稳。
  • 可解释性要求极高:Agent 的循环路径有时不可重复,审计困难。

经验法则:先把 Naive RAG / Hybrid RAG 调到位,再决定哪一段加 Agent

七、小结

  • Agentic RAG 的本质是把「下一步做什么」从开发者手里交给 LLM,靠工具调用 + 反思循环获得更强的鲁棒性。
  • 完整架构 = 路由 + 工具层 + 决策循环 + 记忆 + 合成;五层缺一不可。
  • 选型上记得跟上模型迭代(Claude 4.X / GPT-5),并选用合适的编排框架(LangGraph 是当前事实标准)。
  • 工程化落地的关键不在算法,而在 观测 + 评测 + 兜底

延伸阅读: