HyDE:用假想文档帮助检索
普通向量检索先将用户问题编码成向量,再到文档索引中寻找相近的向量。HyDE(Hypothetical Document Embeddings)改变了前半段:先让语言模型生成一段可能回答问题的文档,将这段假想文档编码,再用它检索真实语料。
它处理的是问题与文档之间的表达差距。短问题通常只有几个关键词,文档段落却包含术语、解释和相关概念。生成一段文档形式的文本,可以补充这些检索线索。
从问题向量换成假想文档向量
用户问“出差回来,报销是不是有个截止时间”,制度正文可能写的是“境内差旅费用申请应在行程结束后规定期限内提交”。两者谈论同一件事,但长度、语法和用词不同。
HyDE 会让模型针对这个问题生成一段类似制度说明的文本。例如:
问题:2026 年境内出差回来,多久之内要交报销?
假想文档:
境内差旅费用报销应在行程结束后 60 日内提交申请。
申请人需提交差旅费用明细和相关凭证,逾期申请按补报流程处理。这段文本出现了“行程结束”“费用报销”“提交申请”等可能与目标条款共同出现的表达。检索时使用整段文本的向量;不要求知识库中存在同一段文字,也不要求数字和细节全部正确。
设问题为 q,生成模型为 G,编码器为 E,知识库片段为 d:
普通向量检索:比较 E(q) 与 E(d)
HyDE:
h = G(q) 生成假想文档
v = E(h) 编码假想文档
按 similarity(v, E(d)) 检索真实片段原论文面向无相关性标签的零样本稠密检索,使用指令模型生成文本,再用无监督对比学习编码器构造检索向量。文档向量可在建库时预先计算,在线新增的工作主要是假想文档生成及其编码。
检索到真实文档后,怎样回答
假想文档提供检索方向,最终答案仍然来自知识库。继续上面的例子,假设真实条款写的是:
2026 年境内差旅费用应在差旅结束后 30 个自然日内提交。最终回答应采用真实条款中的 30 个自然日。生成的“60 日”和“补报流程”没有来源依据,不应加入回答证据。
下面用伪代码表示这一过程:
def answer_with_hyde(question):
hypothetical = generate_document(question)
query_vector = encode_hypothetical(hypothetical)
documents = vector_search(query_vector)
return generate_answer(question, evidence=documents)generate_answer 接收问题与检索片段,假想文档只用于生成检索向量。若知识库没有相关条款,HyDE 也无法提供答案。
为什么生成的错误文本仍可能有用
向量编码将文本压缩为语义表示。假想文档即使写错某个期限,仍可能与真实条款共享“境内差旅费用”“行程结束”“提交申请”等主要概念,从而找到相关片段。这也是 HyDE 能在生成内容不完全准确时发挥作用的原因。
但编码器不会主动核验事实,也不保证过滤掉错误。假想文档如果把“提交报销”写成“审批后付款”,检索方向就可能转向付款条款。错误是否影响检索,取决于它对整段表示的影响,以及知识库里相邻文档的分布。
生成提示词应保持原问题的主题、对象和明确条件。需要按 2026 年、境内范围过滤时,元数据条件仍应传给检索器。假想文档中的语义表达不能代替严格过滤。
与查询改写、多查询的区别
| 方法 | 模型生成什么 | 用什么去检索 |
|---|---|---|
| 查询改写 | 更完整或更规范的问题 | 改写问题的文本或向量 |
| Multi-Query | 同一需求的多种查询表达 | 多路分别检索,随后合并 |
| HyDE | 一段可能回答问题的文档 | 假想文档的向量 |
HyDE 不需要预先知道答案,却需要生成足够相关的文档表达。对于简称、口语或缺少背景的短查询,这可能补充检索线索;对于已经能精确命中的制度编号、函数名或标题,生成一段长文本反而可能稀释精确信息。
也可以同时执行原查询检索和 HyDE 检索,再融合候选。原查询保留精确词项,HyDE 提供文档表达。融合后仍要根据原问题选择证据,两路检索本身无法保证纠正生成偏差。
编码模型与调用成本
假想文档应按所用编码模型的输入约定进行编码。有些检索模型区分 query 和 document 前缀,有些使用统一编码方式;不能只因为生成文本长得像文档,就直接套用任意 SDK 的 embed_documents。这项选择需要与模型的训练方式和检索接口一致。
除了生成一份假想文档,也可以生成多份,对它们的向量求平均后检索。多份文本可能减少单次生成的偶然偏差,也会增加生成成本,且不能保证消除共同的错误假设。原论文讨论了多份假想文档及结合原查询表示的方式。
使用 HyDE 会比直接向量检索多一次文本生成,通常也增加输入长度。是否值得使用,要看它是否确实找回了短查询漏掉的目标片段。若原查询已经稳定命中,额外生成只会增加耗时;若生成文档经常跑题,则需要先调整生成内容或放弃这条检索分支。
原始来源
Precise Zero-Shot Dense Retrieval without Relevance Labels:HyDE 原论文,介绍假想文档生成、对比编码器及真实语料检索的关系。