0

生成式语言模型工作流程中检索的苦涩教训 - Mikko Lehtimäki | 向量空间讲座

Demetrios Brinkmann

·

2024 年 1 月 29 日

The Bitter Lesson of Retrieval in Generative Language Model Workflows - Mikko Lehtimäki | Vector Space Talks

“如果你没听说过‘苦涩的教训’,它其实是一个定理。它基于 Ricard Sutton 的一篇博文,基本意思是,根据我们过去几十年从机器学习和人工智能系统发展中学习到的经验,能够利用数据和计算的方法往往会或最终会超越人类设计或手工制作的方法。”
——Mikko Lehtimäki

Mikko Lehtimäki 博士是一位数据科学家、研究员和软件工程师。他交付了一系列数据驱动的解决方案,从循环经济中机器人的机器视觉到新闻业中的生成式 AI。Mikko 是 Softlandia 的联合创始人,Softlandia 是一家创新的 AI 解决方案提供商。在那里,他领导 YOKOTAI 的开发,这是一款基于 LLM 的生产力增强工具,可连接到企业数据。

最近,Mikko 为 Llama-index 和 Guardrails-AI 这两个 LLM 领域领先的开源项目贡献了软件。他完成了计算神经科学和机器学习交叉领域的博士学位,这使他对 AI 系统的设计和实现拥有独特的视角。通过 Softlandia,Mikko 还主持轻松的混合形式数据科学聚会,欢迎所有人参与。

请在 Spotify、Apple Podcast、Podcast addicts、Castbox 上收听本期节目。您也可以在 YouTube 上观看本期节目。

主要收获

您不好奇什么是苦涩的教训以及它如何在生成式语言模型工作流程中发挥作用吗?

请听 Mikko 深入探讨检索增强生成的复杂世界,讨论 Yokot AI 如何管理大量多样化的数据输入,以及如何通过专注于重新排名大幅改进 LLM 工作流程和输出质量。

您将从本期节目中获得的 5 个关键收获

  1. Yokot AI 的发展:Mikko 详细解释了 Softlandia 内部堆栈如何改变语言模型应用程序的游戏规则。
  2. 解密检索增强生成:了解通过 Yokot AI 的 LLM 上传文档和抓取网络以获取见解的火箭科学。
  3. “苦涩的教训”理论:深入探讨正在动摇 AI 基础的定理,它暗示数据和计算优于人类设计。
  4. 高质量内容生成:了解系统如何处理海量数据输入,将内容质量提升到前所未有的高度。
  5. 通过重新排名实现面向未来:发现为什么改进重新排名组件可能类似于在我们的 AI 景观中发现一个新宇宙。

有趣的事实:Yokot AI 包含一个检索增强生成机制,以促进相关信息的检索,这允许用户上传和利用他们自己的文档或从网络抓取数据。

节目笔记

00:00 关于语言模型检索和 Yokot AI 平台的讨论。
06:24 各种语言的数据灵活性促进了进展。
10:45 用户输入文档,系统将其转换为向量。
13:40 提高数据质量,减少重复,简化处理。
19:20 通过关注重新排名器来降低复杂性。
21:13 检索过程提高了语言模型的效率。
24:25 信息检索方法不断发展,利用数据和计算。
28:11 在本地硬件上运行闪电优化。

Mikko 的更多语录

我们过去常常基于我们手动设计的这种特征来构建图像分析……而现在我们可以简单地将一堆图像输入到一个 Transformer 中,就可以得到漂亮的边界框和语义分割输出,而无需在系统中构建规则。
——Mikko Lehtimäki

“我们不能简单地忽略它,并希望在不久的将来,我们能拥有一个不需要我们以如此复杂的方式获取数据的语言模型。重新排序器是一个可以高效利用数据和计算的组件,它也不需要太多的人工技巧。”
——Mikko Lehtimäki

“我们可以增强我们存储的数据,例如,通过使用多种分块策略或从用户文档生成问答对,然后我们将这些内容嵌入并在查询到来时进行查找。”
——Mikko Lehtimäki 谈在 RACK 堆栈中提高数据质量

