跳至正文
来两杯美式
返回

RAG 检索不准?先别换模型,把问题问对再说

By 来两杯美式
发布于更新于

做了 RAG,效果就是差那么一口气——检索到的文档和问题沾边但不够准,生成的答案看起来头头是道但关键信息不对,复杂一点的组合问题就翻车。换更大的模型?改 embedding?加更多文档?试了一圈,效果还是不痛不痒。

问题到底出在哪?

大多数人的 RAG 优化是”头痛医头”——检索不准就换 embedding,回答不对就改 prompt,流程问题漏步骤就调大 topK。这些操作本身没错,但缺少一个系统性的优化框架

RAG 不是只有”检索 + 生成”两步。把一个完整的 RAG 链路拆开来看,至少可以拆出 6 个独立阶段,每个阶段都有对应的优化策略。很多系统的瓶颈,恰恰藏在被忽略的阶段里——尤其是最前面的几个。

本文是 RAG 优化全景图的上篇,聚焦查询侧优化:在问题进入检索器之前,先让它变聪明。下篇将覆盖索引、检索和生成阶段。

RAG 6 阶段优化全景图

先看一张全景图,建立整体认知:

RAG 6阶段优化全景图:查询转换、路由、查询构建、索引、检索、生成六个阶段对应的优化策略

优化原则:传递更准的内容 → 重要的靠前放 → 不相关的尽量剔除

核心认知:RAG 优化的本质就三件事——(1)传递更准确、更相关的内容给 LLM;(2)让重要的内容排在前面,充分利用注意力机制;(3)尽可能剔除不相关内容,减少干扰和幻觉。所有优化策略,最终都在服务这三个目标。

另外,有一个容易忽略的事实:优化策略不是越多越好。每多加一层优化,就多一次 LLM 调用或模型计算,成本和延迟都会增加。合理的做法是根据场景选择性价比最高的策略组合。

上篇聚焦前三个阶段——在检索发生之前,把查询优化到位。

阶段一:查询转换(Query Transformation)

目标:把用户输入的原始问题,转换成更适合检索的形态。

这是最容易被跳过的阶段。很多人拿到用户问题直接丢给检索器,但用户的问题往往是模糊的、多意图的、口语化的。检索器理解不了这些”潜台词”。

1. 多查询重写(Multi-Query Rewriting)

核心思路:从多个角度重写用户问题,每个角度独立检索,最后合并去重。

用户问题:"怎么提升 RAG 效果?"


    LLM 生成 3 个变体:
    ① "RAG 系统性能优化方法有哪些?"
    ② "检索增强生成的准确率如何提升?"
    ③ "RAG 应用中常见的优化策略是什么?"


    3 路并行检索 → 合并去重 → 唯一文档列表

多查询重写策略运行流程

Prompt 模板(如果所用模型支持,可从低随机性配置开始;temperature=0 也不能保证跨请求、模型版本和运行环境完全一致):

你是一名人工智能语言模型助手。你的任务是针对给定的用户问题生成 3 个不同版本,
以便从向量数据库中检索相关文档。
通过生成用户问题的多角度表述,你的目标是帮助用户克服基于距离的相似性搜索的某些局限性。
请用换行符分隔这些替代问题。
原始问题:{question}

LangChain 实现

# LangChain v1 需要额外安装 langchain-classic
from langchain_classic.retrievers import MultiQueryRetriever

retriever = MultiQueryRetriever.from_llm(
    retriever=base_retriever,   # 基础检索器,必填
    llm=llm,                    # 用于生成变体问题,必填
    prompt=custom_prompt,        # 可选,有默认值
    include_original=True        # 是否保留原始问题一起检索
)

适用场景:用户问题比较开放、意图模糊的场景。成本低、见效快,是上手 RAG 优化的首选策略之一。

2. 问题分解(Question Decomposition)

和多查询重写不同,问题分解针对的是复杂组合问题——一个问题里包含多个子步骤,需要按顺序解决。

比如用户问”新员工入职需要走哪些审批,每个审批要找谁?“——这个问题包含两个层次:(1)流程步骤是什么;(2)每个步骤的负责人是谁。直接检索很难同时命中两个维度的信息。

问题分解有两种模式:

迭代式(深度优先):子问题之间有强依赖,上一步的答案决定下一步怎么做。

  用户问题


  拆分子问题


  检索 + 回答 Q1


  带着上下文检索 + 回答 Q2


  汇总最终答案

并行式(广度优先):子问题相对独立,可以同时处理。

  用户问题


  拆分子问题

┌────┼────┐
▼    ▼    ▼
Q1   Q2   Q3
│    │    │
▼    ▼    ▼
A1   A2   A3
└────┼────┘

  汇总最终答案

问题分解策略:迭代式与并行式运行流程

LangChain 没有为问题分解封装现成的检索器,需要自己构建:先用一条链做问题分解,然后迭代执行检索和回答,将上一轮的答案带入下一轮。

关于流程类问题的深层分析,可以参考本系列第一篇:RAG 为什么回答流程问题会漏步骤?,里面讨论了双层上下文方案来解决流程完整性问题。

3. HyDE(假设性文档嵌入)

