小白程序员必看:收藏这6种Query Rewrite方法,轻松提升大模型检索效果!

📅 2026/7/14 20:40:08
小白程序员必看:收藏这6种Query Rewrite方法,轻松提升大模型检索效果!
本文介绍了Query Rewrite在大模型检索中的核心作用即把用户自然语言问题转化为更精准的检索表达。文章详细解析了六种常用改写方法直接改写、HyDE生成假文档、Step-back上位提问、Multi-Query多角度召回、Self-Query结构化过滤及Router Query知识库路由。同时强调了工程评估与生产级护栏的重要性帮助开发者有效提升大模型检索准确性与稳定性。Query Rewrite 的核心作用把“人类表达”变成“检索表达”一、为什么 RAG 需要 Query Rewrite很多 RAG 项目上线后最大的问题不是模型不会回答而是检索阶段就没有把正确资料找回来。用户的问题通常很口语、很短、带指代甚至只说“这个怎么弄”。而企业知识库里的文档往往是制度标题、字段名、流程名、产品术语。Query Rewrite 的价值就是在检索之前做一次“翻译”把用户的自然表达改写成更容易命中文档的检索表达。二、在线 RAG 链路里Query Rewrite 放在哪里在在线 RAG 中Query Rewrite 一般放在检索之前。它不是最终答案生成而是让后面的检索、融合、精排、Prompt 组装更稳定。三、方法一直接改写把问题补完整直接改写最常见也最容易落地。它适合处理口语化、省略、指代、多轮上下文缺失等问题。核心要求是只补全不篡改。代码示例Python可复制from pydantic import BaseModel, Fieldfrom typing import Listclass RewriteResult(BaseModel):rewritten_query: str Field(description补全后的检索问题)keywords: List[str] Field(description可用于 BM25 的关键词)keep_original: bool Field(defaultTrue, description是否保留原问题一起检索)risk: str Field(descriptionlow / medium / high表示改写漂移风险)SYSTEM_PROMPT 你是 RAG 查询改写器。要求1. 只能补全用户原意不能新增用户没有表达的业务诉求。2. 结合最近 3 轮对话消解“它、这个、那个、上次”等指代。3. 输出必须是 JSON不要回答问题本身。def build_rewrite_prompt(history: list[str], user_query: str) - str:return f最近对话{chr(10).join(history[-3:])}用户当前问题{user_query}请输出 RewriteResult JSON。四、方法二HyDE先生成“假文档”再检索HyDE 的思路是原始 Query 太短直接 Embedding 不稳定那就先让模型生成一段“假设性的答案/文档”再用这段更像知识库文本的内容做向量检索。注意HyDE 不是相信假答案而是用它改善召回。代码示例Python可复制from llama_index.core import VectorStoreIndex, SimpleDirectoryReaderfrom llama_index.core.indices.query.query_transform import HyDEQueryTransformfrom llama_index.core.query_engine import TransformQueryEngine# 1. 构建索引documents SimpleDirectoryReader(./docs).load_data()index VectorStoreIndex.from_documents(documents)# 2. 普通查询引擎base_engine index.as_query_engine(similarity_top_k8)# 3. 使用 HyDE 改写生成 hypothetical document 后再检索hyde HyDEQueryTransform(include_originalTrue)query_engine TransformQueryEngine(base_engine, query_transformhyde)response query_engine.query(新员工怎么申请电脑)print(response)五、方法三Step-back先退一步问上位问题有些知识库不是按具体问题组织而是按制度、原则、流程组织。用户问得越具体越可能检索不到上位规则。Step-back 会先把问题抽象成更高层问题再和原问题一起检索。代码示例Python可复制def build_step_back_queries(user_query: str) - list[str]:真实生产中这里通常由 LLM 生成。输出两路查询一路保留具体问题一路抽象成上位规则。return [user_query,与该问题相关的制度依据、处理流程、常见原因和审批规则是什么,]queries build_step_back_queries(报销发票被退回怎么办)for q in queries:docs retriever.search(q, top_k8)# 后续进入融合排序六、方法四Multi-Query RRF多角度召回再融合Multi-Query 会把一个问题改写成多个等价或互补表达让检索从多个角度去找资料。多个召回列表不能简单拼接一般要用 RRF 或 Rerank 做融合。代码示例Python可复制from collections import defaultdictdef reciprocal_rank_fusion(result_lists: list[list[str]], k: int 60) - list[tuple[str, float]]:result_lists: 多路召回结果每一路是按相关性排序的 doc_id 列表。RRF 思路同一篇文档在多个列表靠前最终分数就更高。scores defaultdict(float)for results in result_lists:for rank, doc_id in enumerate(results, start1):scores[doc_id] 1.0 / (k rank)return sorted(scores.items(), keylambda x: x[1], reverseTrue)result_lists [[doc_1, doc_2, doc_5],[doc_2, doc_4, doc_1],[doc_3, doc_2, doc_6],]print(reciprocal_rank_fusion(result_lists))代码示例Python可复制# LangChain MultiQueryRetriever 示例让 LLM 生成多条检索 Queryfrom langchain.retrievers.multi_query import MultiQueryRetrieverretriever vectorstore.as_retriever(search_kwargs{k: 6})multi_query_retriever MultiQueryRetriever.from_llm(retrieverretriever,llmllm,)docs multi_query_retriever.invoke(员工出差费用怎么报销)七、方法五Self-Query从自然语言里抽取过滤条件如果你的文档有 metadata例如部门、年份、类型、权限、产品线那么 Self-Query 会非常有用。它把用户问题拆成“语义检索词 结构化过滤条件”。代码示例Python可复制from pydantic import BaseModel, Fieldfrom typing import Optional, Literalclass StructuredQuery(BaseModel):query: str Field(description用于向量/BM25 检索的文本)doc_type: Optional[Literal[制度, 流程, FAQ, 公告]] Noneyear_gte: Optional[int] Nonedepartment: Optional[str] None# 用户问题查一下 2025 年以后跟医保报销有关的制度structured StructuredQuery(query医保报销,doc_type制度,year_gte2025,)# 注意生产中必须把 filter 映射到白名单字段不能让模型直接拼 SQL。filter_expr {doc_type: structured.doc_type,year: {$gte: structured.year_gte},}八、方法六Router Query先判断去哪套知识库查当知识库很多时先路由再检索比全库乱搜更稳定。路由可以按业务域、语言、权限、数据源类型来做。代码示例Python可复制ROUTES {finance: 财务制度库发票、报销、付款、预算,hr: 人事制度库入离职、薪酬、考勤、福利,it: IT 帮助库账号、权限、系统故障、设备申请,}def route_query(user_query: str) - str:prompt f你是查询路由器只能从 finance/hr/it 中选择一个。路由说明{ROUTES}用户问题{user_query}只输出路由 key。route llm.invoke(prompt).strip()return route if route in ROUTES else financeroute route_query(发票抬头错了怎么处理)docs retrievers[route].search(发票抬头错误处理流程, top_k8)九、到底用哪种改写方式Query Rewrite 没有银弹。直接改写成本最低HyDE 对表达差异大的问题有帮助Multi-Query 更适合复杂问题Self-Query 依赖高质量元数据Router Query 适合多知识库系统。十、工程上怎么评估 Query Rewrite评估时不要只看“改写得是否通顺”。真正要看召回是否更准、排序是否更靠前、答案是否更忠实、延迟是否能接受、有没有改写漂移。代码示例Python可复制def evaluate_rewrite(original_query: str, rewritten_queries: list[str], gold_doc_ids: set[str]) - dict:一个最小化离线评测示例。真实项目里可以扩展 RecallK、MRR、nDCG、Faithfulness、Latency 等指标。origin_docs retriever.search(original_query, top_k10)rewrite_docs []for q in rewritten_queries:rewrite_docs.extend(retriever.search(q, top_k10))origin_ids {d.id for d in origin_docs}rewrite_ids {d.id for d in rewrite_docs}return {origin_recall: len(origin_ids gold_doc_ids) / max(len(gold_doc_ids), 1),rewrite_recall: len(rewrite_ids gold_doc_ids) / max(len(gold_doc_ids), 1),new_hits: list((rewrite_ids - origin_ids) gold_doc_ids),}十一、生产级护栏改写可以增强但不能乱改Query Rewrite 最大的风险是“漂移”用户本来问 A改写器为了检索更顺手改成了 B。生产环境里必须保留原 Query、输出结构化 JSON、控制扩展数量、记录日志并对改写前后召回结果做对比。代码示例Python可复制class RewriteGuardrail:def __init__(self, max_queries: int 5, max_drift_score: float 0.35):self.max_queries max_queriesself.max_drift_score max_drift_scoredef validate(self, original: str, rewrites: list[str]) - list[str]:# 1. 控制数量rewrites rewrites[: self.max_queries]# 2. 保留原问题避免改写失败时完全跑偏candidates [original] rewrites# 3. 漂移检测实际可以用 embedding 相似度、LLM 判别或规则safe_queries []for q in candidates:drift estimate_semantic_drift(original, q)if drift self.max_drift_score:safe_queries.append(q)return safe_queries or [original]十二、可以直接记住的面试回答Query Rewrite 的目的是把用户原始问题改写成更适合检索系统理解和命中的查询表达。它主要解决口语化、上下文缺失、表达不匹配、单一路径召回不足、结构化过滤不足等问题。常见方式包括直接改写、多轮指代消解、HyDE、Step-back、Multi-Query、Self-Query 和 Router Query。工程上不能只追求改写通顺而要通过 RecallK、MRR、nDCG、答案忠实度、延迟、成本和漂移率来评估。生产环境里最稳的做法是保留原 Query 多路改写 混合检索 RRF 融合 Rerank 精排 引用校验 日志回放。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2026 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取