文字记录

Demetrios:发生了什么?大家好,很高兴大家再次来到向量空间讲座。今天我很高兴能邀请到 Softlandia 的联合创始人兼首席数据科学家 Mikko。在他的职业生涯中,他完成了各种出色的软件工程和数据科学工作,目前他领导着 Yokot AI 的开发,我刚刚学会了这个发音,他将向我们介绍所有相关内容。但我先给你一个 TLDR。它是一个基于 LLM 的生产力提升工具,可以连接到你的数据。Mikko,你好吗,老兄?

Mikko Lehtimäki:嘿,谢谢。很高兴来到这里。是的。

Demetrios:所以,我必须说,我在录制之前或者在直播之前就说过了,但我必须再说一遍。你的演讲标题非常切中要害。你的演讲标题是生成式语言模型工作流程中检索的苦涩教训。

Mikko Lehtimäki:没错。

Demetrios:所以我猜你经历了很多困难,你希望告诉我们所有这些,这样我们就不必犯你犯过的错误。我们可以在我们自己犯错之前,明智地从你的错误中吸取教训,对吧?好的。这是一个很好的过渡,让你开始吧,伙计。我知道你有话要说。我知道你有一些幻灯片要分享,所以请随时开始在屏幕上显示它们。对于所有加入我们的人,请随意在聊天中添加一些问题。我会进行监控,这样如果你有任何问题,我就可以介入并确保 Mikko 在进入下一张幻灯片之前回答它们。好的,Mikko,我看到你的屏幕了,伙计。

Demetrios:这太棒了。

Mikko Lehtimäki:酷。那我们开始吧?是的。我叫 Mikko。我是 Softlandia 的首席数据科学家。我去年夏天完成了我的博士学位,到现在为止已经在 Softlandia 工作了两年。我也是一些开源人工智能 LLM 库的贡献者,比如 Llama Index 和 Cartrails AI。所以如果你从来没有看过这些,请务必查看一下。在 Softlandia,我们主要是一家人工智能咨询公司,专注于端到端的人工智能解决方案,但我们也开发了我们内部的用于大型语言模型应用程序的堆栈,我今天将讨论这个。

Mikko Lehtimäki:所以这次演讲的主题有点挑衅。也许它是大型语言模型检索的苦涩教训,它真正源于我们构建生产就绪检索增强生成解决方案的经验。我只是想说,这并不是一个真正的讲座,所以我不会告诉你该做什么或不该做什么。我只是想带你了解我们在开发 RACK 解决方案时所采用的思维过程,我们看看你是否认同。所以我们的 LLM 解决方案叫做 Yokot AI。它实际上是一个平台,企业可以在上面上传自己的文档,并从中获取基于语言模型的见解。典型的例子是从你的文档中进行问答,但我们做得更多。例如,用户可以利用自己的数据生成长篇文档,并不必担心你在要求 LLM 输出某些内容时通常会遇到的令牌限制。

Mikko Lehtimäki:这里你只看到了我们构建的数据管理视图的快照。因此,用户可以自带文档或抓取网页,然后立即使用 LLM 访问数据。这是文档生成输出。它比你通常看到的要长,每个部分都可以基于不同的数据源。我们有不同的生成流,我们称之为,所以你可以拿你的文档,并使用 LLM 改变风格。当然,还有典型的聊天视图,这实际上是进入这些工作流的入口。你可以看到语言模型在使用你的数据回答问题时所使用的来源。所有这些都通过检索增强生成成为可能。

Mikko Lehtimäki:这在幕后发生。所以当我们要求 LLM 完成一项任务时,我们首先从上传的内容中获取数据,然后一切都从那里开始。所以我们决定拉取哪些数据,如何使用它,如何生成输出,以及如何将其呈现给用户,以便他们可以继续与数据对话或将其导出到他们想要的格式,等等。但这种系统的主要挑战是它是非常开放的。所以我们并没有真正限制用户可以上传什么类型的数据,或者数据使用什么语言。所以,例如,我们设在芬兰。我们的大多数客户都在北欧这里。他们说芬兰语、瑞典语。

