HyDE:用 LLM 生成假设性文档做检索
读完 LLM2Vec-Gen 后再翻它的 reference,绕不开 HyDE(Precise Zero-Shot Dense Retrieval without Relevance Labels,2022)。LLM2Vec-Gen 的训练目标本质上是把 HyDE 的两步流程内化进 encoder,而 HyDE 的核心思路是:zero-shot 场景下与其让无监督 encoder 直接建模 query 和 document 的相关性,不如先让 LLM 根据 query 生成一段"假设性回答",再用 encoder 编码这段假答案去检索。
问题背景

dense retrieval 的标准范式是训两个 encoder(query 端 enc_q、文档端 enc_d),把内积当作相关性分数。“相关性"这个目标依赖标注数据。MS-MARCO 这类大规模标注集是少数特例,多数场景拿不到。Contriever 这类无监督对比学习方案能学到文档-文档相似度,但 query-document 相关性缺乏监督信号。结果是 zero-shot 场景下 Contriever 在不少任务上输给 BM25。
HyDE 的处理是把检索拆成两步:
- 生成:用 instruction-tuned LLM(论文用 InstructGPT /
text-davinci-003)根据 query 生成一段假设性文档(hypothetical document) - 编码:用无监督对比 encoder(Contriever)把这段生成文档编码成向量,到文档库里做 ANN 检索
query 和 document 之间的"相关性"由 LLM 的生成过程隐式承担,剩下的检索退化为"文档-文档"相似度,而这恰好是无监督对比学习能学好的部分。论文原话:“the query-document similarity score is no longer explicitly modeled nor computed.”
LLM 生成的内容不需要事实正确,只需要在分布上接近"相关文档”。论文给出的解释:Contriever 的 dense bottleneck 充当 lossy compressor,会丢掉生成文本里的虚假细节,保留语义骨架。这是论文的假设而非实证,真正支撑结论的是下游检索分数。
为什么生成的假设性文档能用于检索
LLM 生成的回答可能在事实层面出错(数字、人名、日期都可能是幻觉),论文的两点解释:
有损压缩本质。几百维稠密向量装不下一段文档的全部细节,能保留的是语义和主题。即便 LLM 在具体数字、人名、日期上出错,embedding 层面的语义骨架不变,仍能匹配到真正相关的文档。论文只是从 dense bottleneck 的有损性这一角度做了定性说明,未给出具体例证。
例子比抽象概念好学。让 LLM 给"相关性"举一个具体例子,比让 encoder 抽象地学"相关性"容易。Instruction-tuned LLM 在 2022 年已经具备较强的指令泛化能力,HyDE 把相关性建模外包给 NLG,让 encoder 只做文档-文档相似度。
LLM2Vec-Gen 的核心假设(embedding 应当表示 LLM 的回答而不是 query 本身)就是 HyDE 这个思路的延续。
实验结果
Web search(TREC DL19/20)。Contriever 单独跑 nDCG@10 为 44.5/42.1,BM25 为 50.6/48.0,Contriever 输给词面匹配。HyDE(InstructGPT 生成 + Contriever 编码)涨到 61.3/57.9,比 BM25 高约 10 分。在 MS-MARCO 上 fine-tune 过的 ContrieverFT 是 62.1/63.2:DL19 上 HyDE 接近持平,DL20 上仍低约 5 分(论文原文为 “around 10% lower map and ndcg@10 than ContrieverFT”)。
Low-resource BEIR。Scifact、Arguana、Trec-Covid、FiQA、DBPedia、TREC-NEWS 六个数据集上,HyDE 大幅领先无监督 baseline,多数场景下也超过 fine-tuned 的 DPR 和 ANCE。例外是 TREC-Covid(HyDE 59.3 vs BM25 59.5)以及 FiQA、DBPedia 上不及 ContrieverFT。FiQA 是金融帖子,DBPedia 是实体检索,论文将原因归为 instruction 未充分传达领域特性。这反映出 HyDE 的相关性建模能力依赖 LLM 的领域知识,LLM 不熟的领域上限受限。
Multilingual(Mr.TyDi)。Swahili、Korean、Japanese、Bengali 上 HyDE 改进 mContriever,但与 fine-tuned mContrieverFT 之间仍有可见差距。论文归因于非英文语言在 LLM 预训练和 instruction tuning 阶段都被 under-trained,生成质量本身较差。
两个消融发现
LLM 越大 HyDE 越强。同样配 Contriever,11B 的 FLAN-T5 在 DL19/20 上 nDCG@10 为 48.9/52.9,52B 的 Cohere 为 53.8/53.8,175B 的 InstructGPT 为 61.3/57.9。这是一条单调上升的 scaling 曲线,与 LLM2Vec-Gen 论文中"8B > 4B > 1.7B"的增益趋势一致。
fine-tuned encoder 不一定更划算。把 Contriever 换成在 MS-MARCO 上 fine-tune 过的 ContrieverFT,配较弱的 instruction LM(FLAN-T5 11B / Cohere 52B)整体分数比 ContrieverFT 单跑略低;只有配 InstructGPT 175B 才能在 ContrieverFT 基础上继续提升(DL19 nDCG@10 67.4,比 ContrieverFT 单跑高 5 分)。论文的 takeaway:HyDE 的设计前提是无标注;有了 in-domain 监督后,弱 LM + fine-tuned encoder 的组合得不偿失,需要足够强的 LM 才能继续榨出收益。
由此可以划出 HyDE 的适用边界:冷启动或无 in-domain 标注时表现强,有了大量标注数据后让位给 fine-tuned dense retriever。论文最后给出分阶段部署建议:搜索系统冷启动时全用 HyDE,搜索日志积累后逐渐切到 fine-tuned retriever,把高频和成熟 query 切到监督模型,长尾和新兴 query 留给 HyDE。
对后续工作的影响
工程上 HyDE 没有训练模型,只是把 InstructGPT 和 Contriever 拼起来加一些 prompt。它在概念层面的贡献是把"相关性建模"从 representation learning 中剥离,外包给 NLG 模型。dense retrieval 之前的隐含假设是相关性必须由 encoder 学会,HyDE 的命题是相关性可以由 LLM 用一段答案 demo 出来,encoder 只需学文档-文档相似度。论文末尾原话:“is numerical relevance just a statistical artifact of language understanding?”
后续引出的几个方向:
- LLM2Vec-Gen 把 HyDE 的"推理时生成 + 编码"两步内化进训练,省掉每次查询的生成成本
- Query2doc、Promptagator 把同一思路用于 query expansion 和数据增强
- GritLM 等 generative + representational 联合训练方向沿用相同命题
几个易被忽视的实现细节
query 自身作为额外 hypothesis。论文公式 (8) 把 query 自身的 embedding 也加入平均池化,权重等同于一份 hypothetical document:v_q = (1/(N+1)) [Σ f(d_k) + f(q)]。论文只说"也将 query 视为一种可能的 hypothesis",未展开动机。
多份生成取平均。HyDE 默认让 InstructGPT 以 temperature=0.7 对同一个 query 生成多份假设性文档,再把它们的 embedding 求平均,以平滑单次生成带来的质量波动。LLM2Vec-Gen 把这一步内化进 encoder 的动机也来自这里:每次查询都要跑多次生成意味着延迟、成本、方差三重代价。
instruction 按数据集定制。Appendix A.1 列出 8 套 prompt:web search 是 “write a passage to answer the question”,SciFact 是 “write a scientific paper passage to support/refute the claim”,FiQA 是 “write a financial article passage”。HyDE 严格意义上不是完全 zero-shot,对"什么算相关文档"的认知通过 prompt 注入。论文将 FiQA 和 DBPedia 上不及 ContrieverFT 的原因笼统归为 instruction 不够具体。
小结
HyDE 在无标注场景下是一个简单且有效的基线方案,跑一个 prompt 即可拿到接近 fine-tuned dense retriever 的效果。方法论上它把检索拆成"LLM 负责相关性 + encoder 负责相似度"两个解耦部件,这一拆分思路在后续工作中被反复使用。