RAG 何时介入:把“先检索还是先规划”做成可执行决策树


引言:大模型时代的「双重焦虑」与「黄金平衡点」

在过去的三年里,我亲眼见证了大语言模型(LLM)在从代码生成到医疗咨询、从金融合规到创意写作等几乎所有垂直领域的爆发式落地。但随着应用场景从「Demo级的单轮问答」过渡到「生产级的多任务、长流程、高准确性需求」,两个看似对立但又高度相关的核心焦虑开始在每一位架构师、产品经理和算法工程师的心中蔓延:

  1. 「知识焦虑」:LLM的「知识时效性限制」(比如GPT-4 Turbo截止2024年7月的知识)、「专业领域覆盖不足」(比如特定行业的专利、SOP、历史故障库)、「事实幻觉」(编造不存在的人名、产品型号、数据来源),让我们不得不把「RAG(检索增强生成)」当做救命稻草——但RAG的引入又带来了检索开销大、召回质量不稳定、生成流畅度下降、多文档冲突难以消解等新问题。
  2. 「推理焦虑」:当任务需要「复杂逻辑拆解」(比如数学竞赛题、系统故障排查路径规划)、「多步骤验证迭代」(比如代码调试、论文摘要润色)、「上下文窗口内的全局一致性推理」(比如长代码的功能实现确认、故事创作的世界观自洽)时,单纯的RAG甚至是「端到端RAG」(Retrieve → Generate,一步到位)都显得力不从心——这时候我们又想起了「规划型推理技术」:从最简单的Chain-of-Thought(CoT,思维链)到复杂的Tree-of-Thought(ToT,思维树)、Graph-of-Thought(GoT,思维图)、Plan-and-Execute(计划执行框架)。

那么问题来了:对于一个给定的任务,我们到底应该「先检索增强(先解决知识问题)」,还是「先规划推理(先解决逻辑问题)」? 或者说,有没有一种标准化、可量化、可执行的决策工具,能让我们在几分钟甚至几秒钟内,就做出符合业务场景需求的技术选型?

这就是本篇文章要解决的核心问题。作为一名在AI应用架构领域深耕15年、主导过3个以上百万日活RAG+规划型推理混合系统落地的架构师,我将从以下几个维度展开:

  1. 先梳理概念边界:定义「什么是纯RAG任务」「什么是纯规划型推理任务」「什么是RAG+规划型推理混合任务」,并建立概念的对比矩阵和ER实体关系图;
  2. 再拆解核心痛点:分析「先检索后规划」「先规划后检索」「边检索边规划」三种模式的优劣势、适用场景、失败场景;
  3. 然后构建决策工具:基于「任务复杂度」「知识依赖度」「实时性要求」「准确性容错率」「上下文窗口约束」五个可量化的核心维度,设计一个可直接落地的可执行决策树,并用Mermaid流程图清晰呈现;
  4. 接着做项目实战:我会选取三个最典型的生产级场景——「银行信用卡中心SOP合规咨询」「券商量化策略代码调试助手」「新能源汽车4S店故障排查路径规划」——分别用纯RAG、纯规划、混合模式的决策路径做技术选型,并提供完整的Python实现代码;
  5. 最后给出最佳实践:总结混合系统的开发环境搭建、性能优化技巧、召回质量提升方法、事实幻觉检测方案,并展望未来RAG与规划型推理技术的融合趋势。

第一章:概念边界与核心要素对比——先把「水」搅「清」

在开始讨论「何时介入」之前,我们必须先把所有相关的概念定义清楚、边界划准、要素拎清——否则后面的所有讨论都是「鸡同鸭讲」。

1.1 核心概念定义

1.1.1 检索增强生成(Retrieval-Augmented Generation, RAG)

我对RAG的严格生产级定义(不是学术论文里的宽泛定义)是:

一种「将外部知识源的结构化/非结构化实时/历史知识片段,通过语义检索/关键词检索/混合检索等方式,精准地召回与当前用户Query(查询)或中间推理状态相关的Top-K个片段,然后将这些片段以提示词工程的方式注入LLM的上下文窗口,最终辅助LLM生成更准确、更有时效性、更少事实幻觉内容的AI应用技术栈。

