pgvector: 30 倍构建向量嵌入索引

news2024/11/24 6:39:33

使用 pgvector 为 HNSW 并行构建索引

alt

Postgres 最受欢迎的向量搜索扩展 pgvector 最近实现了并行索引构建功能,这将分层可导航小世界 (HNSW) 索引构建时间显著提高了 30 倍。

祝贺 Andrew Kane 和 pgvector 的贡献者发布此版本,这巩固了 Postgres 作为最佳向量搜索数据库之一的地位,并允许您充分利用数据库的功能来构建索引。

alt

在 64 vCPU、512GB RAM 实例上使用包含 1,536 维向量的 10M 数据集运行测试。

Pgvector 是 Postgres 最受欢迎的向量相似性搜索扩展。向量搜索对于语义搜索和检索增强生成 (RAG) 应用程序越来越重要,可增强大型语言模型 (LLM) 的长期记忆。

在语义搜索和 RAG 用例中,数据库包含 LLM 未接受过训练的知识库,这些知识库被拆分成一系列文本或块。每个文本都保存在一行中,并与嵌入模型(例如 OpenAI 的 ada-embedding-002 或 Mistral-AI 的 mistral-embed ) 生成的向量相关联。

然后使用向量搜索来查找与查询向量最相似(更接近)的文本。这是通过将查询向量与数据库中的每一行进行比较来实现的,这使得向量搜索难以扩展。这就是为什么 pgvector 实施 近似最近邻 (ANN) 算法(或索引)的原因,该算法在数据库的子集上进行向量搜索,以避免冗长的连续扫描。

最有效的 ANN 算法之一是分层可导航小世界 (HNSW) 索引。其基于图形和多层的特性专为数十亿行向量搜索而设计。这使得 HNSW 在规模上极其快速和高效,并且是向量存储市场中最受欢迎的索引之一。

HNSW 首次由 Yu A Malkov 和 Dmitry A. Yashunin 在题为《使用分层可导航小世界图进行高效、稳健的近似最近邻搜索》的论文中提出。

HNSW 是一种基于图的索引高维数据的方法。它构建了一个图的层次结构,其中每一层都是前一层的子集,因此时间复杂度为 O(log(rows)) 。在搜索过程中,它会浏览这些图以快速找到最近的邻居。

alt

尽管 HNSW 指数快速而高效,但它也存在两个缺点:

1. 内存 :该索引所需的内存明显多于其他索引,例如倒排文件索引 (IVFFlat)。您可以通过拥有更大的数据库实例来解决内存问题。但是,如果您使用独立的 Postgres(例如 AWS RDS),您会发现自己处于仅为索引构建而过度配置的情况。但是,借助 Neon 扩展功能,您可以扩展、构建 HNSW 索引,然后缩减规模以节省成本。

alt

2. 构建时间: 对于百万行数据集,构建 HNSW 索引可能需要数小时。这主要是因为计算向量之间的距离需要花费时间。而这正是 pgvector 0.6.0 通过引入 并行索引构建 解决的问题。通过分配更多 CPU 和工作器,您可以将 HNSW 索引的构建速度提高 30 倍。

alt

但是等一下!HNSW 索引支持更新,那么如果您只需要构建一次索引,为什么这个并行索引构建功能是必要的呢?

嗯,有两种情况需要创建 HNSW 索引:

当您想要更快的查询并优化向量搜索时

当你已经有 HNSW 索引,并从表中删除向量时

后者可能会导致索引搜索返回误报,从而对 LLM 响应的质量和 AI 应用程序的整体性能产生负面影响。

与以前的版本相比,pgvector 0.6.0 使用并行工作器时可将索引构建时间加快 30 倍。处理大型数据集和向量大小(例如 OpenAI 1536 维向量嵌入)时,这种改进尤其明显。

创建 HNSW 索引可能需要大量资源。原因是您需要分配足够的“maintenance_work_mem”以容纳内存中的索引。否则,hnsw 图的构建时间会更长。

NOTICE: hnsw graph no longer fits into maintenance_work_mem after 100000 tuples
DETAIL: Building will take significantly longer.
HINT: Increase maintenance_work_mem to speed up builds.

为了有效地使用并行索引构建,必须使用适当的设置配置 Postgres。需要考虑的关键参数是:

