首页 >后端开发 >Python教程 >RAG、矢量搜索及其在 IRIS RAG 应用程序中如何在 IRIS 上实施的扩展说明

RAG、矢量搜索及其在 IRIS RAG 应用程序中如何在 IRIS 上实施的扩展说明

Susan Sarandon
Susan Sarandon原创
2024-12-04 13:16:15711浏览

An Expanded Explanation of RAG, Vector Search, and how it is implemented on IRIS in the IRIS RAG App

我收到了社区成员对我提交的 Python 2024 竞赛的一些非常好的反馈。希望我可以转发到这里:

您构建了一个超过纯 IRIS 5 倍大小的容器

这需要时间

容器启动也很慢但完成

可以按照描述访问后端

正在制作

前端反应

我无法理解要显示的内容

这个解释是给我以外的专家看的

提交内容在这里:https://openexchange.intersystems.com/package/IRIS-RAG-App

我真的很感谢这个反馈,尤其是因为这是对有关该项目的文章的一个很好的提示。该项目包含相当全面的文档,但它确实假设您熟悉向量嵌入、RAG 管道和 LLM 文本生成,以及 python 和某些流行的 python 库,如 LLamaIndex。

这篇文章完全没有使用 AI 编写,旨在尝试解释这些内容以及它们如何在这个项目中组合在一起以演示 RAG IRIS 上的工作流程。

容器很大,因为创建向量嵌入所涉及的 python 包所需的库依赖项非常大。通过更有选择性的进口,规模可能会大幅缩小。 

最初构建容器确实需要时间,但是一旦完成,启动它所需的时间就会更少。启动时间肯定还可以改进。启动花费如此多时间的主要原因是,entrypoint.sh 的更新假设自上次启动以来可能对应用程序的任何部分进行了更改,包括数据库迁移、CSS 配置、JavaScript 配置和 Python后端代码,并且每次启动时都会重新编译整个项目。这是为了更容易地开始在该项目上进行开发,否则每当进行更改时正确运行前端和后端构建可能会很棘手。这样,如果您更改了项目中的任何代码,您只需要重新启动容器,也许可以在后端恢复生产,您的更改就应该反映在应用程序的界面和操作中。

我相当确定后端的生产是将 http 请求传递到 Django 应用程序,并且对于此包中的互操作性至关重要。不过,我是 IRIS 平台的新手,对于制作还有更多需要了解。

接下来我想对向量嵌入、LLM 和 RAG 进行全面的解释。其中第一个被发明的是向量嵌入。首先我们可以描述一个向量。在大多数情况下,矢量是一个方向。这是一个指向太空某处的箭头。更正式地说,矢量是“具有方向和大小的量”。这可以以烟花为例,它沿特定方向传播并在空间中的特定点爆炸。假设每个烟花都是从同一个中心点(原点 [0,0,0])发射的,但它们都会飞出并在该原点周围的云中爆炸。从数学上讲,您可以使用三坐标系 [x,y,z] 来描述每个烟花爆炸的位置,这将是烟花爆炸的“矢量嵌入”。如果您拍摄了大量烟花表演视频并将所有烟花爆炸记录为数据集,那么您将创建一种烟花表演的矢量嵌入数据库或矢量存储。

您可以用有关烟花汇演的信息做什么?如果我指出一个特定的烟花并询问在整个表演中最接近同一点爆炸的烟花,您可以找到在太空中附近点爆炸的其他烟花。您只需找到最接近的,并且有数学可以做到这一点。

记住,我们只为每个烟花记录了三个数字,即三维空间中的 x、y 和 z 坐标,[0,0,0]是地面上的烟花发射器。 

如果我还想知道与另一个特定烟花距离最近且时间最接近爆炸的烟花怎么办?要知道这一点,我们必须回顾烟花表演的视频片段并记录每次爆炸的时间。现在我们有一个包含 4 个数字的 4 维向量:烟花爆炸的三维位置和爆炸时间。现在,通过向向量嵌入添加另一个维度,我们可以为烟花表演提供更具描述性的嵌入类型。

这如何转化为机器学习?长话短说,通过处理大量文本数据,计算机科学家成功创建了嵌入模型,可以将一段文本(如短语、句子、段落甚至页面)转换为一个很长的系列代表理论高维空间中的点的数字。