Mikko Lehtimäki:他们的大部分数据都是英文的,为什么不呢?他们可以随意使用任何他们觉得合适的语言来使用系统。所以我们不想限制任何这些。另一件事是聊天视图作为界面,它确实没有设置太多限制。因此,用户可以自由地使用系统完成他们选择的任务。所以我们必须为真正广泛的可能性做好准备。这就是我们正在构建的。现在,如果你没有听说过“苦涩的教训”,它实际上是一个定理。它基于 Ricard Sutton 的一篇博文,它基本上指出,根据我们过去几十年从机器学习和人工智能系统发展中吸取的教训,能够利用数据和计算的方法往往会或最终会超越人类设计或手工制作的方法。

Mikko Lehtimäki:例如,我这里有一个插图,展示了这在图像分析中是如何体现的。在左侧,您看到的是从图像中提取梯度的操作的输出。我们过去常常基于我们手动设计的这种特征来构建图像分析。我们会运行某种边缘提取,我们会计算角点,我们会计算边缘距离并手动设计特征,以便处理图像数据。而现在我们可以简单地将一堆图像输入到一个 Transformer 中,就可以得到漂亮的边界框和语义分割输出,而无需在系统中构建规则。所以这是一个苦涩教训在实践中的典型例子。现在,如果我们将其应用于 RACK 或检索增强生成的上下文中,让我们首先看一下简单的 RACK 架构。我们为什么要这样做呢?嗯,这是因为语言模型本身没有最新的数据,因为它们是在很久以前训练的。

Mikko Lehtimäki:你甚至不知道是什么时候。所以我们需要让它们能够访问更多最新的数据,我们需要一种方法来做到这一点。另一件事是幻觉等问题。我们发现,如果你只是问模型一个训练数据中的问题,你并不总是能得到可靠的结果。但如果你能用数据来支撑模型的答案,你就会得到更真实的结果。这也是 RACK 可以做到的。最后一点是,我们不能一次性地给语言模型一本书,因为即使理论上它可以一次性读取输入,如果你一次性给它输入太多数据,你从语言模型中得到的结果质量也会受到影响。这就是我们设计检索增强生成架构的原因。

Mikko Lehtimäki:如果我们看底部这个系统,你会看到典型的数据摄取。用户提供文档,我们将其切成小块,并使用向量嵌入计算数值表示,然后将这些存储在向量数据库中。为什么要用向量数据库呢?因为它在用户查询时检索向量非常高效。所以查询也被嵌入,并用于从以前高效直接上传到数据库的数据中查找相关来源,然后我们可以将得到的文本输入到语言模型中,合成一个答案。这就是 RHE 最基本的工作方式。现在你可以看到,如果你只处理一个文档,如果你的问题集非常受限,那很好。但你为系统带来的数据越多,你就可以在该数据上构建更多的工作流。所以,例如,如果你可以访问一本完整的书或许多书,很容易看出你也可以从这些数据中生成更高质量的内容。所以这种架构必须能够利用这些大量数据。

Mikko Lehtimäki:总之,当你第一次实现它时,它真的感觉像魔术。它往往工作得很好,但很快你就会注意到它不适合所有类型的任务。比如你有时会看到,例如列表。如果你检索列表,它们可能会损坏。如果你问的是文档比较的问题,你可能无法得到完整的结果。如果你不加思考地运行摘要任务,那么那很可能会导致超乎预期的结果。所以我们必须相当大地扩展架构,以考虑所有我们希望通过用户上传的更大数量的数据来启用的用例。这就是你经过几次设计迭代后可能看到的样子。

