Agentic RAG:自主检索的智能体
什么是 Agentic RAG
Section titled “什么是 Agentic RAG”传统 RAG 是一条固定流水线:问题进来 → 检索 → 生成。无论问题是什么,都走同样的流程。
Agentic RAG 则让 Agent 自主决定:要不要检索?检索什么?从哪里检索?检索结果够不够?不够要不要再检索?
类比:传统 RAG 像一个只会按固定流程查资料的实习生,Agentic RAG 像一个经验丰富的研究员——他知道什么时候该查文献、查哪个数据库、查到的结果是否靠谱。
传统 RAG
问题 → 检索 → 生成
(固定流水线)
(固定流水线)
Agentic RAG
问题 → Agent 自主思考:
· 需要检索吗?
· 查哪个数据源?
· 结果够吗?
· 换角度再查?
→ 自主决策 → 生成
· 需要检索吗?
· 查哪个数据源?
· 结果够吗?
· 换角度再查?
→ 自主决策 → 生成
与传统 RAG 的区别
Section titled “与传统 RAG 的区别”| 维度 | 传统 RAG | Agentic RAG |
|---|---|---|
| 检索决策 | 每次都检索 | Agent 判断是否需要检索 |
| 数据源 | 固定一个 | 可动态选择多个数据源 |
| 检索次数 | 固定一次 | 可迭代多次 |
| 结果评估 | 无 | Agent 评估结果质量 |
| 适应性 | 低 | 高 |
路由式 RAG
Section titled “路由式 RAG”根据查询类型,将问题路由到不同的数据源或处理流程。
flowchart TD
Q["用户问题"] --> Router["Router Agent"]
Router --> Tech["技术文档库"]
Router --> FAQ["产品 FAQ 库"]
Router --> HR["人事政策库"]
Router --> Direct["直接回答\n(无需检索)"]
Tech --> LLM["LLM 生成回答"]
FAQ --> LLM
HR --> LLM
Direct --> LLM
from openai import OpenAI
client = OpenAI()
DATASOURCES = { "technical": "技术文档向量库,包含 API 文档、架构设计", "product": "产品 FAQ 库,包含功能说明、定价信息", "hr": "人事政策库,包含请假制度、报销流程", "none": "问题可以直接回答,不需要检索",}
def route_query(question: str) -> str: """让 LLM 决定应该查询哪个数据源""" response = client.chat.completions.create( model="gpt-4o-mini", messages=[{ "role": "system", "content": f"""根据用户问题,选择最合适的数据源。可选数据源:{chr(10).join(f'- {k}: {v}' for k, v in DATASOURCES.items())}
只返回数据源名称,不要解释。""" }, { "role": "user", "content": question, }], ) return response.choices[0].message.content.strip()
# 使用source = route_query("如何申请年假?")print(f"路由到: {source}") # → "hr"迭代式 RAG
Section titled “迭代式 RAG”Agent 检索后评估结果,不满意则调整查询重新检索。
flowchart TD
Q["问题"] --> GenQ["生成查询"] --> Retrieve["检索"]
Retrieve --> Eval{"评估结果质量"}
Eval -->|"足够"| Answer["生成回答"]
Eval -->|"不足够"| Rewrite["改写查询"] --> Retrieve
def agentic_rag(question: str, max_iterations: int = 3) -> str: """迭代式 Agentic RAG""" context_docs = [] current_query = question
for i in range(max_iterations): # 1. 检索 new_docs = retrieve(current_query, top_k=3) context_docs.extend(new_docs)
# 2. 评估检索结果是否足够 eval_response = client.chat.completions.create( model="gpt-4o-mini", messages=[{ "role": "system", "content": """判断检索到的文档是否足以回答用户问题。如果足够,返回 JSON: {"sufficient": true}如果不足,返回 JSON: {"sufficient": false, "follow_up_query": "需要进一步检索的查询"}""" }, { "role": "user", "content": f"问题: {question}\n\n检索到的文档:\n{chr(10).join(context_docs)}", }], )
eval_result = json.loads(eval_response.choices[0].message.content)
if eval_result["sufficient"]: break else: current_query = eval_result["follow_up_query"] print(f"第 {i+1} 轮检索不足,改写查询: {current_query}")
# 3. 生成最终回答 context = "\n---\n".join(context_docs) response = client.chat.completions.create( model="gpt-4o", messages=[{ "role": "system", "content": f"根据以下参考资料回答问题,注明信息来源。\n\n参考资料:\n{context}", }, { "role": "user", "content": question, }], ) return response.choices[0].message.contentAgentic RAG 是 2025-2026 年 AI Engineer 面试的热门话题:
Q: Agentic RAG 与传统 RAG 的本质区别是什么?
查看答案
决策权从固定流程转移到 Agent。传统 RAG 每次都走「检索→生成」的固定管线;Agentic RAG 由 Agent 自主决定是否检索、检索哪个数据源、结果是否足够、是否需要重新检索。
Q: 何时使用 Agentic RAG 而非传统 RAG?
查看答案
多数据源、查询复杂度变化大、需要多步推理的场景。如果查询模式单一且数据源固定,传统 RAG 更简单可靠。
Q: Agentic RAG 的成本如何权衡?
查看答案
Agentic RAG 的 LLM 调用次数更多(路由判断、结果评估、查询改写),需要考虑延迟和成本。可通过设置最大迭代次数、使用小模型做路由/评估来控制。
Q: 如何评估 Agentic RAG 的效果?
查看答案
分环节评估:检索用 Recall@K / MRR / NDCG(参见 ch04-04 评估指标),生成用 Answer Relevancy / Faithfulness,整体用端到端准确率。
自测题 1:Agentic RAG 比传统 RAG 多了哪些决策能力?
是否需要检索、检索哪个数据源、检索结果是否足够、是否需要改写查询重新检索。
自测题 2:路由式 RAG 和迭代式 RAG 分别解决什么问题?
路由式解决「查哪里」的问题(多数据源选择);迭代式解决「查到没有」的问题(结果质量评估和反复检索)。
自测题 3:Agentic RAG 的主要缺点是什么?
LLM 调用次数增多导致延迟增加和成本上升;Agent 的决策本身可能出错(如错误路由、不必要的重复检索)。
- 无限循环检索:迭代式 RAG 中 Agent 反复判断「结果不足」并重新检索,陷入死循环。务必设置
max_iterations上限。 - 路由判断不稳定:同一问题多次请求可能被路由到不同数据源。建议用 few-shot examples 在路由 prompt 中提供示例,或用 temperature=0 减少随机性。
- 评估环节成为瓶颈:用大模型(如 GPT-4o)做结果质量评估会显著增加延迟。可用小模型(如 GPT-4o-mini)做评估,或用简单规则(如检索得分阈值)替代。