不是 4 个数字,而是 300、700、甚至 1500 个。这些代表了一段文本可以“接近”或“接近”的 1500 种方式。距离另一个“远”,或者1500个维度的意义。对于许多人来说,这是一个令人着迷的概念,我们有办法创建以某种方式表示一段文本语义的数字。

使用数学,可以比较这些高维文本向量嵌入中的两个,以找出它们彼此之间的相似或“接近”程度(如果它们是)由同一模型创建。 

这是此应用程序中发生的第一件事。用户必须放入文档并为其命名,然后选择嵌入类型。服务器获取该文档,将其分解为文本块,然后将每个块转换为向量嵌入,并将该块保存为该文档的专用表中的一行。每个文档都存储在自己的专用表中,以允许不同文本嵌入模型创建的向量嵌入的长度可变。

一旦文档作为向量嵌入存储在数据库中,用户就可以输入查询来“询问”文档。该查询有两种使用方式。第一种方法是搜索文档。我们不进行传统的文本搜索,而是进行“矢量搜索”。该应用程序接受查询,将其转换为向量嵌入,然后查找文档中具有与查询向量嵌入最相似的嵌入的部分。然后为每个文档部分生成 0 到 1 之间的相似度分数,并根据 top_k_similarity 和相似度阈值从向量数据库中检索多个部分。基本上,您可以询问它要检索多少个文档部分,以及它们必须与您的查询有多相似才能有资格检索。

这就是检索增强一代中的检索。下一步是生成。

一旦计算机科学家弄清楚如何将文本转换为语义上重要的数字向量嵌入,下一步就是创建可以生成文本的模型。他们取得了巨大成功,现在我们有了 GPT-4、LLama3 和 Claude 3.5 等大型语言模型。这些法学硕士可以接受提示或查询,并提供完成或答案,这是它认为最有可能从所呈现的提示文本继续的文本。

LLM 必须接受大量文本数据的培训,并且他们的回答或完成仅限于该培训数据。当我们希望法学硕士提供的补全可能包含其训练集中未包含的数据,或者将其补全基于一组特定的知识时,一种方法是在提示中包含额外的上下文数据。基本上,如果我们想从法学硕士那里得到关于未经培训的问题的答案,我们必须在提示中提供信息。

许多人发现自己处于这样一种情况,他们希望 chatGPT 或本地 LLama 安装可以根据自己的个人文档提供答案。在您的文档中搜索该信息,将其粘贴到提示中,然后输入您的问题,这非常简单,人们发现自己手动执行此操作。这就是它自己的检索增强生成形式。 RAG 只是自动查找与用户查询相关的信息,并将其与查询一起提供给法学硕士以获得更准确或更有用的响应。

在此应用程序中,我们通过矢量搜索检索的文档部分将与查询一起发送到所选的 LLM,在界面中标记为模型,以提供答案的上下文。

在我为这个项目制作的视频示例中,我问“这部剧中的反派是谁?”以及文件《哈姆雷特》和《李尔王》,其中包含两部莎士比亚戏剧的全部文本。 IRIS 数据库已经有两张表,一张是《哈姆雷特》,一张是《李尔王》。每个表都充满了行向量嵌入,这些向量嵌入是通过将每个戏剧的文本分割成多个部分而创建的。这些嵌入是一长串数字,代表每个文档部分中含义的多个维度。 

服务器使用生成向量嵌入的相同文本到向量模型将问题“谁是这部剧中的反派”转换为数字向量查找李尔王表中与其最相似的部分。是的,这些部分可能提到了恶棍这个词,但也可能提到了其他恶棍,例如背叛、背叛和欺骗,即使没有明确提到恶棍。这些文档部分将添加到查询中,并作为提示一起发送给法学硕士,然后法学硕士根据提供的文档部分回答问题。

这是针对每个文档单独完成的,这就是为什么查询的答案根据所查询的文档而不同的原因。这就完成了首字母缩略词,因为我们正在使用矢量搜索的力量检索相关上下文信息来增强法学硕士答案的生成。

非常感谢任何花时间阅读本文的人,我很乐意在以后的文章中扩展这些主题。随时欢迎反馈。

以上是RAG、矢量搜索及其在 IRIS RAG 应用程序中如何在 IRIS 上实施的扩展说明的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn