近几年大语言模型的突破带来自然语言相关的向量数据爆炸式增长,同时为管理这些向量数据而设计的向量数据库的关注度也在不断提高。大语言模型和向量数据库的组合在多个领域都具有广泛的应用,如语义检索、推荐系统、问答机器人等。本文将探讨向量数据库在大模型场景下的应用趋势,并结合用户案例,详细介绍拓数派向量数据库 PieCloudVector 的架构设计与技术实现。
随着人工智能技术的飞速发展,大模型成为推动 AIGC 前沿发展的关键力量。借助大模型的强大数据处理能力,AIGC 能够自动生成高质量、个性化的内容,实现智能问答、情感分析和文本生成等功能,并已经在金融、传媒、文娱、电商等多个领域广泛应用。然而,大模型仍然面临诸如数据时效、私域数据、长期记忆和幻觉等挑战和局限性,这极大地限制了大模型在各种场景中的落地。
1 检索增强生成(RAG)
为有效解决大模型的局限性,当前业界广泛采用的方法是利用检索增强生成(Retrieval-Augmented Generation, RAG)技术来提升大模型的性能。
RAG 是一种将信息检索系统与生成式大语言模型结合在一起的技术,它的核心思想是让语言模型在生成回答时能够动态地从外部知识库中检索相关信息,从而提高模型生成内容的准确性和可靠性。
将原始数据转换为 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 的索引是存储在内存中的,因此能很大程度上避免系统性能受存储的影响。
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): 基于图的向量搜索算法。
PieCloudVector 支持主流 ANN 算法
- 3.2.2 向量压缩
在实际使用场景中,为满足性能要求,基本上所有的数据都需要加载到内存中进行访问,而当向量数据规模达到一定程度时,尤其是高维数据,直接存储对于内存的压力会非常大,因此,PieCloudVector 采用了乘积量化(Product Quantization,PQ)的方法对向量数据进行压缩,这也是目前最流行的压缩算法之一。
乘积量化的原理是将原始的高维向量分解为若干个低维的子向量,并对每个子向量进行独立量化,这样每个原始向量就能由多个低维空间的量化编码组合表示,不仅节省了大量的内存空间,还可以加快整个系统的检索速度。
乘积量化 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 完全符合向量数据库技术标准要求。
PieCloudVector 兼容主流国产软硬件
4 基于 PieCloudVector 的 RAG 实践案例
PieCloudVector 凭借其卓越的性能和广泛适用性,已成功在各行各业的大模型领域中落地应用,特别是在金融大模型领域展现了显著的优势。
在东吴证券应用案例中,拓数派为客户打造了基于向量数据库 PieCloudVector 的 AIGC 应用解决方案,采用自研大模型东吴秀财 GPT,结合 LangChain 开发框架以及 PieCloudVector 构建了 AIGC 应用平台。具体信息欢迎参考相关文章。
基于 PieCloudVector 的 RAG 案例
整个应用流程可分为如下主要步骤:
- 将东吴原始数据文档通过 Embedding 模型转换成向量后存储到 PieCloudVector 中,这些数据将定期更新以保证实时性;
- 接着将用户输入经过相同的模型转换为向量,并通过 LangChain 架构调用 PieCloudVector,搜索到一组与用户输入内容相关的文档资料;
- 将该资料与用户输入组合成新的提示词发送给东吴 GPT 模型,从而生成质量更高的答案回复给用户。
通过外挂基于 PieCloudVector 的知识库,拓数派助力东吴大模型提升处理新问题的能力,提高检索工作的效率和准确性,并满足了客户构建投研分析、量化交易、智能顾问、情绪分析等多个场景的 AI 应用的需求。
5 展望未来
目前,PieCloudVector 仍在不断地优化升级,下一步计划在以下几个方面深入探索,并将致力于与不同领域的应用场景相结合,为客户提供更强大、更全面、更灵活的解决方案:
- 非侵入式线程优化: 现阶段,PieCloudVector 对于 Faiss 线程池的改造是侵入式代码改动,对于后续更新维护并不友好,拓数派团队正在探索非侵入式线程池优化模式。
- 混合查询索引: 对于向量和标量混合查询的场景,如果两边的数据均有索引,在执行时一般只会调用其中一个索引,后续将考虑设计混合式索引结构以加速查询。
- GraphRAG: 在传统的基于向量搜索的 RAG 模式之上,进一步实现基于知识图谱构建的检索增强生成方案。
- ...