Featured image of post 从零学习 Hypothetical Document Embeddings (HyDE) - 1

从零学习 Hypothetical Document Embeddings (HyDE) - 1

最近看到了一篇新的论文,关于评估 RAG 中的各种技术的评估。这篇《ARAGOG: Advanced RAG Output Grading》提供了一个对比多种 RAG 技术的评估。其中提到 HyDE 和 LLM re-rank 能够很好的提高检索精度。不过似乎 HyDE 其实讨论并不是很多,那么咱就对这块内容添砖加瓦一下,让我们从零开始进行一段 HyDE 的冒险。

什么是 RAG?

大语言模型(LLM)虽然在过去的一段时间中成为大家眼中的香馍馍,但它们也存在一些关键的局限性:

  • 知识局限性: LLM 的知识范围主要局限于其训练数据,难以涵盖所有知识领域,在一些专业或冷门话题上表现不佳。尤其是现在 AI 应用场景需要使用来自于企业内部知识库或者外部知识库中的相关信息,而这些内部知识库往往是不在外部公开的。
  • 可靠性问题: LLM 依赖于概率模型生成文本,结果难免存在事实性错误或缺乏可靠性,在某些关键应用中存在风险。比如之前的加拿大航空赔偿事件,尤其是对敏感的需要正确信息的场景,一旦出现错误的信息往往意味着潜在的损失。

要解决这些问题,那么就需要是用 RAG 来帮助解决。那么,什么是 RAG 呢?

Retrieval-Augmented Generation (RAG) 是一种基于检索的生成式模型,它结合了检索式和生成式的优点,可以在生成式模型(Generative Model)中引入外部知识。RAG 模型由两部分组成:一个是检索器,另一个是生成器。检索器负责从知识库中检索相关信息,生成器则负责生成答案。与传统的大语言模型(LLM)仅依靠自身有限的知识进行文本生成不同,RAG 模型能够动态地从海量的外部知识库中检索相关信息,并将这些信息融入到生成过程中,产生更加准确、连贯的输出内容。

换句话说,当用户提出一个查询或者需要生成某种类型的文本时,RAG 模型首先会利用一个信息检索子模块,从知识库中检索出与查询相关的信息。然后,RAG 的生成子模块会结合这些检索到的相关信息,生成最终的输出文本。这种结合检索和生成的方式,使 RAG 模型能够弥补传统 LLM 的局限性,提高生成内容的准确性和可靠性。

简单点来说,RAG 的基本流程如下:

什么是 HyDE?

但是在是用 RAG 的时候,你往往也会遇到一些问题。

让我们设想一个场景:我们有一个知识库,里面存储了大量的文档,我们希望使用 RAG 模型来回答用户的问题。但是,原始的 RAG 只能处理知识库中包含的数据,但是对于知识库中不存在的数据,RAG 无法处理。比较常见的场景包含用户的问答系统,帮助中心,对话系统等。用户通常对你的系统或者专有名词并不了解,他们通常会提出一些根据自己理解或者自己熟悉概念中的名词问题,这些表达方式可能并不在你的知识库中。这时候 RAG 就无法从知识库中检索到相关信息。

HyDE (Hypothetical Document Embeddings) 是一种基于 RAG 模型的模式,它使用 LLM 生成一个假设的回答文档,然后将这个假设的回答文档与知识库中的文档进行比较,从而找到与用户问题相关的信息。

HyDE 的核心思想是,通过对比真实文档和"假设"文档的差异,学习出能够更好捕捉文本语义和上下文信息的文档向量表示。所谓"假设"文档,是指通过 mask、重排等方式人为构造的虚拟文档。模型需要学会区分真实文档和这些假设文档,从而得到蕴含深层语义的文档向量。

因为不是直接使用原有的提问数据,HyDE 可以帮助 RAG 模型处理知识库中不存在的数据,提高模型的泛化能力,使其能够更好地应对用户提出的各种问题。它相对原有的直接是用 RAG 模型,可以更好地处理用户提出的问题,提高模型的准确性和可靠性。这种对比学习的训练方式,使 HyDE 能够捕捉文档中隐含的语义信息和上下文关系,而不仅仅局限于简单的词汇统计。

RAG 模型的核心在于结合检索和生成,从而弥补传统 LLM 的知识局限性和可靠性问题。而 HyDE 则提供了一种更加富含语义信息的文本表示方式。将这两种技术结合,我们可以产生一些协同效果,提高结果效果:

  • 利用 HyDE 提升 RAG 生成性能:HyDE 生成的文档向量能够更好地捕捉文本语义和上下文信息,这些语义丰富的文本表示,有助于 RAG 模型产生更加相关、连贯的生成内容。
  • 增强 RAG 模型的可靠性:RAG 可以利用外部知识库增强自身知识,提高生成内容的准确性;而 HyDE 则能进一步约束生成过程,确保输出结果更加可靠。

HyDE 的工作原理

为了方便更好的理解 HyDE,我们从流程图开始:

我们可以注意到,相比原生的 RAG,HyDE 和 RAG 合作的时候,多了两步:一步是是用 LLM 尝试回答问题,第二步是生成一个假设的文档,这个假设的文档是通过 LLM 生成的。同时,embedding 时使用的来源也不同:原生 RAG 是使用的用户问题,HyDE 则是使用了 LLM 生成的文档进行。

下一步

这篇文章主要对一些概念性的东西做了一些阐述和解释。虽然 AI 行业中很多概念看上去非常高大上,但实际上的工程实现未必十分复杂。当然一部分也归功于各种框架的功劳。接下来的一片文章中,我会以 LangChain 为例子,演示如何在实际的演示中使用 HyDE。当然,如果有时间,我也会演示一下如何直接从零手搓一个:这并不是很复杂,但是也需要一点点我的时间。:D

STAY TUNED!

Built with Hugo
主题 StackJimmy 设计