前四篇我们把基础RAG和Advanced RAG都讲完了——混合检索、Rerank重排序这些已经是生产标配。但有些场景,光靠"检索→重排→生成"这条线性流水线还是搞不定:

用户问"A公司的CEO之前在哪家公司任职?"——这个答案可能分散在三份不同的文档里,需要先找到CEO是谁,再找他之前的任职经历,两次检索的结果要串联起来。这就是多跳推理,基础RAG做不到。

再比如用户问"帮我分析一下这个季度的销售趋势"——这种开放性问题没有标准答案,Agent需要自己规划检索策略、多步获取数据、整合分析。这就是Agentic RAG

今天这篇讲RAG的前沿架构:查询改写、多跳检索、GraphRAG、Agentic RAG。这些不是每个项目都用得上,但当你遇到基础RAG搞不定的场景时,它们就是你的杀手锏。

查询改写:让检索词更"对路"

用户问的问题往往不是最优的检索query。比如用户问"怎么退货",但文档里写的是"退换货流程"——用"怎么退货"去检索可能找不到。

方式1:LLM改写

让模型把用户问题改写成更适合检索的query:

<span><span leaf="">from</span></span><span leaf="">&nbsp;langchain_core.prompts&nbsp;</span><span><span leaf="">import</span></span><span leaf="">&nbsp;ChatPromptTemplate</span><span leaf=""><br></span><span><span leaf="">from</span></span><span leaf="">&nbsp;langchain_core.output_parsers&nbsp;</span><span><span leaf="">import</span></span><span leaf="">&nbsp;StrOutputParser</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">rewrite_prompt = ChatPromptTemplate.from_template(</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">"""请将以下用户问题改写为更适合检索的查询词。</span><span leaf=""><br></span><span leaf="">要求:</span><span leaf=""><br></span><span leaf="">1. 补充同义词和相关术语</span><span leaf=""><br></span><span leaf="">2. 使用文档中可能出现的正式表述</span><span leaf=""><br></span><span leaf="">3. 输出3个不同角度的检索query</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">用户问题:{question}</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">改写结果(每行一个):"""</span></span><span leaf=""><br></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">rewrite_chain = rewrite_prompt | model | StrOutputParser()</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 用户问"怎么退货"</span></span><span leaf=""><br></span><span leaf="">queries = rewrite_chain.invoke({</span><span><span leaf="">"question"</span></span><span leaf="">:&nbsp;</span><span><span leaf="">"怎么退货"</span></span><span leaf="">})</span><span leaf=""><br></span><span><span leaf=""># 输出:</span></span><span leaf=""><br></span><span><span leaf=""># 1. 退换货流程 退货条件 退货申请</span></span><span leaf=""><br></span><span><span leaf=""># 2. 商品退货政策 无理由退货 退货时限</span></span><span leaf=""><br></span><span><span leaf=""># 3. 退货操作步骤 退款流程 售后服务</span></span><span leaf=""><br></span>

然后对每个query分别检索,合并结果去重。

方式2:HyDE(假设文档嵌入)

HyDE的思路很巧妙:先让模型猜一个答案,用答案去检索。因为答案的表述更接近文档中的写法,检索效果比用原始问题好。