注意这个定义里的几个生产级关键词

  1. 实时/历史知识片段:不是所有外部知识都叫「RAG的知识源」——必须是**LLM本身无法获取(比如实时数据)、覆盖不足(比如企业SOP)、获取成本高且幻觉率高(比如直接让LLM生成金融合规条款)**的知识片段;
  2. 精准召回:不是「召回越多越好」——Top-K的K值必须根据业务场景的准确性容错率和实时性要求动态调整,一般K∈[3, 20];
  3. 提示词工程注入:不是「随便把知识片段贴在Query前面」——必须设计「指令模板」(比如「请仅基于以下参考信息回答用户的问题,如果参考信息中没有相关内容,请明确告知用户,不要编造」)、「知识片段标记」(比如用…或者{{ref1}}…{{ref2}}标记,方便后续做事实幻觉检测)、「参考信息排序」(比如用余弦相似度、BM25权重、业务规则权重等方式重新排序Top-K片段,把最相关的放在最前面,因为LLM的上下文窗口存在「近因效应」和「首因效应」);
  4. 技术栈:不是「只有LangChain+ChromaDB+GPT-4」——RAG是一个完整的技术栈,包括:知识源接入层(支持PDF、Word、Excel、PPT、Markdown、HTML、JSON、SQL数据库、API接口等多种格式)、知识预处理层(文本清洗、格式转换、文本分割、向量化、元数据提取)、知识存储层(向量数据库、关键词数据库、关系型数据库、图数据库的混合存储)、知识检索层(语义检索、关键词检索、混合检索、元数据过滤、重排序)、知识注入层(提示词模板管理、知识片段拼接、上下文窗口压缩)、生成增强层(事实幻觉检测、参考信息引用生成、内容格式美化)、评估优化层(离线评估、在线A/B测试、用户反馈收集、检索召回率/精确率/F1值优化、生成准确性/流畅性/相关性优化)。
1.1.2 规划型推理技术(Planning-Based Reasoning Techniques)

同样,我对规划型推理技术的严格生产级定义是:

一种「将复杂的、非结构化的用户Query,拆解成一系列有序的、可验证的、粒度适中的子任务/子步骤,然后逐个执行子任务/子步骤,并根据执行结果动态调整后续子任务/子步骤,最终得到全局最优或局部最优解的AI应用技术栈。

这个定义里的生产级关键词包括:

  1. 复杂的、非结构化的用户Query:不是所有Query都需要规划——只有那些「LLM在单轮上下文窗口内无法直接生成全局最优解」的Query才需要,比如「帮我写一个基于Transformer的中文情感分类模型,要求准确率超过95%,代码要符合PEP8规范,还要有完整的单元测试和文档」;
  2. 有序的、可验证的、粒度适中的子任务/子步骤
    • 有序性:子任务之间必须有明确的依赖关系,比如「写模型架构」必须在「数据预处理」之后;
    • 可验证性:每个子任务的执行结果必须可以被LLM或外部工具(比如Python解释器、SQL查询工具、单元测试框架)验证,比如「数据预处理的准确率」可以通过「计算训练集和验证集的类别分布一致性」来验证;
    • 粒度适中:子任务不能太粗(比如「写整个情感分类模型」),也不能太细(比如「导入pandas库」)——一般来说,每个子任务的执行时间应该在「10秒到5分钟」之间,子任务的数量应该在「3到20」之间;
  3. 动态调整后续子任务/子步骤:不是「一旦制定了计划就必须严格执行」——如果某个子任务的执行结果不符合预期(比如「数据预处理的准确率只有80%」),就必须回溯到上一个或几个子任务,重新调整参数或方法,再继续执行后续子任务;
  4. 技术栈:不是「只有LangChain的Plan-and-Execute Agent」——规划型推理技术也是一个完整的技术栈,包括:任务拆解层(指令模板管理、子任务生成、子任务依赖关系构建)、工具调用层(Python解释器、SQL查询工具、API接口、文件系统、RAG系统等外部工具的封装和调用)、执行验证层(子任务执行结果的自动验证、验证结果的语义化分析)、回溯调整层(回溯策略制定、参数优化、子任务重新生成)、结果整合层(所有子任务执行结果的整合、格式美化、用户反馈收集)、评估优化层(离线评估、在线A/B测试、子任务完成率/准确率优化、全局解质量优化)。
1.1.3 纯RAG任务、纯规划型推理任务、混合任务

