跳转到正文
技术教程·

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 文档调整。

常见问题

相关推荐

获取更多 AI 内容

订阅更新,第一时间获取新教程和工具推荐。