Mikko Lehtimäki:那么,让我们看看,为了让我们的 RACK 堆栈提供更高质量的结果,我们可以添加哪些步骤呢?如果我们再次从底部开始,我们可以看到我们尝试通过向数据摄取管道添加步骤来提高我们上传的数据的质量。我们可以增强我们存储的数据,例如,通过使用多种分块策略或从用户的文档生成问答对,然后我们将这些内容嵌入并在查询到来时进行查找。同时,我们可以减少我们上传的数据,所以我们希望确保没有重复数据。我们希望清理低质量的东西,比如 HTML 内容,我们也可能希望添加一些元数据,以便某些数据,例如引用,可以在不需要运行我们喜欢的任务时从搜索结果中排除。顺便说一句,我们已经将这建模为流处理管道。所以我们使用的是 Bytewax,这是另一个非常好的开源框架。只是一个小小的广告,我们将在 2 月 16 日与 Bytewax 举办一个关于 RACK 的研讨会,所以请密切关注。在中间我添加了不同的数据库和不同的检索方法。

Mikko Lehtimäki:例如,我们可以添加基于关键词的检索和元数据过滤器。好消息是,如果你喜欢,你可以用 quattron 完成所有这些。所以它就像是你文档数据的一站式商店。但有些用户可能想尝试不同的数据库,比如图数据库或 NoSQL 数据库,以及普通的 SQL 数据库。它们确实可以实现不同类型的用例。所以这取决于你的服务,哪一个对你真正有用。如果我们向左看,我们有一个叫做查询规划器和一些查询路由器组件。这真正决定了响应策略。

Mikko Lehtimäki:所以当您收到用户的查询时,例如,您可能需要采取不同的步骤来回答它。例如,您可能希望将查询分解成小问题,然后单独回答每个问题,每个问题可能采取不同的路径。因此,您可能希望基于元数据进行查询,例如文档的第五页和第六页。或者您可能希望根据关键词查找每个页面或包含特定单词的块。这其中有大量的选择。另一个例子是根据查询生成假设文档,并嵌入这些文档而不是查询本身。这在某些情况下会导致更高质量的检索结果。但现在所有这些都导致了查询路径的右侧。

Mikko Lehtimäki:所以这里我们有一个重排序器。所以如果我们实现所有这些,我们最终会检索到大量数据。我们通常会检索超出一次调用语言模型所能处理的合理数量的数据。所以我们可以在这里添加一个重排序步骤,它会首先过滤掉低质量的检索内容,其次,它会将高质量的内容放在检索文档的顶部。现在当你将这些重排序过的内容传递给语言模型时,它应该能够更好地关注与查询相关的细节。这应该能让你更好地管理最终响应生成器 LLM 必须处理的数据量。它还应该能让响应生成器更快一些,因为你一次性输入的数据会稍微少一些。构建重排序器最简单的方法可能就是让一个大型语言模型在将其输入到语言模型之前对你检索到的内容进行重排序或摘要。

Mikko Lehtimäki:这是一种方法。所以是的,这非常复杂,老实说,我们现在也没有在 Yokot AI 中完成所有这些。我们在不同的范围内都尝试过,但这确实需要维护大量的逻辑。对我来说,这简直就是苦涩的教训,因为我们正在系统中构建如此多的步骤、逻辑和规则,而所有这些都只是因为语言模型不可信,或者它无法通过当前的架构进行可靠训练,或者无法通过当前的方法进行实时训练。所以在我看来,这张图中的一点比其他地方更有希望利用数据和计算,这应该长期主导解决方案的质量。如果我们只关注这一点,或者不只是,但如果我们非常关注这个过程的这一部分,我们应该能够消除其他地方的一些复杂性。所以如果你正在观看录音,你可以暂停思考这个组件可能是什么。但在我看来,它就是最后的重排序器。

