过去一年中,一些先进的 AI 模型如 ChatGPT 在自然语言处理领域取得了显著的突破。这些 AI 模型的飞速发展引起了很多公司和单位的兴趣,他们都希望能够利用生成式 AI 和大型语言模型(LLMs)的潜力来充分挖掘和利用他们的非结构化数据(包括文本、图 像和视频)。通过将这些先进的技术整合到他们的业务流程中,他们可以实现更高级别的自动化、智能化的处理,提高工作效率,发现隐藏在数据中的洞察力,并为用户提供更优质的产品和服务。
Greenplum 是一个强大的关系型数据库管理系统,专为处理大规模数据集而设计。它的MPP (Massively Parallel Processing) 架构使其能够同时处理大量数据,并具有出色的性能和可伸缩性。pgvector 是 Greenplum 的一个扩展,它提供了向量数据类型和高性能的向量操作功能。借助 pgvector 的向量相似性搜索功能,我们可以在大规模文本数据中快速找到与查询向量最相似的文档或数据点。这使得我们能够进行高效的语义搜索、相似性匹配和聚类分析等任务。
同时,Greenplum 还可以结合 OpenAI 模型的能力,将文本数据转化为向量表示。OpenAI 的模型如 GPT 可以理解文本的语义和上下文,并生成高质量的文本表示。通过将这些向量表示存储在 Greenplum 中,并利用 pgvector 的向量操作功能,我们可以在 Greenplum 数据仓库中进行高效的向量相似性搜索。结合 Greenplum pgvector 和 OpenAI 模型的优势,我们可以在 Greenplum 的大规模数据集中提取有价值的发现。无论是通过相似性搜索找到相关文档,还是通过聚类分析发现文本数据的模式和趋势,我们可以利用这些技术来揭示数据中的隐藏信息,并支持决策和创新。
在本文中,您将学习如何利用 Greenplum 数据仓库中的 pgvector 扩展的向量相似性搜索功能,以及如何与 OpenAI 模型进行结合,并充分利用 Greenplum 强大的 MPP 架构,从而在 Petabytes 级的大规模文本数据中提取有价值的知识和发现。
很多公司开始寻找技术和方法来增强其数据平台以支持人工智能,并利用大型语言模型来改进他们的聊天机器人、推荐系统或搜索引擎。
然而,一个特定的挑战是在大规模情况下管理和部署这些 AI 模型,以及存储和查询机器学习生成的嵌入向量。
嵌入(Embeddings)是指将数据或复杂对象(如文本、图像或音频)转换为高维空间中的向量。
嵌入技术在许多机器学习(ML)和深度学习(DL)算法中被广泛应用,它能够捕捉/理解数据的含义和上下文(语义关系),以及对数据中复杂关系和模式的掌握(句法关系)。
您可以将生成的向量表示用于各种应用,例如信息检索、图像分类、自然语言处理等。
来源: https://dev.to/josethz00/vector-databases-5df
下面的图表以二维空间直观地展示了词嵌入的情况。
来源: https://neon.tech/blog/building-an-ai-powered-chatbot-using-vercel-openai-and-postgres
您可以注意到,在嵌入空间中,语义相似的单词彼此靠近。例如,"apple"(苹果)这个词 与"orange"(橙子)比与"dog"(狗)或"cat"(猫)更加接近。
在生成嵌入向量之后,您就可以在向量空间内进行相似性搜索,并构建诸如产品推荐系统 等人工智能应用程序。
在 Greenplum 中利用 pgvector 存储嵌入向量
由于 pgvector 扩展的加入,Greenplum 7 已经具备了大规模情况下存储和查询向量嵌入的能力。这将向量数据库功能引入了 Greenplum 数据仓库,使用户能够进行快速检索和 高效的相似性搜索。
在 Greenplum 中使用 pgvector,您可以为具备机器学习功能的应用程序建立、运营和扩展数据库。举个例子,一个流媒体服务可以利用 pgvector 来提供类似于您刚刚观看的电影的推荐列表。通过将用户观看的电影转换为嵌入向量表示,并在 Greenplum 中存储这些向量,可以使用相似性搜索功能来查找与当前观看电影相似的电影。这样,服务可以向用户提供个性化的推荐,提升用户体验并增加用户参与度。
为什么选择 Greenplum & pgvector?
许多公司希望在其企业数据仓库中存储、查询和执行向量语义搜索,而无需管理另一个向量数据库。
幸运的是,结合 Greenplum 和 pgvector,您可以构建快速且可扩展的应用程序,利用来自 AI 模型的嵌入向量,并更快地将其投入生产。
Greenplum 作为企业级数据仓库已经具备强大的数据管理和分析能力,而 pgvector 扩展为 Greenplum 引入了向量数据库功能。这意味着您可以在已有的 Greenplum 环境中存储和管理嵌入向量,同时利用 Greenplum 的高性能和可扩展性进行查询和分析。
使用 pgvector 和 OpenAI 在 Greenplum中构建一个针对产品文档的 AI 助手
我们都曾使用过像 ChatGPT 这样的聊天机器人,并发现它在回答一般性问题时效果非常好。但是,您可能也注意到,当需要深入和领域特定的知识时,ChatGPT 的表现就不尽如人意。此外,它会编造答案来填补知识的空白,并且从不引用信息来源。
但是,我们该如何改进这一点呢?我们该如何构建一个能够准确搜索合适的数据源并回答问题的 ChatGPT 呢?
一个可行的解决方案是:通过使产品文档可搜索,并向 OpenAI 提供任务特定的提示,可以获得更可靠的结果。换句话说,当用户提出问题时,我们将要求 pgvector 从 Greenplum 表中搜索适合的数据集。然后,我们将其作为参考文档提供给 OpenAI,以回答用户的查询。
在本节中,我们将了解嵌入在实践中的应用,并学习如何使用 Greenplum 的开源 pgvector 扩展,该扩展方便了嵌入的存储,并使查询某个向量的最近邻成为可能。我们通过构建一个智能聊天机器人来展示这个功能,使用 OpenAI 和语义文本搜索技术赋予它对 VMware 数据解决方案的领域特定知识。该聊天机器人能够回答关于 Greenplum、RabbitMQ、Gemfire、VMware SQL 和 VMware Data Service Manager 等方面的深入技术问题,如下图所示:
主要的步骤如下:
1. 安装和配置 pgvector 扩展。
安装成功后,您可以开始在 Greenplum 中存储向量嵌入,并通过启用 pgvector 进行语义搜索:
2. 利用 data-type 向量创建产品文档表。
接下来,让我们创建一个表来存储产品文档及其嵌入向量:
pgvector 引入了一个名为 vector 的新数据类型。在上面的代码中,我们使用 vector 数据 类型创建了一个名为 embedding 的列。向量的大小定义了向量所包含的维度数。OpenAI 的 text-embedding-ada-002 模型输出 1536 个维度,因此我们将使用这个维度作为我们的向量大小。
由于在本文中我们使用了 OpenAI API,需要在运行 Greenplum 的每个主机上安装 openai 包:
我们还创建了一个名为 content 的文本列,用于存储生成该嵌入向量的原始产品文档文本。
注意:
上面的表通过“id”列在 Greenplum 段之间进行分布,pgvector 扩展与 Greenplum 的特性完美无缝地协同工作。因此,将 pgvector 的高效能力与 Greenplum 的 MPP 能力相 结合,从分布到分区,使 Greenplum 用户能够构建可扩展的人工智能应用程序,有效地管 理和搜索大量数据。
3. 通过 Greenplum PL/Python 函数来生成 OpenAI 嵌入向量
现在,我们需要为文档生成嵌入向量。为此,我们将使用 OpenAI 的 text-embedding- ada-002 模型 API 从文本中生成嵌入向量。最好的方法是在 Greenplum 数据库中创建一 个利用 PL/Python3u 过程语言的 Python 函数。下面是本次的示例,展示了一个为每个输入文档返回一个向量嵌入的 Greenplum Python 函数。
将原始文本加载到 tanzu_documents 表中的 content 列中,然后使用先前创建的 get_embeddings Python 函数为每个内容生成 OpenAI 嵌入向量并更新 embedding 列:
5. 第一个语义搜索查询
让我们使用 pgvector 的余弦距离(使用<=>运算符)构建我们的第一个语义搜索查询, 并找到与我们的问题最相似的文本(即具有最小距离的文本): How to install Greenplum?
pgvector 引入了三个新的运算符,用于计算相似性:L2 距离(欧几里得(Euclidean)距 离)<->,负内积(negative inner product)<#> 和余弦(cosine)距离<=>。
SELECT 语句应返回以下输出:
6. 相似性搜索的 SQL 函数:
由于我们将对许多嵌入向量执行相似性搜索,让我们为此创建一个 SQL 函数:
我们将使用 match_documents 函数,并将最相似的文本作为输入提供给 OpenAI 模型,
具体如下所示:
我们的表随着时间的推移可能会增长,包含了大量的嵌入向量,我们可能希望在数十亿个向量上执行语义搜索。
pgvector 的优点是其索引能力,可以加快查询速度并实现更快的搜索。
向量索引执行准确的最近邻搜索(ANN/KNN),对于加快排序(ORDER BY 子句)非常重要,因为向量并不按相似性进行分组,所以通过顺序扫描找到最接近的向量是一种缓慢的操作。
每个距离运算符都需要不同类型的索引。对于最多 100 万行的情况,可以使用行数除以 1000 作为起始列表数,对于超过 100 万行的情况,可以使用行数的平方根。由于我们按余弦距离进行排序,因此我们将使用 vector_cosine_ops 索引。
您可以在以下链接中了解有关 pgvector 索引的更多信息:
https://github.com/pgvector/pgvector#indexing
8.为 OpenAI 模型提供合适的数据集以获取相关答案
构建一个 PL/Python 函数,该函数以用户的输入和与之最相似的文本作为输入,并要求OpenAI 模型提供答案:
9. 构建一个更智能的搜索函数
正如之前提到的,ChatGPT 不仅仅返回现有文档,它能够将各种信息融合到一个连贯的答案中。为了做到这一点,我们需要为 GPT 提供一些相关文档和提示,供其用于构建答案。
作为最后一步,我们应将之前的函数组合成一个单一的过程,以提供智能的 AI 助手应用程序。
我们可以通过将提示分解为两个阶段的过程来使用之前的函数和嵌入向量来解决这个问题:
1. 查询我们的嵌入数据库以获取与问题相关的最相关文档。
2. 将这些文档作为上下文注入到OpenAI模型中,以供其在生成答案时参考。
以上的 SQL 函数接收用户输入,将其转换为嵌入向量,在 tanzu_documents 表上使用pgvector 进行语义文本搜索,以找到最相关的文档,最后将其作为参考文本传递给OpenAI API 调用,并返回最终的答案。
10. 使用 OpenAI 和 Streamlit 构建具有语义文本搜索功能的自己的聊天机器人
最后,我们已经开发了一个使用 Streamlit 🎈构建的聊天机器人🤖,它能理解我们的文档, 并使用了具备语义文本搜索功能的 Greenplum 数据仓库和 pgvector 扩展。
此 Chatbot Streamlit 应用程序可在以下链接中访问:
https://greenplum-pgvector-chatbot.streamlit.app/
源代码地址如下: https://github.com/ahmedrachid/streamlit-chatbot-greenplum
总结起来,希望构建可扩展的 AI 应用程序的公司可以发挥 Greenplum 的性能和大规模并 行处理能力,将其与 pgvector 结合起来处理大规模的嵌入向量和非结构化数据,并进行快 速检索、相似性搜索和语义搜索。通过这种方式,公司可以充分利用 Greenplum 的能力来 处理海量的数据,并构建高效、可扩展的 AI 应用程序。
-
-
https://docs.vmware.com/en/VMware-Tanzu-Greenplum/index.html
-
pgvector 扩展 - 用于 Postgres 的开源向量相似性搜索:
https://github.com/pgvector/pgvector
原文作者:Ahmed Rachid Hazourli
全文翻译:褚洪峰
点击文末“
阅读原文
”,获取Greenplum中文资源。
来一波 “在看”、“分享”和 “赞” 吧!