Maintenance_work_mem :此参数决定为创建或重建索引分配的内存。此参数影响这些操作的性能和效率。将其设置为较高的值(例如 8GB)可以更有效地处理索引构建过程。

SET maintenance_work_mem = '8GB';

max_parallel_maintenance_workers: 这决定了可以使用的并行工作器的数量。在 Postgres 中,max_parallel_maintenance_workers 的默认值通常设置为 2。将其设置为较大的数字可以利用更多的计算资源来更快地构建索引。

SET max_parallel_maintenance_workers = 7; -- plus leader

在 RAG 应用中,召回率与查询执行时间一样重要。召回率是 ANN 提供的正确答案的百分比。在 HNSW 索引中,“ef_search”是确定搜索时要扫描的邻居数量的参数。“ef_search”越高,召回率越高,查询执行时间越长。

Johnathan Katz 进行的测试 表明,使用并行构建对召回率的影响微乎其微,大多数变化都产生了超过 1% 的积极影响。尽管速度有了很大的提高,但召回率的这种显著稳定性凸显了 pgvector 0.6.0 并行构建过程的有效性。

alt

pgvector 0.6.0 代表了一次重大飞跃,证明了 Postgres 在向量搜索领域的重要性。通过利用并行索引构建的强大功能,开发人员现在可以更快速、更高效地构建 HNSW 索引,从而显著减少此类任务传统上所需的时间和资源。

原文链接:https://neon.tech/blog/pgvector-30x-faster-index-build-for-your-vector-embeddings?ref=dailydev

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过知识管理提升财务卓越性

通过准确共享关键信息来降低运营风险、提高生产力并提高客户满意度。 Baklib 能为您提供什么帮助? 知识传输 无缝的知识转移可以让您的内部团队随时了解最新情况。这将帮助您的团队提高日常运营效率。 决策 对于每个银行或金融机构来说,决策都非常…

多任务协程处理的流程,看看是否和你想像的一样

import time import asyncioasync def func1():print("你好,我是第一个任务")await asyncio.sleep(3)print("你好,我是第二个任务")async def func2():print("你好,我是第3个任务")await asyncio.sleep(2)…

江科大/江协科技 STM32学习笔记P16

文章目录 一、PWM驱动LED呼吸灯1、打通PWM通路2、PWM.cTIM外设对应的库函数参考手册AFIO引脚重映射表 3、main.c 二、PWM驱动舵机1、PWM.c2、main.c3、Servo.c 三、PWM驱动直流电机1、Motor.c2、PWM.c3、main.c 一、PWM驱动LED呼吸灯 1、打通PWM通路 打通PWM通路,第…

使用Response.Write实现在页面的生命周期中前后台的交互

最近在做一个很大的查询,花时间很多, 用户会以为死掉了,就做了一个前后交互的,用于显示执行进度,在网上找了一下,这个比较合适。 主要是简单,大道至简 改进了一下:效果如下图 代码…

【干货】IP地址有免费的SSL证书嘛?怎么申请

IP地址没有免费的SSL证书,但可以通过一些证书颁发机构(CA)购买IP地址SSL证书。这类证书允许用户通过IP地址而非域名来建立安全连接,适用于没有域名的内部服务器、专用网络中的设备或其他无法使用域名的服务。 以下是申请IP地址SS…

Python 写文件 \r\n 和 \n

# -*- coding: UTF-8 -*-import timewith open(write_file.txt, a) as f:for i in range(5):# 计算时间戳timestamp time.strftime(%Y-%m-%d %H:%M:%S, time.localtime())# 构造内容contents ftimestamp:{timestamp}, content:{i}# \n# content f{contents}\n# \r\ncontent …

程序在开发电脑上能跑,客户机器上就崩溃,那是你还没意识到是它?

程序开发之谜:为何在开发电脑上一切正常,一到客户机器就崩溃? 1. 引言: 在软件开发的世界里,没有什么比看到自己精心编写的程序在自己的开发环境中完美运行,却在客户机器上突然崩溃更让人抓狂的事情了。这…

专业145+总415+成电电子科技大学858考研信号与系统经验电子信息与通信工程,通信抗干扰,资源与环境,航空航天,物理学院,考研真题,大纲,参考书。

