Agentic RAG 教程:让检索系统会规划和追问
Agentic RAG 教程:在传统 RAG 基础上引入 Agent 能力,让检索系统自动判断是否需要更多信息、主动追问和多步检索,显著提升复杂问题的回答质量。
这篇教程适合你吗
你已经搭过基础 RAG 系统(可以看 RAG 教程),但发现它在复杂问题上经常「答非所问」——检索到了不相关的片段,或者需要的信息分散在多个文档里。Agentic RAG 就是为了解决这些问题。
不适合:没搭过 RAG 的读者。建议先看 RAG 教程。 最终产物:一个能自动判断检索质量、主动改写查询、多步检索的 Agentic RAG 系统。环境假设
- Python 3.9+
- 已有基础 RAG 经验
- LangChain 或类似框架
普通 RAG 的问题
普通 RAG 的流程是固定的:
用户问题 → 向量检索 → 取 Top-K 片段 → 喂给 LLM → 生成答案
问题在于:
- 检索不准确:用户问「A 和 B 的关系是什么」,向量检索可能只找到提到 A 或 B 的片段,找不到同时讨论两者关系的。
- 信息分散:答案可能需要综合 3 个文档的 5 个片段,但 Top-3 只覆盖了其中 2 个。
- 问题含糊:用户问「这个方案怎么样」,但没说「哪个方案」。
Agentic RAG 的核心思路
在 RAG 流程中加入一个「判断」环节:
用户问题 → 检索 → LLM 评估:信息够吗?
├─ 够 → 生成答案
└─ 不够 → 改写查询 / 追问用户 / 换检索策略 → 再次检索
关键是让 LLM 做决策,而不是你硬编码流程。
第一步:搭建基础检索器
假设你已经有了向量数据库和 Embedding:
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# 加载已有的向量数据库
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
第二步:实现检索质量评估
让 LLM 判断检索到的内容是否足够回答问题:
from openai import OpenAI
client = OpenAI()
def assess_retrieval(question: str, documents: list[str]) -> dict:
"""让 LLM 评估检索结果是否足够回答问题"""
docs_text = "\n\n".join([f"[文档{i+1}] {doc}" for i, doc in enumerate(documents)])
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是检索质量评估助手。判断以下文档是否足够回答用户问题。"},
{"role": "user", "content": f"""用户问题:{question}
检索到的文档:
{docs_text}
请判断:
- 这些文档是否足够完整回答问题?
- 如果不够,缺少什么信息?
- 建议如何改进检索查询?
返回 JSON 格式:{{"sufficient": true/false, "missing": "...", "suggested_query": "..."}}"""}
],
response_format={"type": "json_object"}
)
import json
return json.loads(response.choices[0].message.content)
第三步:实现查询改写
如果评估结果显示信息不足,让 LLM 改写查询:
def rewrite_query(original_query: str, missing_info: str) -> str:
"""让 LLM 根据缺失信息改写检索查询"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是查询优化助手。根据用户的原始问题和缺失信息,生成更好的检索查询。"},
{"role": "user", "content": f"原始问题:{original_query}\n缺失信息:{missing_info}\n\n请生成一个更精确的检索查询。"}
]
)
return response.choices[0].message.content.strip()
第四步:组装 Agentic RAG 循环
把上面的组件组合成一个完整的循环:
def agentic_rag(question: str, max_iterations: int = 3) -> str:
"""Agentic RAG 主循环"""
current_query = question
all_documents = []
for iteration in range(max_iterations):
# 检索
docs = retriever.invoke(current_query)
doc_texts = [doc.page_content for doc in docs]
all_documents.extend(doc_texts)
# 去重
all_documents = list(dict.fromkeys(all_documents))
# 评估检索质量
assessment = assess_retrieval(question, all_documents)
if assessment["sufficient"]:
# 信息足够,生成最终答案
return generate_answer(question, all_documents)
if iteration < max_iterations - 1:
# 信息不足,改写查询继续检索
current_query = rewrite_query(question, assessment["missing"])
print(f"第 {iteration+1} 轮检索不充分,改写查询: {current_query}")
# 达到最大轮数,用已有信息生成答案
return generate_answer(question, all_documents)
def generate_answer(question: str, documents: list[str]) -> str:
"""基于检索结果生成答案"""
docs_text = "\n\n".join(documents)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "基于提供的文档内容回答用户问题。如果文档中没有相关信息,请明确说明。"},
{"role": "user", "content": f"文档内容:\n{docs_text}\n\n问题:{question}"}
]
)
return response.choices[0].message.content
运行效果
answer = agentic_rag("LangChain 和 LlamaIndex 在 RAG 场景下各有什么优势?")
# 第 1 轮检索只找到了 LangChain 的介绍
# 自动改写查询,第 2 轮找到了 LlamaIndex 的内容
# 第 3 轮找到了两者的对比分析
# 最终生成综合答案
进阶方向
- 加入追问能力:当问题含糊时,让 Agent 主动向用户提问澄清
- 多数据源检索:同时查向量数据库、SQL 数据库、网络搜索,让 Agent 决定用哪个
- 检索结果缓存:对常见查询缓存检索结果,减少重复调用
常见问题与排错
循环一直不收敛
原因:评估函数过于严格,总觉得信息不够。 解决:在评估 prompt 中加入「如果已有信息能回答问题的主要方面,即使不是 100% 完整,也标记为 sufficient」。成本太高
原因:每轮循环都要调用 LLM。 解决:设置max_iterations=2(大多数情况够用);对评估步骤用更便宜的模型(如 GPT-4o-mini);缓存常见查询的检索结果。
进阶学习
总结
- Agentic RAG = 基础 RAG + Agent 的判断和规划能力
- 核心是让 LLM 评估检索质量、自动改写查询、多步检索
- 适合复杂、多跳、信息分散的问题
- 通过限制最大轮数和缓存控制成本
---
本文最后更新于 2026-07-27。代码示例基于当前常见版本,请根据最新 API 文档调整。常见问题
相关推荐
RAG 是什么?用外部知识增强大模型回答的实用方案
RAG(检索增强生成)是什么?从实际项目经验出发,解释 RAG 的工作原理、与微调的区别、常见坑点,以及什么场景该用什么场景不该用。
向量数据库是什么?为什么 RAG 和 Agent 都需要它
向量数据库是什么?从实际项目需求出发,解释向量数据库解决什么问题、和传统数据库的区别、主流产品怎么选,以及什么场景不需要它。
RAG 教程:从零搭建检索增强生成系统
RAG 教程:从零开始搭建检索增强生成系统。本文使用 LangChain 和 Chroma 向量数据库,手把手教你实现一个基于私有知识库的 AI 问答系统。
AI 工作流是什么?Agent、自动化和低代码平台的关系
AI 工作流是什么?解释 AI 工作流的概念、与传统自动化的区别,以及 Dify、Coze 等平台如何构建 AI 工作流。
获取更多 AI 内容
订阅更新,第一时间获取新教程和工具推荐。