为了方便后续的决策树设计,我们把所有需要LLM参与的任务分为三类:

  1. 纯RAG任务
    • 定义:只依赖「外部知识源的精准召回和注入」,不需要「复杂逻辑拆解、多步骤验证迭代、全局一致性推理」的任务;
    • 典型例子
      • 单轮事实查询:「2024年上半年华为Mate 60 Pro的销量是多少?」「中国银行信用卡中心的信用卡挂失手续费是多少?」
      • 单轮合规咨询:「根据中国证监会2024年最新发布的《证券期货投资者适当性管理办法》,普通投资者购买R5级股票型基金需要满足哪些条件?」
      • 单轮文档摘要生成:「请仅基于以下这份2024年新能源汽车行业白皮书的第3-5页,生成一份500字以内的摘要。」
      • 单轮参考信息引用生成:「请列出回答刚才那个问题时用到的所有参考信息的来源和页码。」
  2. 纯规划型推理任务
    • 定义:只依赖「复杂逻辑拆解、多步骤验证迭代、全局一致性推理」,不需要「外部知识源的精准召回和注入」的任务——或者说,任务所需的所有知识都已经在LLM的「预训练知识」或「当前上下文窗口」里了;
    • 典型例子
      • 数学竞赛题求解:「有一个边长为1的正四面体,求它的内切球半径和外接球半径的比值。」
      • 代码调试(无外部知识依赖):「下面这段Python代码运行时报错’IndexError: list index out of range’,请帮我找出错误原因并修复。[代码片段]」
      • 故事创作(无外部知识依赖):「请创作一个以’未来的人工智能宠物医院’为主题的短篇科幻故事,要求字数在2000字左右,世界观自洽,情节有起伏。」
      • 系统架构设计(无外部知识依赖):「请设计一个支持100万日活的在线聊天系统,要求可用性达到99.99%,延迟低于100ms,成本可控。」
  3. RAG+规划型推理混合任务
    • 定义:既依赖「外部知识源的精准召回和注入」,又依赖「复杂逻辑拆解、多步骤验证迭代、全局一致性推理」的任务——这也是生产级场景中最常见的任务类型
    • 典型例子
      • 银行信用卡中心多轮故障排查:「我昨天在国外刷卡消费了100欧元,但今天收到的账单显示我被扣了120欧元,这是怎么回事?请帮我一步步排查原因。」
      • 券商量化策略回测与优化:「请帮我基于2020-2024年的沪深300指数日K线数据,回测一个’双均线交叉+MACD金叉死叉’的量化策略,要求夏普比率超过1.5,最大回撤低于20%,如果不符合要求,请帮我优化策略参数。」
      • 医疗咨询(结合患者病历和医学指南):「患者张三,男,65岁,有10年高血压病史,3年糖尿病病史,最近一周出现头痛、头晕、恶心、呕吐的症状,请结合《中国高血压防治指南(2023年版)》和《中国2型糖尿病防治指南(2023年版)》,帮我一步步排查可能的病因,并给出初步的治疗建议。」

1.2 概念边界的可视化:ER实体关系图与交互关系图

为了更直观地理解纯RAG、纯规划、混合任务三种概念之间的关系,以及它们与RAG技术栈、规划型推理技术栈、LLM之间的交互关系,我用Mermaid语法画了两张图:

1.2.1 ER实体关系图(Entity-Relationship Diagram)

这张图展示了任务类型、核心需求、核心技术栈、LLM、外部知识源、外部工具六个核心实体之间的关系:

是一种

是一种

是一种

仅满足

仅满足

满足

同时满足

依赖

依赖

依赖

同时依赖

调用

调用

访问

调用

间接访问

间接调用

TASK_TYPE

string

type_id

PK

类型ID

string

type_name

类型名称

string

description

类型描述

PURE_RAG_TASK

string

task_id

PK

任务ID

string

query

用户查询

float

accuracy_requirement

准确性要求

float

realtime_requirement

实时性要求

PURE_PLANNING_TASK

string

task_id

PK

任务ID

string

query

用户查询

int

max_subtasks

最大子任务数

int

max_backtracks

最大回溯次数

HYBRID_TASK

string

task_id

PK

任务ID

string

query

用户查询

float

accuracy_requirement

准确性要求

float

realtime_requirement

实时性要求

int

max_subtasks

最大子任务数

int

max_backtracks

最大回溯次数

KNOWLEDGE_REQUIREMENT

string

req_id

PK

需求ID

bool

need_realtime_knowledge

是否需要实时知识

bool

need_professional_knowledge

是否需要专业知识

bool

need_enterprise_knowledge

是否需要企业知识

