(三)RAG 高级检索策略——MQE、HyDE 与扩展检索

📅 2026/7/27 6:12:15
(三)RAG 高级检索策略——MQE、HyDE 与扩展检索
上一篇学习了 HelloAgents 中 RAG 系统的整体实现流程包括文档解析、智能分块、Embedding 以及向量数据库。本篇继续学习 RAG 检索阶段的优化策略。很多人在刚接触 RAG 时都会发现这样一个问题知识库里明明有答案但模型却没有检索出来。这并不是 Embedding 或向量数据库的问题而是用户的问题与知识库中的表达方式可能存在差异。为了提高知识召回率HelloAgents 在普通向量检索的基础上实现了MQE多查询扩展、HyDE假设文档嵌入以及统一的扩展检索框架。一、为什么需要高级检索普通 RAG 的检索流程其实非常简单。用户问题 │ ▼ Embedding │ ▼ 向量检索 │ ▼ 返回相关文档这种方式已经能够实现语义检索但仍然存在一定局限。例如知识库中写的是Python 入门教程而用户提问如何学习 Python虽然表达的是同一个意思但由于用词不同最终检索结果可能并不理想。因此现代 RAG 系统通常不会直接拿用户的问题去检索而是会先对 Query 进行优化再执行向量搜索。二、MQE多查询扩展MQE全称Multi-Query Expansion多查询扩展。它的核心思想非常简单一个问题可以有很多种不同的表达方式。例如用户输入如何学习Python经过 LLM 扩展后可以生成多个语义相近的查询Python入门教程 Python学习路线 Python基础课程 Python编程指南随后系统会分别使用这些 Query 进行向量检索。相比只搜索一次这种方式能够覆盖更多相关文档提高召回率。HelloAgents 中生成扩展 Query 的核心代码如下def _prompt_mqe(query: str, n: int): llm HelloAgentsLLM() prompt [ { role: system, content: 生成语义等价或互补的查询 }, { role: user, content: f原始查询{query} } ] return llm.invoke(prompt)这里实际上调用了一次大语言模型但模型并不是回答用户的问题而是负责生成多个不同表达的 Query。随后这些 Query 会分别进入向量检索流程。三、HyDE假设文档嵌入相比 MQEHyDE 的思路更加有趣。HyDE 全称Hypothetical Document Embeddings中文一般翻译为假设文档嵌入。它解决的是另一个问题问题和答案在向量空间中的分布可能并不一致。例如用户提出Transformer是什么知识库中的内容却是Transformer 是 Google 于2017年提出的一种基于 Self-Attention 的神经网络模型……用户的问题属于疑问句而知识库保存的是陈述句。直接进行向量匹配时两者之间可能存在一定语义距离。HyDE 的做法就是先让 LLM 假设回答一次再利用这段假设答案去检索知识库。HelloAgents 中对应代码如下def _prompt_hyde(query: str): llm HelloAgentsLLM() prompt [ { role: system, content: 根据用户问题生成一段可能的答案 }, { role: user, content: query } ] return llm.invoke(prompt)需要注意的是这里生成的内容并不会直接返回给用户而是作为新的检索文本进行 Embedding。由于假设答案与知识库中的文档表达方式更加接近因此通常能够获得更好的检索效果。四、统一扩展检索框架HelloAgents 并没有把 MQE 和 HyDE 分别实现而是统一封装到了扩展检索接口中。核心代码如下search_vectors_expanded( queryquery, top_k8, enable_mqeTrue, enable_hydeTrue )其中enable_mqeTrue开启多查询扩展。enable_hydeTrue开启假设文档嵌入。整个流程可以表示为用户问题 │ ▼ 生成多个QueryMQE │ ▼ 生成假设答案HyDE │ ▼ 多个Query分别检索 │ ▼ 结果合并 │ ▼ 去重排序 │ ▼ 返回Top-K文档相比普通 RAG 的一次检索这里实际上进行了多次向量搜索因此能够覆盖更多相关内容。五、检索结果是如何合并的多个 Query 完成检索之后还需要把所有结果整合起来。HelloAgents 的实现思路可以概括为三个步骤收集所有扩展 Query 的检索结果。对重复文档进行去重。按照相似度得分重新排序返回 Top-K。源码中对应逻辑如下for q in expansions: hits store.search_similar( query_vectorqv, limitper ) for h in hits: ...可以看到每个扩展 Query 都会执行一次向量检索。随后系统会保留同一文档的最高得分并按照得分排序。这样既扩大了召回范围又避免了重复返回相同内容。六、不同策略适用于哪些场景HelloAgents 文档中也提到了不同策略的适用场景。对于一般知识问答可以开启 MQE提高不同表达方式下的检索效果。对于专业领域或技术文档由于术语较多建议同时开启 MQE 与 HyDE进一步提升语义匹配能力。如果更加关注响应速度也可以关闭这些扩展策略仅使用基础向量检索。因此不同策略并没有绝对的优劣而是需要根据具体业务场景进行选择。七、总结这一篇主要学习了 HelloAgents 中实现的高级检索策略。相比传统 RAG 直接使用用户问题进行检索HelloAgents 会先利用大语言模型优化 Query再执行向量搜索从而提升知识召回率。整个系统主要包含三种策略策略作用MQEMulti-Query Expansion将一个问题扩展为多个不同表达提高召回率。HyDEHypothetical Document Embeddings先生成假设答案再利用假设答案进行检索提高语义匹配能力。扩展检索框架将 MQE 和 HyDE 统一整合对多个检索结果进行去重、排序返回最相关的文档。可以看到影响 RAG 效果的不仅是大语言模型本身检索阶段的优化同样十分重要。通过 MQE、HyDE 等策略可以在不修改知识库内容的情况下提高系统对不同表达方式和专业问题的检索能力这也是现代 RAG 系统中常见的优化方向。