这个策略的思路非常巧妙:让 LLM 先根据用户问题”编”一篇假设性文档,然后用这篇文档的向量去检索

为什么有效?因为用户问题和知识库文档往往处于不同的语义空间——问题是”问句”,文档是”陈述句”。直接用问句做向量检索,语义距离可能较大。但如果先让 LLM 把问句扩展成一篇假想的回答,这篇假想回答的向量就和真实文档更接近了。

用户:"怎么配置 Nginx 反向代理?"


    LLM 生成假设文档:
    "配置 Nginx 反向代理需要在配置文件中
     设置 proxy_pass 指令,指定后端服务器
     地址和端口,然后重载 Nginx 服务..."


    用假设文档的向量去检索 → 更高的召回率

4. 多查询结果融合(RRF)

当你有多个检索结果来源时(比如多查询重写产生的 3 路结果,或者向量 + 关键词两路结果),怎么合并排序?

RRF(Reciprocal Rank Fusion) 是实践中效果最好的融合算法之一。核心思路:文档在越多检索结果中排名靠前,最终排名就越高。

score(d) = Σ 1 / (k + rank_i(d))

其中 k 是平滑常数(通常取 60),rank_i(d) 是文档 d 在第 i 路检索结果中的排名。

RRF 不依赖具体分数绝对值,只关心相对排名,因此不同检索器的分数尺度差异不会影响融合效果。多查询重写 + RRF 是性价比很高的组合。

阶段二:路由(Routing)

目标:根据查询类型,把问题分发到最合适的处理路径。

不是所有问题都应该走向量检索。用户问”今天天气如何”就该走搜索引擎,问”帮我算 123 × 456”就该走计算器,问”XX 产品的报价”才走知识库。

1. 动态路由

用 LLM 或规则引擎判断查询意图,动态选择检索路径:

用户提问


  LLM 意图识别

    ├── 知识库查询 → 向量数据库
    ├── 实时信息   → 搜索引擎 API
    ├── 数值计算   → 计算器工具
    ├── 结构化查询 → SQL / 图数据库
    └── 闲聊     → 直接回答(跳过检索)

2. 图查询

如果知识有明确的实体和关系(比如组织架构、产品依赖、审批链),用图数据库(Neo4j 等)存储知识图谱,通过图查询直接获取结构化信息。比如查询”张三的直属领导是谁”,图查询比向量检索精确得多,而且可解释。

图查询和向量检索不是互斥的——可以先用图查询拿到精确的结构化信息,再让向量检索补充周边的非结构化上下文。

阶段三:查询构建(Query Construction)

目标:在检索之前,确保最终提交给检索器的查询语句是高质量的。

1. 问题重建

与查询转换不同,问题重建更聚焦于优化单条查询的表达:去掉冗余词、补充缺失上下文、将口语化表达转为正式表达。比如把”那个什么来着,就是上传文件那个接口”重写为”文件上传接口的使用方法”。

区别在于:多查询重写是”一变多”扩大覆盖面,问题重建是”一换一”提升精度。两个可以组合:先重建一个精确版本,再从多个角度生成变体。

2. 自检索(Self-Retrieval)

让 LLM 自己判断是否需要检索。有些问题 LLM 用自身知识就能回答(比如”Python 是什么”),这种情况下跳过检索可以节省成本。

用户提问 → LLM 判断 → 需要检索 → 走检索链路
                    → 不需要   → 直接回答

上篇到此,覆盖了 RAG 链路的前三个优化阶段。总结一下:

阶段核心策略一句话
查询转换多查询重写、问题分解、HyDE、RRF 融合把模糊问题变成多个精准查询
路由动态路由、图查询把问题分发到最合适的处理路径
查询构建问题重建、自检索让最终提交的查询语句尽量干净

这三个阶段有一个共同的目标:在检索发生之前,把查询优化到最佳状态。这也是最容易被忽视的优化环节——很多人直接把用户原话丢给检索器,然后抱怨检索效果不好。

下篇将进入核心链路:索引、检索和生成阶段,覆盖分块策略、RAPTOR、混合检索、ReRank、Self-RAG、CRAG,以及场景化选型指南和评估体系。

本系列文章


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
查看系列全部文章
  1. 01.做 AI 助手,最怕一上来就建知识库
  2. 02.RAG 入门:为什么大模型需要查资料再回答
  3. 03.RAG 核心原理:检索、向量与嵌入——计算机如何理解语义
  4. 04.RAG 实战:核心组件、调优与问题排查
  5. 05.RAG 为什么回答流程问题会漏步骤?原因和改进方案(附完整源码)
  6. 06.企业级 RAG 怎么落地?不只是向量检索和大模型(附完整源码)
  7. 07.RAG 检索不准?先别换模型,把问题问对再说
  8. 08.RAG 答非所问?从索引到生成,打通最后一公里
  9. 09.别再把聊天记录当记忆了:AI Agent 的四种记忆到底怎么分?
  10. 10.我手搓了一个 AI Agent 记忆框架,才发现“长期记忆”不是存聊天记录
  11. 11.精选数据与垂直 AI:AI 时代的护城河在哪

上一篇
RAG 答非所问?从索引到生成,打通最后一公里
下一篇
企业级 RAG 怎么落地?不只是向量检索和大模型(附完整源码)