跳到正文
北京时间
原文
LangChain:Blog·· 2023-11-18精选AI 评分68

LangChain 解析 OpenAI 的 RAG 实验策略并给出实现方法

Applying OpenAI's RAG Strategies

AI 导读

LangChain 撰文解读 OpenAI 在 demo day 分享的客户 RAG 实验,将其归纳为基线检索、查询变换、路由、查询构造、索引构建和后处理等类别。

推荐理由

原文将 OpenAI 分享的 RAG 实验逐项拆解,并给出 LangChain 中可直接复用的对应实现入口。

正文 · AI 翻译

背景

在他们的演示日上,Open AI 报告了他们与一位客户合作进行的一系列 RAG 实验。虽然评估指标将取决于你的具体应用,但了解哪些方法对他们有效、哪些无效是很有意思的。下面,我们将逐一展开所提及的每种方法,并展示你如何为自己实现每一种方法。理解并在你的应用上应用这些方法的能力至关重要:通过与众多合作伙伴和用户交流,不存在“一刀切”的解决方案,因为不同的问题需要不同的检索技术。

这些方法如何融入 RAG 技术栈

首先,我们可以将这些方法归入几个 RAG 类别。下图展示了每个 RAG 实验所属的类别,并将它们放置在 RAG 技术栈中的位置:

基线

基于距离的向量数据库检索将查询嵌入(表示)到高维空间中,并基于“距离”找到相似的嵌入文档。OpenAI 研究中使用的基线检索方法提到了余弦相似度。LangChain 拥有 超过 60 个向量存储集成,其中许多允许配置用于相似性搜索的距离函数。关于各种距离度量的有用博客文章可以在 Weaviate 和 Pinecone 上找到。

查询转换

然而,由于查询措辞的细微变化,或者如果嵌入不能很好地捕捉数据的语义,检索可能会产生不同的结果。查询转换是一组专注于修改用户输入以改进检索的方法。 请参阅我们最近关于该主题的博客此处。

OpenAI 报告了两种方法,你可以尝试:

  • 查询扩展:LangChain 的多查询检索器使用 LLM 从不同角度为给定的用户输入查询生成多个查询,从而实现查询扩展。对于每个查询,它检索一组相关文档,并取所有查询的唯一并集。
  • HyDE:LangChain 的HyDE(假设文档嵌入)检索器为传入的查询生成假设文档,将其嵌入,并在检索中使用它们(参见论文)。其想法是,这些模拟文档可能比问题本身与所需源文档更相似。

其他值得考虑的想法:

  • 退一步提示:对于推理任务,这篇论文表明,退一步的问题可以用来将答案综合建立在更高层次的概念或原则之上。例如,一个关于物理的问题可以抽象为一个关于用户查询背后物理原理的问题和答案。最终答案可以从输入问题以及退一步的答案中得出。请参阅这篇博客文章和LangChain 实现以了解更多信息。 
  • 重写-检索-阅读:这篇论文重写用户问题以改进检索。请参阅LangChain 实现以了解更多信息。

路由

在跨多个数据存储进行查询时,将问题路由到合适的源变得至关重要。OpenAI 的演示报告称,他们需要在两个向量存储和一个 SQL 数据库之间路由问题。LangChain 支持路由,使用 LLM 将用户输入门控到一组已定义的子链中,如本例所示,这些子链可以是不同的向量存储。 

查询构建

由于 OpenAI 研究中提到的数据源之一是关系型(SQL)数据库,因此需要从用户输入生成有效的 SQL 以提取必要信息。LangChain 支持 文本到 SQL,我们最近专注于查询构建的博客对此进行了深入探讨。

其他值得考虑的想法:

构建索引

OpenAI 报告称,仅仅通过在文档嵌入期间尝试不同的块大小,性能就获得了显著提升。由于这是索引构建中的核心步骤,我们有一个开源 Streamlit 应用,你可以在其中测试块大小。

虽然他们没有报告嵌入微调带来显著性能提升,但已有积极结果被报道。尽管 OpenAI 指出这可能不被建议作为“低垂的果实”,但我们分享了微调指南,并且 HuggingFace 有一些非常不错的教程对此进行了更深入的探讨。

后处理

在检索之后、LLM 摄取之前处理文档是许多应用的重要策略。我们可以使用后处理来强制检索文档的多样性或时效性,当我们从多个来源汇集文档时,这一点尤其重要。 

OpenAI 报告了两种方法:

  • 重排序:LangChain 与 Cohere ReRank 端点的集成是一种方法,可用于在检索大量文档的情况下进行文档压缩(减少冗余)。相关地,RAG-fusion 使用倒数排名融合(参见博客和实现)来重排序从检索器返回的文档,类似于多查询(上文讨论过)。
  • 分类:OpenAI 根据每个检索文档的内容对其进行分类,然后根据分类选择不同的提示。这结合了两个想法:LangChain 支持文本的标记(例如,使用函数调用强制输出模式)以进行分类。如上所述,逻辑路由也可用于基于标签进行路由(或将语义标记过程包含在逻辑路由链本身中)。

其他值得考虑的想法:

  • MMR:为了在相关性和多样性之间取得平衡,许多向量存储提供最大边际相关性搜索(参见博客文章此处)。
  • 聚类:一些方法使用嵌入文档的聚类与采样,这在我们跨广泛来源整合文档的情况下可能有所帮助。

结论

看看 OpenAI 在 RAG 这一主题上尝试过什么是很有启发性的。如上所示,这些方法可以在你自己的手中复现:尝试不同的方法至关重要,因为应用性能在 RAG 设置上可能差异很大。

然而,OpenAI 的结果也表明,评估至关重要,可以避免在收效甚微或毫无收益的方法上浪费时间和精力。对于 RAG 评估,LangSmith 提供了大量支持:例如,这里 是一个使用 LangSmith 评估多个高级 RAG 链的 cookbook。  

来源:LangChain:Blog · langchain.com