REASONING_REQUIREMENT

string

req_id

PK

需求ID

bool

need_complex_logic_decomposition

是否需要复杂逻辑拆解

bool

need_multi_step_verification

是否需要多步骤验证

bool

need_global_consistency_reasoning

是否需要全局一致性推理

RAG_TECH_STACK

string

stack_id

PK

技术栈ID

string

knowledge_source_access_layer

知识源接入层

string

knowledge_preprocessing_layer

知识预处理层

string

knowledge_storage_layer

知识存储层

string

knowledge_retrieval_layer

知识检索层

string

knowledge_injection_layer

知识注入层

string

generation_enhancement_layer

生成增强层

string

evaluation_optimization_layer

评估优化层

PLANNING_TECH_STACK

string

stack_id

PK

技术栈ID

string

task_decomposition_layer

任务拆解层

string

tool_calling_layer

工具调用层

string

execution_verification_layer

执行验证层

string

backtracking_adjustment_layer

回溯调整层

string

result_integration_layer

结果整合层

string

evaluation_optimization_layer

评估优化层

LLM

string

model_id

PK

模型ID

string

model_name

模型名称

string

provider

提供商

int

context_window_size

上下文窗口大小(token数)

float

knowledge_cutoff_date

知识截止日期(YYYYMM)

EXTERNAL_KNOWLEDGE_SOURCE

string

source_id

PK

知识源ID

string

source_name

知识源名称

string

source_type

知识源类型(结构化/非结构化)

string

update_frequency

更新频率(实时/每日/每周/每月/每年)

EXTERNAL_TOOL

string

tool_id

PK

工具ID

string

tool_name

工具名称

string

tool_type

工具类型(Python解释器/SQL查询工具/API接口/文件系统/RAG系统)

string

execution_time_limit

执行时间限制(秒)


1.2.2 交互关系图(Interaction Diagram)

这张图展示了纯RAG任务、纯规划型推理任务、混合任务三种任务类型的完整执行流程,以及它们与RAG技术栈、规划型推理技术栈、LLM、外部知识源、外部工具之间的交互顺序:

LLM/ExtTool 外部工具 外部知识源 大语言模型 规划型推理技术栈 RAG技术栈 混合处理模块 纯规划处理模块 纯RAG处理模块 任务编排器 LLM/ExtTool 外部工具 外部知识源 大语言模型 规划型推理技术栈 RAG技术栈 混合处理模块 纯规划处理模块 纯RAG处理模块 任务编排器 alt [子任务需要外部工具] alt [未超过最大回溯次数] [超过最大回溯次数] alt [验证结果不符合预期] loop [执行所有子任务] alt [子任务需要RAG] [子任务不需要RAG] loop [执行所有子任务] 用户 发送纯RAG任务Query 1 任务类型识别 2 转发纯RAG任务Query 3 调用RAG技术栈 4 访问外部知识源(知识源接入/预处理/存储) 5 返回原始知识 6 向量化/检索/重排序/注入 7 发送注入了知识的提示词 8 返回生成内容 9 事实幻觉检测/引用生成/格式美化 10 返回最终结果 11 返回最终结果 12 返回纯RAG任务的最终结果 13 发送纯规划任务Query 14 任务类型识别 15 转发纯规划任务Query 16 调用规划型推理技术栈 17 发送任务拆解提示词 18 返回子任务列表和依赖关系 19 选择下一个可执行的子任务 20 发送子任务执行提示词(如果不需要外部工具) 21 返回子任务执行结果 22 调用外部工具 23 返回工具执行结果 24 发送工具执行结果语义化分析提示词 25 返回语义化的子任务执行结果 26 发送子任务执行结果验证提示词 27 返回验证结果 28 检查是否超过最大回溯次数 29 回溯到上一个或几个子任务 30 发送子任务重新生成/参数优化提示词 31 返回新的子任务/参数 32 终止任务执行,返回错误信息 33 发送所有子任务执行结果整合提示词 34 返回整合后的最终结果 35 格式美化/用户反馈收集 36 返回最终结果 37 返回最终结果 38 返回纯规划任务的最终结果 39 发送混合任务Query 40 任务类型识别+决策树选择(先规划后检索) 41 转发混合任务Query和决策路径 42 调用规划型推理技术栈(第一阶段:规划) 43 发送任务拆解提示词(明确标注哪些子任务需要RAG) 44 返回子任务列表、依赖关系和RAG需求标注 45 选择下一个可执行的子任务 46 触发RAG调用 47 调用RAG技术栈(第二阶段:检索) 48 访问外部知识源 49 返回原始知识 50 向量化/检索/重排序/注入 51 发送注入了知识的子任务执行提示词 52 返回子任务执行结果 53 事实幻觉检测/引用生成 54 返回子任务执行结果 55 返回子任务执行结果 56 执行子任务(同纯规划任务) 57 返回子任务执行结果 58 验证子任务执行结果(同纯规划任务) 59 整合所有子任务执行结果(同纯规划任务) 60 返回整合后的最终结果 61 返回最终结果 62 返回最终结果 63 返回混合任务的最终结果 64 用户

