先给结论
RAG 和 Agent 结合的产物叫 Agentic RAG:把「检索」从一条固定流水线里的必走步骤,改成由模型按需调用的工具,并加上「检索结果是否相关」的判分与「不相关就改写问题重来」的循环。相比传统 RAG 「检索 → 拼接 → 生成」的一次性链路,它在问题表述模糊、需要多跳推理、需要联网补充这三种场景下准确率提升最明显,代价是多花几轮模型调用。
判断要不要上 Agentic RAG 的标准很朴素:如果你的用户提问里,超过三成是「问法不对导致检索不到」,就值得加循环;如果全是标准问答,老老实实用传统 RAG,别为了架构好看多烧 token 。
传统 RAG 卡在哪
传统流程是固定的三段式:问题向量化 → 检索相似片段 → 塞进提示词生成。问题在于这三步都没有纠错机会:
- 该不该检索不知道:用户打招呼也走一遍检索,浪费一轮。
- 问题问得不好无法补救:「那个功能怎么用」这种指代不清的提问,检索回来的东西必然不相关。
- 检索错了照样生成:召回的片段与问题无关时,模型仍会硬着头皮编一个看起来合理的答案。
- 知识库里没有就是没有:不会主动去外部补充。
Agentic RAG 的五个节点
用状态图(LangGraph 一类框架)把流程画成图,节点之间带条件边,就得到了一个能自我纠错的闭环:
- 生成查询或直接回答:模型判断这个问题需不需要查资料。不需要就直接回,需要就产出工具调用。
- 检索:把检索器包装成工具,由模型带着改写后的问题去调用。
- 文档相关性打分:用一个轻量模型对召回片段做二分类(相关/不相关)。这一步是整个架构的性价比核心,用便宜的小模型就够。
- 改写问题:判定不相关时,让模型换个说法重新提问,回到第 1 步。
- 生成答案:拿到相关上下文后生成,并在提示词里明确「不知道就说不知道」。
可直接照抄的图结构
from langgraph.graph import END, START, StateGraph
from langgraph.prebuilt import ToolNode
workflow = StateGraph(MessagesState)
workflow.add_node("generate_query_or_respond", generate_query_or_respond)
workflow.add_node("retrieve", ToolNode([retriever_tool]))
workflow.add_node("rewrite_question", rewrite_question)
workflow.add_node("generate_answer", generate_answer)
workflow.add_edge(START, "generate_query_or_respond")
workflow.add_conditional_edges("generate_query_or_respond", route_on_tool_calls,
{"tools": "retrieve", END: END})
workflow.add_conditional_edges("retrieve", grade_documents) # 相关 -> 生成 / 不相关 -> 改写
workflow.add_edge("generate_answer", END)
workflow.add_edge("rewrite_question", "generate_query_or_respond")
graph = workflow.compile()
三条边的含义:入口判断是否检索;检索后判分决定去生成还是去改写;改写后回到入口重来。整个架构的价值就在这三条边组成的小循环上。
三种升级路线怎么选
| 方案 | 做法 | 适合 | 代价 |
|---|---|---|---|
| 路由式 | 按问题类型选不同检索器 | 多数据源(文档/代码/工单) | 低 |
| 纠错式(CRAG) | 给检索质量打分,不达标就联网补 | 知识库覆盖不全 | 中 |
| 自反式(Self-RAG) | 生成时反复自评相关性、支持度 | 对准确性要求极高的场景 | 高,需要专门训练或复杂提示 |
实践建议从路由式开始,够用了就不往上加。每一次循环都会成倍增加 token 消耗,先量到质量提升再决定。
五个必踩的坑
① 打分节点用大模型:成本失控,换成小模型或结构化输出即可。
② 循环没有上限:改写三次仍不相关就应给出兜底回答,否则用户等到超时。
③ 工具描述含糊:模型不知道该不该调这个检索器,表现为「明明有资料却不检索」。
④ 提示词不写「把上下文当数据处理」:外部文档里夹带的指令会被模型执行,这是典型的间接提示词注入。
⑤ 不做引用回溯:答案里不带来源位置,用户无法核验,信任度归零。
② 循环没有上限:改写三次仍不相关就应给出兜底回答,否则用户等到超时。
③ 工具描述含糊:模型不知道该不该调这个检索器,表现为「明明有资料却不检索」。
④ 提示词不写「把上下文当数据处理」:外部文档里夹带的指令会被模型执行,这是典型的间接提示词注入。
⑤ 不做引用回溯:答案里不带来源位置,用户无法核验,信任度归零。
什么时候不该用 Agent 形态
- 固定问答场景:FAQ 、产品手册查询,一次检索就够了,加循环纯属浪费。
- 延迟敏感:每多一轮就是一次完整模型调用,实时对话场景要谨慎评估。
- 预算紧张:先跑传统 RAG 建立基线数据,确认瓶颈确实在「问法与检索不匹配」再上架构。
- 知识库本来就烂:切分混乱、文档过时的知识库,再聪明的循环也救不回来,先做数据治理。
相关阅读
Agentic RAG 比传统 RAG 贵多少?
取决于循环次数。每次改写加重新检索都是一轮模型调用,实践中常把改写上限设为 2-3 次,并用小模型做相关性打分来控制成本。
一定要用 LangGraph 吗?
不是必须。核心是「带条件分支和回环的状态图」,你用普通代码写 while 循环加判断也能实现,框架只是让图结构更清晰、便于可视化与断点调试。
相关性打分用哪个模型?
建议用便宜、响应快的小模型配合结构化输出(返回 yes/no),它被高频调用,用旗舰模型不划算。
怎么判断该不该加这个架构?
先在传统 RAG 上统计失败案例:如果失败主要集中在「检索不相关」而非「模型不会答」,加循环就是对症下药;否则先把钱花在数据清洗与切分策略上。









评论 (0)