Query Rewriting(查询重写)详解:RAG 系统中提升检索效果的四大核心方案
Query Rewriting(查询重写)详解:RAG 系统中提升检索效果的四大核心方案
在 RAG(Retrieval-Augmented Generation)系统中,很多人会发现:
模型不一定差,真正差的是“检索”。
用户一句:
“不亮了”
你让向量数据库怎么搜?
所以,Query Rewriting(查询重写)几乎是所有生产级 RAG 系统里的核心模块。
一、为什么 RAG 一定需要 Query Rewriting?
很多新手做 RAG 时,流程通常是:
用户问题 → Embedding → 向量检索 → LLM回答
看起来没问题。
但真实用户的问题往往是:
| 用户输入 | 问题 |
|---|---|
| “那个报错” | 缺少上下文 |
| “怎么搭” | 信息不完整 |
| “不亮了” | 语义模糊 |
| “能退吗” | 场景不明确 |
这种 Query:
- 信息密度低
- 关键词缺失
- 向量表达弱
- 检索召回差
最终导致:
检索不到 → 上下文错误 → LLM胡说
所以:
很多 RAG 的优化,本质上都在优化 Query。
这就是 Query Rewriting 的核心价值。
二、什么是 Query Rewriting?
Query Rewriting(查询重写):
在用户问题进入检索系统前,对 Query 进行优化、补全、扩展、拆分或转换。
核心目标:
让 Query 更适合“检索”
而不是更适合“人类阅读”
它本质上属于:
用户问题 → 检索语言
的转换过程。
三、生产级 RAG 中最常见的四种 Query Rewriting 方案
1. LLM Query Rewriting(LLM 查询改写)
原理
使用大模型对用户问题进行“语义补全”。
让模糊问题:
“那个报错”
变成:
“运行程序时出现 RuntimeError 的解决方法”
示例
| 原始问题 | 改写后 |
|---|---|
| 不亮了 | 温湿度传感器指示灯不亮如何排查 |
| 怎么搭 | 如何搭建嵌入式实验环境 |
| 那个报错 | RuntimeError 的解决方案 |
| 能退吗 | 实训设备退款流程是什么 |
Prompt 设计
REWRITE_PROMPT = """
你是一个查询优化专家。
请将用户问题改写为更适合知识库检索的形式。
要求:
1. 补充缺失上下文
2. 消除模糊指代
3. 保持原意
4. 输出改写结果,不要解释
用户问题:
{query}
改写后:
"""
LangChain 实现
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
prompt = PromptTemplate.from_template("""
请优化用户问题用于知识库检索:
用户问题:
{query}
优化后:
""")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0
)
chain = prompt | llm
result = chain.invoke({
"query": "那个报错"
})
print(result.content)
优点
1. 效果非常好
LLM 可以理解语义。
这是规则系统完全做不到的。
2. 泛化能力强
新领域、新设备、新问题都能处理。
3. Prompt 可控
可以针对:
- 医疗
- 法律
- 电商
- 客服
分别优化。
缺点
| 问题 | 说明 |
|---|---|
| 延迟高 | 多一次 LLM 调用 |
| 成本高 | 消耗 Token |
| 依赖模型 | LLM 挂了整个链路受影响 |
适用场景
推荐用于:
- 智能客服
- 企业知识库
- AI 问答系统
- 高质量 RAG
2. HyDE(Hypothetical Document Embeddings)
什么是 HyDE?
HyDE 全称:
Hypothetical Document Embeddings
核心思想:
不直接检索问题,
而是先生成“假设答案”,
再用假设答案去检索。
为什么有效?
因为:
问题 和 答案
在向量空间里通常距离很远
例如:
用户 Query:
温湿度传感器不亮怎么办
真实文档:
检查供电、检查接线、检查主控板...
二者词汇差异巨大。
所以:
Query embedding ≠ Document embedding
HyDE 通过生成:
“检查供电、检查接线...”
这种“伪答案”,让检索更贴近真实文档。
流程图
用户问题
↓
LLM生成假设答案
↓
Embedding
↓
向量检索
↓
返回相关文档
示例
用户问题
温湿度传感器不亮了怎么办
LLM 生成假设答案
首先检查电源连接,
其次检查接线是否松动,
最后检查传感器是否损坏。
再进行检索
此时召回质量会明显提升。
LangChain 实现
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
hyde_prompt = PromptTemplate.from_template("""
请根据问题生成一个可能的答案:
问题:
{query}
假设答案:
""")
llm = ChatOpenAI(model="gpt-4o-mini")
hyde_chain = hyde_prompt | llm
result = hyde_chain.invoke({
"query": "传感器不亮了怎么办"
})
print(result.content)
优点
1. 技术问答效果非常强
因为技术文档答案结构稳定。
2. 检索语义更接近真实文档
尤其适合:
- FAQ
- 运维
- 技术支持
缺点
1. 容易“带偏”
如果 LLM 幻觉严重:
假设答案错了
→ 检索方向全错
2. 成本高
同样多一次 LLM 调用。
3. Query Decomposition(查询分解)
原理
把复杂问题拆成多个子问题。
示例
用户问题:
如何搭建实验环境并配置传感器?
拆分后:
1. 如何搭建实验环境?
2. 如何配置传感器?
分别检索:
环境文档 + 传感器文档
最后合并。
为什么重要?
因为:
复杂问题通常无法一次召回
尤其:
- 多跳问题
- 多领域问题
- 长问题
单次 embedding 很容易失败。
Prompt
DECOMPOSE_PROMPT = """
请将问题拆分为多个独立子问题:
问题:
{query}
输出:
"""
优点
1. 适合复杂任务
比如:
安装 + 配置 + 调试
2. 提高召回覆盖率
每个子问题都能精准检索。
缺点
| 问题 | 说明 |
|---|---|
| 实现复杂 | 多轮检索 |
| 延迟高 | 多次 embedding |
| 成本高 | 多次 LLM 调用 |
适用场景
推荐:
- 企业 Copilot
- 法律 AI
- 学术问答
- 多步骤任务
4. Rule-based Query Rewriting(规则改写)
原理
不用 LLM。
纯规则。
常见规则
| 规则 | 示例 |
|---|---|
| 同义词扩展 | 传感器 → 检测器 |
| 停用词清理 | 那个、这个 |
| 拼写纠正 | 传敢器 → 传感器 |
| 缩写展开 | MCU → 单片机 |
示例代码
SYNONYMS = {
"传感器": ["检测器", "探头"],
"实验箱": ["开发板", "实训箱"]
}
def rewrite(query):
expanded = query
for k, v in SYNONYMS.items():
if k in query:
expanded += " " + " ".join(v)
return expanded
print(rewrite("传感器不亮"))
优点
| 优点 | 说明 |
|---|---|
| 快 | 毫秒级 |
| 稳定 | 不依赖 LLM |
| 免费 | 零 Token 成本 |
缺点
1. 无法理解语义
只能匹配规则。
2. 泛化能力差
新问题容易失效。
3. 维护成本高
规则会越来越多。
五、生产环境怎么选?
小型项目
直接:
规则改写 + LLM Rewrite
够用了。
技术问答系统
推荐:
LLM Rewrite + HyDE
效果非常强。
企业级 RAG
推荐:
规则改写
↓
LLM Rewrite
↓
Query Decomposition
↓
HyDE
形成多阶段 Query Pipeline。
六、总结
Query Rewriting 是:
RAG效果优化的核心模块
甚至很多时候:
优化 Query
比优化模型更重要
四种核心方案:
| 方案 | 特点 |
|---|---|
| LLM Rewrite | 通用最强 |
| HyDE | 技术问答神器 |
| Query Decomposition | 复杂问题处理 |
| Rule-based | 低成本高性能 |
建议:
不要只做向量检索
一定要做 Query Pipeline
否则:
你的 RAG 很容易变成:
“检索不到 → LLM胡编”
八、后续系列(预告)
后面我还会继续更新:
- RAG 多路召回详解
- Rerank 重排序原理
- Chunk 切分策略
- GraphRAG 原理
- Agentic RAG 架构
- 企业级 RAG Pipeline
- LangChain / LangGraph 实战
如果这篇对你有帮助,欢迎关注。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)