HyDE 是什么
HyDE(Hypothetical Document Embeddings)先让模型针对用户问题写一段“假设答案”,再用这段假答案的向量去检索真实文档。直觉是:答案与答案的措辞、句式更接近,而问题与文档之间存在文体鸿沟。它在零样本、问题表述与文档措辞差异大的场景能改善召回,代价是每次检索多一次生成调用,且假设文档可能包含编造内容。
基本信息
| 提出者 | Gao 等,Precise Zero-Shot Dense Retrieval without Relevance Labels(2022) |
|---|---|
| 流程 | 问题 → 生成假设文档 → 向量化 → 检索 → 只保留真实文档 |
| 额外成本 | 每次查询多一次生成调用 |
| 适用 | 零样本、无标注、问题与文档文体差异大 |
| 不适用 | 已有高质量改写策略或高频低延迟场景 |
典型使用场景
- 冷启动知识库:还没有标注数据,无法用微调改善检索时先试 HyDE
- 问答文体差异大:用户口语提问,文档是规范的条款或手册
- 与多查询融合配合:把原问题与假设文档各检索一次,合并候选后统一重排
- 低延迟要求下的取舍:只对复杂问题启用,简单问题直接检索
- 评测对照:与直接检索、查询改写两条基线在同一评测集上比 Recall@k
流程伪代码
流程伪代码
hypo = llm('写一段能回答该问题的短文,无需保证准确:' + question)
hits = vector_store.search(embed(hypo), top_k=10)
# 假设文档只用于检索,绝不进入最终上下文
context = [h.text for h in rerank(question, hits)][:5]查询增强手段对比
| 手段 | 额外调用 | 适合场景 |
|---|---|---|
| 查询改写 | 1 次 | 口语化、含指代的问题 |
| 同义扩展 | 0~1 次 | 专名、缩写、术语不一致 |
| 多查询分解 | 1 次 | 多实体比较、链式推理 |
| HyDE | 1 次 | 问题与文档文体差异大 |
假设文档可能编造事实,它只是通往真实文档的“桥”,一旦被拼进最终上下文,模型会把它当成权威内容照抄。