1.3 概念核心属性维度对比:Markdown表格

为了更清晰地对比纯RAG、纯规划、混合任务三种概念的核心属性,我整理了一张包含10个核心属性的Markdown表格:

核心属性维度 纯RAG任务 纯规划型推理任务 RAG+规划型推理混合任务
核心需求 知识准确性、知识时效性、知识专业性 逻辑严密性、解的最优性、步骤可追溯性 同时满足纯RAG和纯规划的核心需求
依赖的技术栈 仅RAG技术栈 仅规划型推理技术栈 RAG技术栈+规划型推理技术栈+任务编排器
是否依赖外部知识源 是(必须依赖) 否(或仅依赖LLM的预训练知识/当前上下文) 是(部分子任务必须依赖)
是否依赖外部工具 可能依赖(比如向量化工具、检索工具,但一般不直接暴露给用户) 是(必须依赖至少一种验证工具或执行工具) 是(部分子任务依赖RAG工具,部分子任务依赖其他验证/执行工具)
典型执行时间 短(一般在1秒到10秒之间) 长(一般在10秒到5分钟之间,甚至更长) 中等(一般在5秒到3分钟之间,取决于需要RAG的子任务数量和规划的复杂度)
上下文窗口占用率 高(Top-K个知识片段会占用大量上下文窗口) 中等(子任务列表、依赖关系、执行结果会占用一定的上下文窗口,但一般比纯RAG低) 高或中等(取决于需要RAG的子任务数量和知识片段的大小,一般需要做上下文窗口压缩)
事实幻觉率 低(如果召回质量高的话) 高(尤其是在需要专业知识的情况下) 低(如果需要RAG的子任务都正确调用了RAG的话)
逻辑严密性 低(LLM在单轮推理中可能会跳过一些逻辑步骤) 高(每个逻辑步骤都被明确拆解和验证) 高(每个逻辑步骤都被明确拆解和验证,需要专业知识的步骤也有RAG的支持)
用户交互次数 少(一般是单轮交互,最多2-3轮追问) 多(可能是多轮交互,尤其是在需要用户提供额外信息的情况下) 中等(一般是3-5轮交互,取决于需要用户提供的额外信息和规划的复杂度)
典型应用场景 单轮事实查询、单轮合规咨询、单轮文档摘要生成、单轮参考信息引用生成 数学竞赛题求解、代码调试(无外部知识依赖)、故事创作(无外部知识依赖)、系统架构设计(无外部知识依赖) 银行信用卡中心多轮故障排查、券商量化策略回测与优化、医疗咨询(结合患者病历和医学指南)、法律文书起草(结合法律法规和案例库)

1.4 本章小结

在本章中,我们完成了以下工作:

  1. 明确了核心概念的定义:严格区分了学术论文中的宽泛定义和生产级场景中的严格定义,重点强调了RAG和规划型推理技术都是「完整的技术栈」,而不是「单一的工具或算法」;
  2. 划分了任务类型:将所有需要LLM参与的任务分为纯RAG任务、纯规划型推理任务、混合任务三类,并给出了每类任务的典型例子;
  3. 可视化了概念边界和交互关系:用Mermaid语法画了ER实体关系图和交互关系图,直观地展示了六种核心实体之间的关系和三种任务类型的完整执行流程;
  4. 对比了概念的核心属性:整理了一张包含10个核心属性的Markdown表格,清晰地对比了三类任务的优劣势和适用场景。

通过本章的学习,我们已经把「水」搅「清」了——接下来,我们将深入分析「先检索后规划」「先规划后检索」「边检索边规划」三种混合模式的优劣势、适用场景、失败场景,为下一章的决策树设计打下坚实的基础。


(本章字数:约7800字,全文待续)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