<span leaf="">hyde_prompt = ChatPromptTemplate.from_template(</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">"""请回答以下问题。即使你不确定,也请给出你的最佳猜测。</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">问题:{question}</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">回答:"""</span></span><span leaf=""><br></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">hyde_chain = hyde_prompt | model | StrOutputParser()</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 用户问"怎么退货"</span></span><span leaf=""><br></span><span leaf="">hypothetical_answer = hyde_chain.invoke({</span><span><span leaf="">"question"</span></span><span leaf="">:&nbsp;</span><span><span leaf="">"怎么退货"</span></span><span leaf="">})</span><span leaf=""><br></span><span><span leaf=""># 输出:"退货流程如下:1. 在订单详情页点击申请退货;2. 选择退货原因..."</span></span><span leaf=""><br></span><span><span leaf=""># 用这段"假设答案"去检索,比用"怎么退货"效果好很多</span></span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">results = vectorstore.similarity_search(hypothetical_answer, k=</span><span><span leaf="">5</span></span><span leaf="">)</span><span leaf=""><br></span>

HyDE在我测试中,对短query(5个字以内)的提升最明显,平均召回率提升15%左右。 但对已经很明确的query反而可能降低效果——模型猜的答案跑偏了,检索方向也就偏了。

方式3:Step-back Prompting

让模型先问一个更宏观的问题,用宏观答案提供上下文,再检索具体问题:

<span leaf="">stepback_prompt = ChatPromptTemplate.from_template(</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">"""你是一个问题抽象专家。请将以下具体问题抽象为一个更宏观的问题。</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">具体问题:{question}</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">宏观问题:"""</span></span><span leaf=""><br></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 用户问"2025年Q3北京办公室的差旅报销上限是多少"</span></span><span leaf=""><br></span><span><span leaf=""># → 宏观问题:"公司差旅报销政策的总体框架是什么"</span></span><span leaf=""><br></span><span><span leaf=""># 先检索宏观问题获取背景知识,再检索具体问题</span></span><span leaf=""><br></span>

多跳检索:把复杂问题拆成多步

单次检索只能处理"单跳"问题——答案在一个文档里。对于需要跨文档推理的"多跳"问题,需要多步检索:

<span leaf="">问题:</span><span><span leaf="">"A公司CEO之前在哪工作?"</span></span><span leaf=""><br></span><span leaf="">Step 1:检索</span><span><span leaf="">"A公司CEO是谁"</span></span><span leaf="">&nbsp;→ 找到</span><span><span leaf="">"张三是A公司CEO"</span></span><span leaf=""><br></span><span leaf="">Step 2:检索</span><span><span leaf="">"张三之前的工作经历"</span></span><span leaf="">&nbsp;→ 找到</span><span><span leaf="">"张三2020-2023年在B公司任CTO"</span></span><span leaf=""><br></span><span leaf="">→ 最终答案:A公司CEO张三之前在B公司任CTO</span><span leaf=""><br></span>

实现方式1:迭代检索

<span><span><span leaf="">def</span></span><span leaf="">&nbsp;</span><span><span leaf="">multi_hop_search</span></span><span><span leaf="">(query, max_hops=</span><span><span leaf="">3</span></span><span leaf="">)</span></span><span leaf="">:</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">"""多跳检索:每一步基于上一步的结果生成新的query"""</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; all_context = []</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; current_query = query</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">for</span></span><span leaf="">&nbsp;hop&nbsp;</span><span><span leaf="">in</span></span><span leaf="">&nbsp;range(max_hops):</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span><span leaf=""># 检索</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; results = retriever.invoke(current_query)</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; all_context.extend(results)</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span><span leaf=""># 让模型判断:当前信息够不够回答原始问题?</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; judge_prompt =&nbsp;</span><span><span leaf="">f"""基于以下信息,能否回答原始问题?</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span leaf=""><br></span><span leaf="">原始问题:</span><span><span leaf="">{query}</span></span><span leaf=""><br></span><span leaf="">已有信息:</span><span><span leaf="">{[r.page_content&nbsp;</span><span><span leaf="">for</span></span><span leaf="">&nbsp;r&nbsp;</span><span><span leaf="">in</span></span><span leaf="">&nbsp;all_context]}</span></span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">如果信息不够,请给出下一步应该检索的问题。</span><span leaf=""><br></span><span leaf="">如果信息足够,请回复"ENOUGH"。</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span leaf=""><br></span><span leaf="">下一步检索问题:"""</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; next_query = model.invoke(judge_prompt).content</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span><span leaf="">if</span></span><span leaf="">&nbsp;</span><span><span leaf="">"ENOUGH"</span></span><span leaf="">&nbsp;</span><span><span leaf="">in</span></span><span leaf="">&nbsp;next_query:</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span><span leaf="">break</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; current_query = next_query</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">return</span></span><span leaf="">&nbsp;all_context</span><span leaf=""><br></span>

实现方式2:用Agent做多跳

用LangChain的create_agent,把检索工具交给Agent,让它自己决定检索几次:

<span><span leaf="">from</span></span><span leaf="">&nbsp;langchain.agents&nbsp;</span><span><span leaf="">import</span></span><span leaf="">&nbsp;create_agent</span><span leaf=""><br></span><span leaf=""><br></span><span><span><span leaf="">def</span></span><span leaf="">&nbsp;</span><span><span leaf="">search_knowledge_base</span></span><span><span leaf="">(query: str)</span></span><span leaf="">&nbsp;-&gt; str:</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">"""搜索公司知识库"""</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; results = retriever.invoke(query)</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">return</span></span><span leaf="">&nbsp;</span><span><span leaf="">"\n"</span></span><span leaf="">.join([r.page_content&nbsp;</span><span><span leaf="">for</span></span><span leaf="">&nbsp;r&nbsp;</span><span><span leaf="">in</span></span><span leaf="">&nbsp;results])</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">agent = create_agent(</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; model=</span><span><span leaf="">"gpt-4o"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; tools=[search_knowledge_base],</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; system_prompt=</span><span><span leaf="">"""你是一个研究助手。对于复杂问题,你可能需要多次检索。</span><span leaf=""><br></span><span leaf="">每次检索后,判断信息是否足够。如果不够,换一个query继续检索。</span><span leaf=""><br></span><span leaf="">最多检索5次。"""</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf="">)</span><span leaf=""><br></span>

GraphRAG:用知识图谱增强检索

GraphRAG是微软在2024年提出、2025年持续火热的方向。核心思想:把文档中的实体和关系抽取出来构建知识图谱,用图的结构化信息增强检索。

GraphRAG vs 向量RAG

| 维度

|

向量RAG

|

GraphRAG

检索方式

|

语义相似度

|

图遍历+语义检索

| |

全局性问题

|

差(只能找到局部片段)

|

强(图结构天然支持全局推理)

| |

实体关系

|

隐含在文本中

|

显式建模

| |

建索引成本

|

|

高(要抽取实体和关系)

| |

适用场景

|

具体事实问答

|

全局分析、关系推理

|

什么时候该用GraphRAG?

适合

  • 你的文档有大量实体关系(人物关系、公司股权、供应链网络)

  • 用户经常问全局性问题(“我们公司所有产品的市场定位是什么”)

  • 需要跨文档的实体关联推理

不适合

  • FAQ类知识库(问题跟答案是一一对应的)

  • 文档量小(少于100篇,向量检索够用了)

  • 团队没有图数据库经验(Neo4j等)

用LlamaIndex快速搭建GraphRAG

<span><span leaf="">from</span></span><span leaf="">&nbsp;llama_index.core&nbsp;</span><span><span leaf="">import</span></span><span leaf="">&nbsp;KnowledgeGraphIndex, SimpleDirectoryReader</span><span leaf=""><br></span><span><span leaf="">from</span></span><span leaf="">&nbsp;llama_index.core.graph_stores&nbsp;</span><span><span leaf="">import</span></span><span leaf="">&nbsp;SimpleGraphStore</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 加载文档</span></span><span leaf=""><br></span><span leaf="">documents = SimpleDirectoryReader(</span><span><span leaf="">"./docs"</span></span><span leaf="">).load_data()</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 构建知识图谱索引</span></span><span leaf=""><br></span><span leaf="">graph_store = SimpleGraphStore()</span><span leaf=""><br></span><span leaf="">index = KnowledgeGraphIndex.from_documents(</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; documents,</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; max_triplets_per_chunk=</span><span><span leaf="">10</span></span><span leaf="">, &nbsp;</span><span><span leaf=""># 每个chunk最多抽取10个三元组</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; graph_store=graph_store,</span><span leaf=""><br></span><span leaf="">)</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 查询</span></span><span leaf=""><br></span><span leaf="">query_engine = index.as_query_engine(</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; include_text=</span><span><span leaf="">True</span></span><span leaf="">, &nbsp;</span><span><span leaf=""># 同时返回原文和图信息</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; response_mode=</span><span><span leaf="">"tree_summarize"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf="">)</span><span leaf=""><br></span><span leaf="">response = query_engine.query(</span><span><span leaf="">"张三跟李四是什么关系?"</span></span><span leaf="">)</span><span leaf=""><br></span>

Agentic RAG:让RAG自己思考

Agentic RAG是2025-2026年最受关注的RAG方向——不再是固定的"检索→生成"流水线,而是让Agent自主决定检索策略。

Agentic RAG的核心能力

  1. 查询路由:判断问题该走哪个数据源(知识库、数据库、API、搜索引擎)

  2. 自适应检索:简单问题直接答,复杂问题多步检索

  3. 结果验证:检索到的内容对不对?不对就换方式再检

  4. 自我修正:发现回答有误,自动重新检索和修正

查询路由实现

<span><span leaf="">from</span></span><span leaf="">&nbsp;enum&nbsp;</span><span><span leaf="">import</span></span><span leaf="">&nbsp;Enum</span><span leaf=""><br></span><span><span leaf="">from</span></span><span leaf="">&nbsp;pydantic&nbsp;</span><span><span leaf="">import</span></span><span leaf="">&nbsp;BaseModel</span><span leaf=""><br></span><span leaf=""><br></span><span><span><span leaf="">class</span></span><span leaf="">&nbsp;</span><span><span leaf="">QueryRoute</span></span><span><span leaf="">(str, Enum)</span></span><span leaf="">:</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; knowledge_base =&nbsp;</span><span><span leaf="">"knowledge_base"</span></span><span leaf="">&nbsp;&nbsp;</span><span><span leaf=""># 公司知识库</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; database =&nbsp;</span><span><span leaf="">"database"</span></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span><span leaf=""># 数据库查询</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; web_search =&nbsp;</span><span><span leaf="">"web_search"</span></span><span leaf="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span><span leaf=""># 网络搜索</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; direct_answer =&nbsp;</span><span><span leaf="">"direct_answer"</span></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf=""># 直接回答(不需要检索)</span></span><span leaf=""><br></span><span leaf=""><br></span><span><span><span leaf="">class</span></span><span leaf="">&nbsp;</span><span><span leaf="">RouteResult</span></span><span><span leaf="">(BaseModel)</span></span><span leaf="">:</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; route: QueryRoute</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; reason: str</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; rewritten_query: str</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 路由判断</span></span><span leaf=""><br></span><span leaf="">route_prompt =&nbsp;</span><span><span leaf="">"""分析用户问题,决定应该从哪个数据源检索。</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">- 公司内部信息(产品、流程、政策)→ knowledge_base</span><span leaf=""><br></span><span leaf="">- 数据统计、报表数据 → database &nbsp;</span><span leaf=""><br></span><span leaf="">- 实时信息、新闻、外部知识 → web_search</span><span leaf=""><br></span><span leaf="">- 简单闲聊、通用知识 → direct_answer</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">用户问题:{question}"""</span></span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 用LLM做路由判断</span></span><span leaf=""><br></span><span leaf="">route_result = model.with_structured_output(RouteResult).invoke(</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; route_prompt.format(question=</span><span><span leaf="">"上季度销售额多少"</span></span><span leaf="">)</span><span leaf=""><br></span><span leaf="">)</span><span leaf=""><br></span><span><span leaf=""># → route=database, rewritten_query="SELECT SUM(amount) FROM sales WHERE quarter='Q3'"</span></span><span leaf=""><br></span>

完整的Agentic RAG架构

<span><span leaf="">from</span></span><span leaf="">&nbsp;langchain.agents&nbsp;</span><span><span leaf="">import</span></span><span leaf="">&nbsp;create_agent</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 工具1:知识库检索</span></span><span leaf=""><br></span><span><span><span leaf="">def</span></span><span leaf="">&nbsp;</span><span><span leaf="">search_knowledge_base</span></span><span><span leaf="">(query: str)</span></span><span leaf="">&nbsp;-&gt; str:</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">"""搜索公司内部知识库,获取产品、流程、政策等信息"""</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; results = hybrid_retriever.invoke(query)</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">return</span></span><span leaf="">&nbsp;</span><span><span leaf="">"\n"</span></span><span leaf="">.join([r.page_content&nbsp;</span><span><span leaf="">for</span></span><span leaf="">&nbsp;r&nbsp;</span><span><span leaf="">in</span></span><span leaf="">&nbsp;results])</span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 工具2:数据库查询</span></span><span leaf=""><br></span><span><span><span leaf="">def</span></span><span leaf="">&nbsp;</span><span><span leaf="">query_database</span></span><span><span leaf="">(sql: str)</span></span><span leaf="">&nbsp;-&gt; str:</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">"""执行SQL查询获取业务数据"""</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf=""># 实际项目对接数据库</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">return</span></span><span leaf="">&nbsp;</span><span><span leaf="">f"查询结果:..."</span></span><span leaf=""><br></span><span leaf=""><br></span><span><span leaf=""># 工具3:网络搜索</span></span><span leaf=""><br></span><span><span><span leaf="">def</span></span><span leaf="">&nbsp;</span><span><span leaf="">search_web</span></span><span><span leaf="">(query: str)</span></span><span leaf="">&nbsp;-&gt; str:</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">"""搜索互联网获取实时信息"""</span></span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp;&nbsp;</span><span><span leaf="">return</span></span><span leaf="">&nbsp;</span><span><span leaf="">f"搜索结果:..."</span></span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">agent = create_agent(</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; model=</span><span><span leaf="">"gpt-4o"</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; tools=[search_knowledge_base, query_database, search_web],</span><span leaf=""><br></span><span leaf="">&nbsp; &nbsp; system_prompt=</span><span><span leaf="">"""你是一个智能助手,拥有多种信息获取渠道。</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">决策逻辑:</span><span leaf=""><br></span><span leaf="">1. 先分析用户问题的类型和所需信息来源</span><span leaf=""><br></span><span leaf="">2. 选择最合适的工具获取信息</span><span leaf=""><br></span><span leaf="">3. 如果第一次检索结果不够,换一个query再试</span><span leaf=""><br></span><span leaf="">4. 基于检索到的信息生成回答,标注信息来源</span><span leaf=""><br></span><span leaf="">5. 如果检索不到相关信息,明确告知用户</span><span leaf=""><br></span><span leaf=""><br></span><span leaf="">重要:不要编造答案,所有信息必须基于检索结果。"""</span></span><span leaf="">,</span><span leaf=""><br></span><span leaf="">)</span><span leaf=""><br></span>