暑期相对比较轻松,回顾一下自己的考,总结一些经验,希望对大家有所借鉴,电子科技大学专业课858信号与系统145,总分415,顺利上岸成电。专业课:858信号与系统 资料选择:真题&#xff0…

深度学习实战笔记7kaggle比赛:图像分类

import collections import math import os import shutil import pandas as pd from mxnet import gluon, init, npx from mxnet.gluon import nn from d2l import mxnet as d2lnpx.set_np() 获取并组织数据集 比赛数据集分为训练集和测试集,其中训练集包含50000…

光大远通学生宿舍智能电表如何安装

光大远通学生智能电表需要遵循一系列步骤,‌确保安全、‌正确地完成安装过程。‌ 首先,‌安装智能电表的前期准备工作包括确认电源断开、‌检查接线图纸、‌准备必要的工具等。‌在接线过程中,‌需要特别注意接地连接、‌电源接线、‌负载连…

【空间向量】

框架 空间代数空间直角坐标系向量的概念向量的运算向量间的关系空间平面与直线空间平面两平面的位置关系空间直线的方程两直线的位置关系直线与平面的位置关系空间曲面与曲线球面柱面旋转曲面二次曲面空间曲面在坐标面上的投影 解读 1【空间两点之间的距离】根号下各个位置差的…

Java:IO(File、RandomAccessFile、字节流和字符流、其他流)

1,操作文件类(File) 1.1,File类的基本介绍 在整个io包中,唯一与文件本身相关的类就是File类。使用File类可以进行创建或删除文件等常用操作,如果要使用一个File类,则必须向File类的构造方法中传…

数学建模--聚类分析

目录 聚类分析的基本概念 常用的聚类算法 K-Means 层次聚类 DBSCAN 高斯混合模型(GMM) 常用的数学公式和方法: 应用实例 结论 数学建模中的聚类分析在市场细分中的具体应用案例是什么? 层次聚类算法与K-Means算法在处理…

Kafka 为什么这么快的七大秘诀,涨知识了

我们都知道 Kafka 是基于磁盘进行存储的,但 Kafka 官方又称其具有高性能、高吞吐、低延时的特点,其吞吐量动辄几十上百万。 在座的靓仔和靓女们是不是有点困惑了,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间。…

unity2D游戏开发18导出游戏

点击File|build Settings 设置安装环境后,点击Build 选中文件夹 结果 运行 设置退出操作 在RPGGameManager类中加入代码 private void Update(){if (Input.GetKey(KeyCode.Escape)) { Application.Quit();}}

Android 10.0 framework默认沉浸式导航栏功能实现

1. 前言 在10.0的系统rom定制化开发中,在实现导航栏的某些定制化开发中,在某些产品需要实现沉浸式导航栏,就是需要app 能全屏显示同样也能显示导航栏,接下来就来分析下相关的功能实现 如图: 2.framework默认沉浸式导航栏功能实现的核心类 frameworks\base\core\java\andro…

idea恢复git未提交代码

背景:因拉取代码,本地冲突,误操作回滚了,本地未提交代码丢失。 操作步骤: git --> Uncommitted Changes --> Show Shelf 在下方会弹出一个git对话框,右键选择要恢复的代码,选择Unshelve…

使用ssh进行远程登录android 手机-非root

之前使用termux直接在android手机上面敲命令实在是太累了,android的键盘各种的不好用,就想着使用ssh的远程的方式操作, 后面发现了现在的这个方法,非常的有效,提高了不少的办事效率 可以参照下面的步骤进行操作 打开…

Java:数组方法,引用传递,变量类型,Lambda表达式

1,数组定义及使用 1.1,定义数组 Java语言是典型的静态语言,因此Java数组是静态的,即当数组被初始化之后,该数组所占的内存空间、数组长度都是不可变的。Java程序中的数组必须经过初始化才可使用。所谓初始化&#xff…

基于RAG的企业级代码生成系统:从数据清洗到工程化实现

目录 引言数据收集与清洗数据标准化知识图谱构建RAG系统实现代码生成模型训练工程化实现系统评估与优化结论 1. 引言 在现代软件开发中,利用大型语言模型(LLM)生成代码已成为提高开发效率的重要手段。然而,对于企业来说,如何让这些模型了解…