Mikko Lehtimäki:为什么会这样呢?当然,你可以争辩说语言模型本身就是一个,但以我们目前的架构来看,我认为我们需要检索过程。我们不能只是把它排除在外,并希望有一天我们能有一个不需要我们以如此复杂的方式为其获取数据的语言模型。重排序器是一个可以高效利用数据和计算的组件,它也不需要太多的人工技巧。它接收样本并输出样本,并且与我们现在可用的高效向量搜索配合得非常好。Quatrant 就是一个典型的例子。向量搜索是最初的过滤步骤,然后重排序器是第二个步骤,它确保我们获得最高质量的数据给最终的 LLM。重排序器的效率实际上来自于它不需要是一个功能齐全的生成语言模型,所以它通常是一个语言模型,但它不必具备生成 GPT 四级内容的能力。它只需要理解,甚至可能以一种非常固定的方式,传达你给它的输入的重要性。

Mikko Lehtimäki:所以通常输入是用户的查询和检索到的数据。就像我之前提到的,使用阅读排序器最简单的方法可能就是让一个大型语言模型来重新排序你检索到的块或句子。但也有专门为此训练的模型,Colbert 模型就是一个主要例子,我们还必须记住,重新排序器已经存在了很长时间。它们在传统搜索引擎中已经使用了很长时间。我们现在只是要求它们具有更高的质量,因为没有用户检查搜索结果并决定哪些是相关的。在重新排序运行之后,我们需要相信重新排序器的输出是高质量的,并且可以提供给语言模型。所以你很可能也能从文献中获得很多想法。但最简单的方法绝对是使用简单 API 背后的 LLM。

Mikko Lehtimäki:这并不是说您应该忽略其余部分,例如查询规划器当然是一个有用的组件,并且不同的检索方法仍然与不同类型的用户查询相关。所以是的,这就是我认为苦涩的教训在这些 RACK 架构中实现的方式,我在这里收集了一些在我看来最近或有趣的方法。但正如我所说,来自信息检索研究的大量现有信息很可能在不久的将来被重新发现。因此,如果我们总结我们亲身经历或正在经历的苦涩教训,它指出利用数据和计算的方法将超越手工制作的方法。如果我们关注 RHE 中的重新排序组件,我们将能够消除过程中其他地方的一些复杂性。值得记住的是,我们当然一直在等待大型语言模型技术的进步。但这些进步也很可能会使重新排序组件受益。因此,当您发现新的有趣研究时,请记住这一点。

Mikko Lehtimäki:酷。这基本上就是我最后的论点。我希望有人觉得它有趣。

Demetrios:非常酷。它像一杯黑咖啡一样苦涩,或者像黑巧克力一样苦涩。我真的很喜欢你学到的这些经验教训,感谢你与我们分享。我知道重新排序和检索评估是很多人现在都在思考的问题,我知道 Qdrant 的一些人也在积极思考这个问题,以及如何使其更容易。所以你经历过,感受过痛苦,并且能够分享对你有帮助的东西,这很酷。所以我很感激。如果有人有任何问题,现在是提问的时候了。否则我们将在线下讨论,我们会让大家在领英上联系你,我可以在聊天中分享你的领英资料,以便人们轻松联系,因为这很酷,伙计。

Demetrios:这太酷了,我很感激。

Mikko Lehtimäki:谢谢。希望对某些人有用。

Demetrios:太棒了。那么,如果就这些,我想我有一个问题要问你。尽管我们时间快到了,所以这会是一个闪电般的问题。你提到了你展示的非常详细的图表,上面有所有东西,这有点像是你追求的梦想状态或梦想结果。接下来是什么?你打算从那个图表中创造出什么你还没有的东西?

Mikko Lehtimäki:你想要的闪电回答是,能够完全在本地硬件上运行这个东西会非常好。我知道这可能不是算法方面的事情,也不一定在 Yoko AI 的范围内,但如果我们能以那种形式在物理设备上运行它,那将是极好的。

Demetrios:我喜欢。我喜欢。好的。 Mikko,感谢你所做的一切,以及在座的各位。所有向量空间宇航员们。祝你们度过美好的一天。无论你们身处世界何处或在太空中。我们稍后再见。

Demetrios:谢谢。

Mikko Lehtimäki:再见。

免费开始使用 Qdrant

开始使用