HyDE:假设性文档嵌入
让 LLM 生成一份虚构的“理想”答案,为其生成嵌入并据此搜索——效果优于短查询嵌入。
HyDE:假设性文档嵌入 是 CoddyKit 上的免费 AI Agents 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Agents 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Agents 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
查询嵌入的问题
用户查询通常很短,而且与您想要检索的文档完全不像。
- 查询:“修好我的键盘”
- 文档:“如果您的机械键盘按键出现粘连,可以使用异丙醇清洁轴体……”
两者的向量在语义上相距很远,因此检索不到该文档。
HyDE 思路
HyDE = 假设文档嵌入(Gao 等,2022 年)。
- 让 LLM 为查询写出一个虚构的“理想答案”
- 嵌入这个虚构答案,而不是查询
- 使用该向量搜索真实语料库
为什么有效
假设答案看起来像一篇真实文档(使用相似的词汇和结构)。它的嵌入会接近真实文档的嵌入,因此检索结果更加可靠。
Implementation
def hyde_search(query, k=5):
# Step 1: hallucinate an answer
hypo_answer = llm.invoke(f'Please write a passage to answer the question: {query}').content
# Step 2: embed it
vec = embed(hypo_answer)
# Step 3: retrieve
return vector_db.query(vec, k=k)答案有误也 OK
HyDE 生成的假设答案可能存在事实错误——这没有关系。我们只使用它的嵌入进行检索。随后使用检索到的 REAL 文档生成最终答案。
Code Example with LangChain
from langchain.chains import HypotheticalDocumentEmbedder
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
embeddings = HypotheticalDocumentEmbedder.from_llm(
ChatOpenAI(),
OpenAIEmbeddings(),
'web_search' # built-in prompt template
)
vector = embeddings.embed_query('How do I fix a sticky keyboard?')成本权衡
HyDE 会为每个查询额外增加 1 次 LLM 调用。以下情况值得使用:
- 查询的措辞与文档的措辞差异很大
- 检索召回率是瓶颈
- 语料库包含用户会进行改述的技术文档
多样本 HyDE
生成 N 个假设答案,分别嵌入,并为每个答案检索前 K 个结果,然后合并这些结果。成本更高,但对于棘手的查询,召回率也更高。
hypos = [llm.invoke(...).content for _ in range(3)]
vecs = [embed(h) for h in hypos]
results = set()
for v in vecs:
results.update(vector_db.query(v, k=5))将 HyDE 与重新排序结合
使用 HyDE 提升召回率,使用交叉编码器提升精确度:
- HyDE 检索前 50 个结果
- 交叉编码器将结果重新排序,取前 5 个
- LLM 使用前 5 个结果生成答案
不应使用 HyDE 的场景
- 查询已经与文档语言相匹配(常见问题)
- 对延迟敏感的路径
- 语料库非常小,朴素检索已经有效
用于代码的 HyDE
对于代码搜索:虚构用户正在寻找的函数,嵌入该函数,然后检索真实函数。
code_hypo = llm.invoke(f'Write the Python function that does: {user_request}').content
results = code_index.search(embed(code_hypo))变体:回退式提示
一种相关技术:先让模型推导出一个更一般的问题(“如何清洁键盘?”→“哪种通用清洁方法适用于机械键盘?”),然后嵌入该问题并进行检索。
HyDE 为何有效
为什么 HyDE 比直接嵌入原始查询的检索效果更好?
回顾
HyDE:虚构一个答案,嵌入 THAT,然后进行搜索。它会额外增加 1 次 LLM 调用,但能改善困难查询、改述查询或技术查询的检索效果。
常见问题解答
「HyDE:假设性文档嵌入」课时是免费的吗?
是的 — 「HyDE:假设性文档嵌入」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Agents 课程的其余内容,请升级到 CoddyKit PRO。 AI Agents 课程共包含 4 节课。
「HyDE:假设性文档嵌入」这节课中我会学到什么?
让 LLM 生成一份虚构的“理想”答案,为其生成嵌入并据此搜索——效果优于短查询嵌入。 你通过在浏览器中直接运行的动手代码来练习 AI Agents,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AI Agents 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AI Agents 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「HyDE:假设性文档嵌入」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AI Agents 课中编写并运行代码吗?
能。每节 AI Agents 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用交叉编码器重新排序
- HyDE:假设性文档嵌入
- 多向量检索(ColBERT)
- RAG 评估(RAGAS、Recall@K)