Agentic RAG的坑

90%的Agentic RAG项目在生产中失败,主要原因:

  1. 太复杂:Agent的决策过程不透明,出了问题排查困难

  2. 成本高:每次查询可能触发3-5次模型调用+2-3次检索

  3. 延迟大:多步检索+模型决策,单次查询可能要10秒以上

  4. 不稳定:同样的问法,Agent可能选不同的检索路径,结果不一致

我的建议:先用Advanced RAG把基础打牢,确认混合检索+Rerank已经做到80%以上准确率,再考虑引入Agent能力。而且先从查询路由开始——这是投入产出比最高的一步。

Java类比:Agentic RAG就像你把一个固定的MVC Controller改成了策略模式+责任链——灵活性上去了,但调试难度也上去了。先用固定流水线把业务跑通,再逐步引入动态决策。

高级架构选型决策树

<span leaf="">你的RAG遇到什么问题?</span><span leaf=""><br></span><span leaf="">├── 检索不准 → 先优化基础检索(混合+Rerank),别急着上高级架构</span><span leaf=""><br></span><span leaf="">├── 复杂问题答不对 → 查询改写 + 多跳检索</span><span leaf=""><br></span><span leaf="">├── 全局性问题回答差 → GraphRAG</span><span leaf=""><br></span><span leaf="">├── 需要多数据源 → 查询路由 + Agentic RAG</span><span leaf=""><br></span><span leaf="">└── 都想要 → Modular RAG(模块化组合)</span><span leaf=""><br></span>

记住一个原则:能用简单方案解决的,别用复杂方案。 80%的RAG项目,Advanced RAG就够了。GraphRAG和Agentic RAG是给那20%的复杂场景准备的。

本篇要点

| 要点

|

说明

查询改写

|

LLM改写+多查询+HyDE,让检索词更对路

| |

HyDE

|

先让模型猜答案,用答案检索,效果更好

| |

多跳检索

|

迭代检索串联跨文档信息

| |

GraphRAG

|

实体关系图谱+社区检测,解决跨文档推理

| |

Agentic RAG

|

Agent自主决策检索策略

| |

查询路由

|

按问题类型选数据源,投入产出比最高

| |

选择原则

|

80%项目用Advanced RAG够,别一上来就Agentic

|

下篇预告

下一篇讲RAG评估——怎么知道你的RAG好不好?RAGAS框架的四个核心指标、怎么构建黄金测试集、怎么搭建自动化评估流水线。没有评估,所有优化都是瞎调。


你的项目有遇到基础RAG搞不定的场景吗?具体是什么类型的问题?评论区说说。

觉得有用就点个在看,下一篇讲RAG评估——没有指标,所有优化都是瞎调。