对于数据库本身,做技术的朋友一定不会陌生。从后端到前端再到移动端,端端业务都离不开。小到SQLite
,大到MySQL
和MongoDB
,任何与查询相关的事情基本上都需要接入这种玩意…
然而向量数据库(又称矢量数据库),却不是人人都接触过,光看这名字,就充满高级与神秘感!
接下来,本文将从三个方面,来向读者介绍什么是向量数据库,以及它适用的业务场景和当前业界的主流方案。
基本概念
什么是向量数据库
标准解释:以数学形式存储的数据集合。翻译成人话,就是把人类看得懂的信息转换成机器容易理解的数据,并能有效建立关联关系,比如文字/音频/图片等转换成类似[[1],[22],[333]]
这种高维度数据,主要应用于语义化相似度检索。
举个例子,在传统的数据库检索中,一般都是根据关键词做模糊匹配。比如简单粗暴的LIKE
语句,然而这些本质上都是基于文本在做匹配查找,一旦关键词不对,结果就查不出来了。
诞生背景
- 传统数据库面向语义化查询明显存在短板,除非人为用代码去解决。但如果业务逻辑复杂或者面向文档类查询,基本上就没招了;
- 人工智能的发展需要,现阶段大模型都有一定 TOKEN 的限制,能够高效理解上下文、读懂用户意图决定了 AI 的基本素质;
如果没有向量数据库,单独查询机器学习模型速度会很慢,而且每次消耗大量 TOKEN 也得不偿失。通过向量化数据,可以有效整合并精准上下文信息关联,省时省钱、还提高了模型调用的精度。
与一般数据库的区别
这里列举一些主要的差异,体现在数据类型、查询方式、应用场景等方面:
数据类型
- 传统数据库:主要处理结构化的数据,如数字、字符串、日期等。数据通常以表格的形式组织,每一列对应一种数据类型。通常采用关系模型或键值、文档、图形等 NoSQL 模型,RDBMS 通常对应二维表结构,NoSQL 对应树状结构。
- 向量数据库:专门处理高维向量数据,如来自深度学习模型的输出向量。这些向量可以代表文本、图像、音频等各种类型的数据。通常不关心数据的具体含义,而是侧重于向量本身及其相似度。
存储和索引
- 传统数据库:使用 B 树、哈希索引等数据结构来优化查询效率。
- 向量数据库:使用特殊的数据结构(如 HNSW、PQ 等)来加速向量相似度查询。
查询方式
- 传统数据库:使用 SQL 查询语言或特定的查询 API 来检索数据,支持复杂的条件筛选、聚合操作等。
- 向量数据库:主要通过计算向量之间的相似度来检索数据,通常使用距离度量(如欧几里得距离、余弦相似度等)来查找最近邻或相似向量。
应用场景
- 传统数据库:广泛应用于事务处理、报表分析、数据仓库等领域。
- 向量数据库:适用于推荐系统、图像和视频检索、语义搜索、自然语言处理等需要处理非结构化数据的应用场景。
当然,截止目前,有的传统数据库也是可以通过扩展的方式支持向量查询的功能。这里就不再具体展开讲,有兴趣移步到文章末尾:参考资料的第一篇
业务场景
对于向量数据库,目前业界主要应用在以下场景:
- 相似度和语义搜索:
- 电商领域:比如经典功能之一的:猜你喜欢
- 影音娱乐:推荐歌曲/电影等
- 聊天机器人
- 机器学习和深度学习:将信息的相关性连接起来,构建完成复杂认知任务的学习和模型训练
- 大语言模型(LLM)和生成式 AI:依赖向量数据库对文本/语音等进行上下文分析,通过将单词、句子和观点相互关联,LLM 可以理解人类的自然语言,甚至可以生成文本
主流方案
- Milvus:Zilliz 开发的开源向量数据库,支持分布式部署和多种索引结构。支持
Go
,Python
,Java
,文档和社区完善; - Faiss:Faiss 是 Facebook AI Research 开发的一个高效相似性搜索库,支持 CPU 和 GPU 加速。主要面向
C++
开发者,数据规模大、需要高性能要求的首选; - Annoy:Spotify 开发的用于近似最近邻搜索的库,适用于大规模、只读数据集。简单易用,适合快读原型开发,编程语言支持
Python
和C++
; - Qdrant:一个高性能、可扩展的向量搜索引擎,支持多种索引结构,如 Flat、HNSW 和 PQ (Product Quantization),中大型业务和云原生应用;
- Weaviate:一个开源的向量数据库,支持图数据库的特性,可以存储和查询带有关系的向量数据。提供 RESTful API 和多种语言的客户端 SDK,适合构建语义化理解系统的团队;
简易排名
- Milvus:提供了多种语言的 SDK,文档丰富,社区活跃。
- Faiss:虽然主要支持 C++和 Python,但在性能方面非常优秀,有广泛的社区支持。
- Qdrant:通过 RESTful API 支持多种语言,易于集成,社区活跃度良好。
- Weaviate:同样通过 RESTful API 支持多种语言,社区支持也不错。
- Annoy:支持较少的语言,但简单易用,适合快速原型开发。