找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5125

积分

0

好友

695

主题
发表于 6 小时前 | 查看: 4| 回复: 0

做过检索增强生成(Retrieval-Augmented Generation,RAG)的朋友大概都有这种体会:用户提了一个很合理的问题,可检索环节偏偏漏掉了最相关的信息。传统 RAG Pipeline 本身不弱,但它太依赖查询和文档分块之间的直接相似度匹配。一旦用户的措辞和文档里的写法存在差异,这套机制就容易失灵。

Hypothetical Document Embeddings(HyDE) 走了一条不同的路。它不是在“搜索文档”,而是让系统在正式开始检索之前,先想清楚一个理想的答案大致长什么样。

传统检索的痛点

绝大多数 RAG 系统的流程很直接:

Query → Embedding → Vector Search → Retrieved Chunks → LLM Response

向量数据库按照语义相似度做检索,但相似并不直接等于相关。来看一个例子:

Query:
"How can LangSmith help monitor LLM applications?"

如果存储的分块里从来没有出现过 “monitor”、“tracking” 或 “observability” 这类词,哪怕文档里其实有相关答案,检索质量也会明显下降。这带来了三类典型问题:对未见过的查询效果差、在领域专有术语上表现乏力、以及不相关的上下文被送进 LLM。检索一旦崩溃,生成环节通常也很难撑住。

HyDE模型示意图:用户查询经Claude生成假设文档,嵌入向量数据库检索真实文档(源自联邦储备报告等)的完整流程

HyDE 的设计思路

HyDE 是 Luyu Gao 提出的一种检索技术,核心构想是这样的:在向量检索之前,先让模型生成一份假设的答案文档。

不去直接把用户查询转换成 Embedding,而是走下面这几步:

User Query
      ↓
LLM generates hypothetical answer/document
      ↓
Create embedding of that hypothetical document
      ↓
Search vector database using this richer embedding
      ↓
Retrieve better context

这个想法的巧妙之处在于:生成的假设文档比简短的原始查询承载了更丰富的语义。检索系统据此搜索的是“上下文意图”,而不仅仅是停留在关键词层面的相似度上。

HyDE 的内部运行机制

完整流程如下。

1、用户提交查询,例如:

"What is LangSmith and why do we need it?"

2、LLM 根据查询生成一份假设文档。模型会写出一段可能回答该问题的合成文本,例如:

"LangSmith helps developers monitor, debug, and evaluate LLM applications..."

这份文档不追求事实完全准确,它表达的是“一个有用答案大致长什么样”。

3、将假设文档转为向量。这个向量通常比直接对原始查询做 Embedding 所获得的信息密度高得多。

4、用这个 Embedding 在向量数据库里执行相似度搜索:

Hypothetical Embedding → Similarity Search → Relevant Documents

检索关注的是概念层面的相关性,而非浅层的关键词匹配。

5、检索到的文档进入 RAG 的生成阶段,最终产出更准确、更贴合上下文的回答。

这套设计最大的好处是无需重新训练检索模型。仅仅改变查询的表达方式,就能带来检索质量的改善。

LangChain 中的实现

HyDE 能流行起来,其中一个原因是 LangChain 提供了现成的实现,可以直接拿来用。

from langchain.embeddings import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains.hyde.base import HypotheticalDocumentEmbedder

llm = ChatOpenAI(
    temperature=0
)

base_embeddings = OpenAIEmbeddings()

hyde_embeddings = HypotheticalDocumentEmbedder.from_llm(
    llm=llm,
    base_embeddings=base_embeddings,
    prompt_key="web_search"
)

query = "What is LangSmith and why do we need it?"

embedding = hyde_embeddings.embed_query(query)

LLM 生成假设答案,答案被转成 Embedding,随后 Embedding 被用于检索。代码改动量很小,但检索效果却可能有不小的提升。

总结

在那些文档很长、术语与用户表述差异大或者检索质量不稳定的 RAG 应用里,HyDE 尤其有用。传统 RAG 搜索的是“与查询相似的文档”,而 HyDE 搜索的是“与理想答案相似的文档”。就这么一个小小的视角切换,让检索变得聪明了不少。

云栈社区 的技术讨论中,这类围绕 RAG 和语义检索的优化实践一直是大家关注的热点话题,也欢迎入圈深入交流。


by Mangesh Jadhav




上一篇:CVE-2026-46300 Fragnesia提权漏洞有多危险?深度分析与应急指南
下一篇:HTAP架构详解:从OLTP到混合负载,千万QPS下的行列双存与查询融合实战
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-5-15 07:52 , Processed in 0.745909 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表