LLM 驱动的 Google 搜索

社区文章 发布于 2024 年 5 月 1 日

如何使用 RAG 方法通过 ML 访问整个互联网

最近,在像 GPT、Gemini 这样的大型语言模型 (LLM) 世界中,我们一直在听到一个叫做“幻觉”的词。它指的是 LLM 开始生成事实不准确的输出的状态。为了解决这个问题,ML 社区发明了一种名为 RAG (Retrieval-Augmented Generation) 的方法。

RAG 使用一种简单的技术,将用户查询的知识附加到提供给模型的提示中。将其想象成一次开卷考试。我们为模型提供关于用户查询的背景知识;模型会利用这些知识来回答问题。这些知识可以来自任何地方。例如,任何 PDF、文档甚至互联网。是的,甚至可以来自 Google。那些需要付费才能访问互联网的聊天 LLM 可以免费实现。它的速度和准确性可能远不如付费选项,但总比没有好。

因此,让我们使用 RAG 方法构建一个由 AI 驱动的搜索引擎。

背景知识就介绍到这里,让我们进入技术层面。

image/png

上图是 RAG 模型的主要架构。

我们的方法概述。我们将预训练的检索器(查询编码器 + 文档索引)与预训练的 seq2seq 模型(生成器)相结合,并进行端到端微调。对于查询 x,我们使用最大内积搜索 (MIPS) 来查找前 K 个文档 zi。对于最终预测 y,我们将 z 视为潜在变量,并根据给定不同文档的 seq2seq 预测进行边缘化。

但对于我们的项目,我们将对架构进行一些更改

image/png

我们的文档来自 Google 本身。当用户提出任何问题时,它会被导向 Google,然后我们从搜索结果中提取所有链接,除了广告(当然)。我们需要从数据中提取前 K 个相关项作为上下文提供给模型。Google 搜索已经根据页面排名算法(基于关键词匹配和其他元数据)对页面进行了排名。但是,我们从页面获得的数据中仍然有许多不相关的文本。为了过滤,我们将重新对页面数据进行排名。但在此之前,我们需要将页面分解成更小的句子(每个句子块最少 n 个单词),以便更容易编码。

我们使用相同的模型对用户查询和数据块进行编码。在我们的案例中,是句子转换器。然后,这些编码后的数据块用于与用户提示进行语义搜索(余弦相似度),以获取前 K 个项目。然后,前 K 个项目会作为上下文附加到用户查询中,并进行一些提示工程,然后作为输入提供给生成器模型。我这里使用的生成器模型是 Google 的 Gemma-7b-it。它已经是一个指令微调模型。这是一个非常棒的模型,在大多数情况下都能产生出色的输出。当与 RAG 方法结合使用时,对于一个 70 亿参数的模型来说,它的性能非常好。

论文和我们方法之间的一个主要区别是端到端反向传播。我们只在推理模式下使用模型。以下是 Streamlit UI 和模型输出的一些结果。当有大量数据需要编码和存储在 GPU 中时,应用程序会有点不稳定。

image/png

而且,您可以查询最新的事件,而不仅仅局限于 LLM 的训练数据和模型训练日期。但是输出仍然感觉比针对特定目的策划的更通用。也许我对一个 7b 模型期望过高了 🙂。

整个应用程序运行得非常慢。在 Google 中搜索和模型推理都需要时间。如果你不想从头开始编写代码,可以尝试使用 langchain.agent 来搜索 Google,然后使用 langchain 来完成大部分工作。

搜索 Google 页面全部通过 Python requests 和 BeautifulSoup 完成,用于从 HTML 中抓取文本。搜索页面以获取前 K 个项目如下所示。它只是提示和项目所有块之间的点积。从而得到与查询最相似的顶部项目。

主类是 RAG 模型。我使用了 Google Gemma-7b-it 的 LLM。量化仍然需要一些工作。除此之外,该模型可以在具有 16 GB 显存的 RTX-4090 上运行。为了获得更准确的答案,您可以修改提示并检查结果。

更多源代码请访问我的GitHub

社区

注册登录 以发表评论