在 PostgreSQL 中存储矢量数据的有效方法是什么?

问题描述 投票:0回答:3

我有一些来自嵌入面孔的向量,我想将它们存储在数据库中。我需要能够在给定参考嵌入面的情况下从数据库中找到相似的向量。

我尝试在 PostgreSQL 中使用数组类型,但不支持减法。

  1. 短期问题是:我们能否在 PostgreSQL 的数据库级别高效地执行数组减法?
  2. 长期的问题是:是否有更好的数据库系统来处理此类数据和计算?

具体问题是,假设我在表中有一些向量数据

{1, 2, 3},
{4, 5, 6},
{7, 8, 9}

我想找出这三个向量中哪一个与向量{5, 5, 5}最接近(以

欧几里德距离
表示)。

所需的操作是先将两个向量相减,然后求差的长度

||{5, 5, 5} - {4, 5, 6}||_2

在我的场景中,向量将有 128 维。

database postgresql vector machine-learning postgis
3个回答
7
投票

您似乎想使用PostGIS,它是 PostgreSQL 的一个简单扩展,它允许一大堆几何数据类型扩展。 (点、矢量、圆弧等)


0
投票

由于您想要搜索嵌入向量并要求欧几里得距离,因此适合您用例的 Postgres 插件是:https://github.com/pgvector/pgvector

支持距离功能:

  • 内积
  • L2距离欧氏距离
  • 余弦距离

L2距离通常用于人脸识别。

OpenAI 建议使用

余弦距离 作为其嵌入 L2,但会产生相同的结果

您可以在上面的链接中找到大多数编程语言的安装说明和库参考。

如果您对 OpenAI 嵌入感兴趣(Bing 将您带到这里):

  • openai-cookbook尤其是图片解释了很多;可以使用 Postgres 代替 Qdrant
  • 立即尝试这是一个单页 JavaScript 应用程序,可以为您创建嵌入。有趣的是,他们不使用矢量数据库,而是在代码中自己完成,并且您可以下载所有代码(他们提供了链接)。如果您对如何自己执行此操作感兴趣,请查看代码中的 JavaScript 函数find_closest_paragraphs

-1
投票
将其转换为字符串。或者您可以定义自定义数据类型并存储值

join(str(s) for s in encodings[0][0:64])
    
© www.soinside.com 2019 - 2024. All rights reserved.