[

Millennium Bismay
大型语言模型(LLMs)快速发展,为聊天机器人提供了事实上的框架。通过按照提示直接操作,这些模型可以扮演永远有帮助的数字助理的角色。然而,与早期不那么复杂的同行相比,它们提供更密集、凝聚力更强的反应。然而,没有完美的英雄,也缺乏不可替代的知识地图。尽管如此,当他们不知道自己不知道时,它们确实缺少停下来反思并纠正的能力。这种幻觉问题是指LLMs预测下一个标记(单词)的行为偏离真实上下文,导致实际上不相关或错误的输出。

在将 RAG 与时事相结合时,我们需要最新的可用信息。不幸的是, LLMs有一个内在的限制——他们只能了解预先训练的数据,这不可避免地存在一个知识截止日期。哎呀!

<span id="ba40" data-selectable-paragraph="">User Query: When should I go to bank before next weekend? I need urgent money.  
  
Context1: The colorado river is really pretty. There are tons of bars on its  
          bank! People say the river walk on its bank is awesome. But its  
          closed on Fridays!  
  
Context2: Banks are generally open from Monday to Saturday. However, Next week,  
          Tuesday is a bank holiday.

您认为哪一个上下文与用户查询最相关?我相信,你们大多数人都同意(Context1)。为什么呢?是因为单词/短语——‘银行’、‘下周末之前’或‘需要紧急资金’吗?嗯,我想我们都知道。如果仔细观察,会发现单词‘金钱’在Context1 中出现两次,在Context2中出现一次。并且‘_上下文2_中的‘对金钱的需求’和句子结构清楚地表明,上下文2_谈论的是_银行金融机构。但LLM怎么知道这一点呢? — 通过了解用户查询和上下文之间的上下文相似性。由于‘银行’出现两次,简单的关键字搜索将返回Context1作为更好的结果。然而,LLMs使用的_嵌入模型_是在巨大的数据集上训练的。当我们通过这些模型传递文本块时,我们得到了捕获其上下文的文本块的向量表示。它使用单词的位置并查看文本块的每个单词来识别其上下文。但不管用户是搜索银行、金融机构还是金钱需求,LLMs都能准确理解上下文和查询之间的相似性。现在,如果我们有一个开放式的查询,如‘需要紧急资金但不知道从哪里开始’,我们需要利用元数据过滤来缩小搜索空间。如果我们的查询太复杂,我们也可以将它分解为子查询并逐步执行检索,最后聚合上下文以进行响应,这就是所谓的查询转换过程。有时,由于检索的文档数量少,可能会遇到所谓的“召回天花板”问题——虽然我们确实可以使用集成检索来检索更多文档,但这仍然受到检索质量的影响。此外,当我们无法获得有效的引文时,LLMs会陷入困境。但是,我们可以通过神经重新排序器对检索结果进行重新排序,以提高响应的质量。最后,如果我们的查询过于开放式,如果我们只是找到语义相似的文档,我们也可能会错过关键文档,所以我们也可以使用传统的关键字检索器,如BM25。尽管如此,如果您仍然无法从有限数量的结果中获取有用的信息,我们可以通过Agentic RAG实现代理行为,即识别当前上下文何时不足以回答查询,并知道何时深入挖掘并获取更多上下文。因此,虽然引文在RAG框架中是一个重要组成部分,但如果我们有效地处理存储和检索,引用将不再是问题。但是,为了获得最好的结果,需要遵循一系列步骤:从理解用户查询到使用元数据过滤缩小搜索空间;从分解复杂查询到逐步执行检索以聚合上下文;从集成检索的文档数量少的问题到神经重新排序器对检索结果进行重新排序。在后续博客中,我们将深入探讨这些组件如何结合在一起以生成高质量的响应。让我们再次强调一点——一分耕耘,一分收获!

图2. (左)迭代检索涉及检索和生成之间的交替,允许在每一步从知识库中获得更丰富、更有针对性的上下文。
(中)递归检索涉及逐步细化用户查询并将问题分解为子问题,然后通过检索和生成不断解决复杂问题。
(右)自适应检索重点是让RAG系统能够自主判断是否需要外部知识检索以及何时停止检索和生成[1]

我们将通过代码深入研究所有这些 RAG 框架! - 在我们即将发布的博客中。我知道这是一篇很长、理论性很强的文章。相信我,我也想直接跳到代码中!但事实证明,编写所有这些内容比仅仅编写一些代码示例要困难得多。
尽管如此,我意识到,在深入_探讨_如何构建高级 RAG 系统之前,了解_何时_以及_为何_构建高级 RAG 系统至关重要。

因此,如果您一直向下滚动寻找代码,并且对它还没有出现感到有点恼火,我鼓励您返回并首先查看“何时”和“为什么”。如果您阅读了这篇文章,谢谢!
我希望您已经理解为什么 RAG 会继续存在以及为什么我们应该增强基本的 RAG。我保证,“如何”很快就会出现 - 我会随身携带代码!
在那之前,继续学习,继续成长,如果您喜欢这些内容并想从里到外了解“如何”,也许可以关注我!