大模型崛起,向量数据库却凉透了?老码农这样看
不论是RAG,还是Agent,几乎每个LLM 驱动的应用程序都可能会用到向量数据库。那么,向量数据库是什么?与传统数据库有何不同?又如何选择向量数据库呢?本文是老码农关于向量数据库的学习笔记。
一、什么是向量数据库?
图像向量,通过深度学习模型提取的图像特征向量,这些特征向量捕捉了图像的重要信息,如颜色、形状、纹理等,可以用于图像识别、检索等任务; 文本向量,通过词嵌入技术如Word2Vec、BERT等生成的文本特征向量,这些向量包含了文本的语义信息,可以用于文本分类、情感分析等任务; 语音向量,通过声学模型从声音信号中提取的特征向量,这些向量捕捉了声音的重要特性,如音调、节奏、音色等,可以用于语音识别、声纹识别等任务。
管理:向量数据库以原始数据形式处理数据,能够有效地组织和管理数据,便于AI模型应用。 存储:能够存储向量数据,包括各种AI模型需要使用到的高维数据。 检索:向量数据库特别擅长高效地检索数据,这一个特点能够确保AI模型在需要的时候快速获得所需的数据。这也是向量数据库能够在一些推荐系统或者检索系统中得到应用的重要原因。
二、向量数据库的工作机理
基于树的方法,例如KDTree和Annoy 基于图的方法,例如HNSW 基于乘积量化的方法,例如SQ和PQ 基于哈希的方法,例如LSH 基于倒排索引的方法
三、向量数据库的分类
根据向量数据库的的实现方式, 我们可以将向量数据库大致分为4类:原生的向量数据库、支持向量的全文检索数据库、支持向量的NoSQL数据库和支持向量的关系型数据库。
原生的向量数据库是专门为存储和检索向量而设计的。包括Chroma, LanceDB, Marqo, Milvus/ Zilliz, Pinecone, Qdrant, Vald, Vespa, Weaviate等, 所管理的数据是基于对象或数据点的向量表示进行组织和索引。这里只介绍其中的三种,具体信息可以参考各自的官网。
Faiss
Faiss是一个用于高效相似性搜索和密集向量聚类的开源库。Faiss是用C++编写的,带有完整的Python/numpy包装器,一些常用算法都有GPU实现,成为了很多开源向量数据库的基础。
Faiss能构建不同的索引类型,并提供了欧式距离或者点积的相似度计算功能,有些索引类型是简单的基线,例如精确搜索。大多数可用的索引结构需要考虑搜索时间,搜索质量,每个索引向量使用的内存等。
Faiss支持多种向量搜索技术,提供了能够在不同大小的向量集中搜索的算法,甚至可以处理那些超过内存容量的向量集。
Faiss的主要优势之一是速度和可扩展性,即使在具有数十亿个向量的数据集中也可以进行快速搜索。此外,还提供了用于评估和调整参数的辅助代码。
Pinecone
Pinecone是一个基于云的向量数据库,可以开发实时相似性搜索应用,能够以毫秒级的延迟存储和探索高维向量嵌入,适用于推荐系统、图片和视频搜索以及自然语言处理等应用。
Pinecone 的主要功能包括自动索引、实时更新、查询自动调整和用于与当前流程进行简单交互的 REST API。其架构专为可扩展性和稳健性而构建,可以轻松管理海量数据,同时保持高可用性。
Pinecone是一个可以托管的向量数据库平台,也就是说有商用方案,也有免费使用方案。其主要特点包括:
支持全托管服务
高度可伸缩
实时数据摄取
低延迟的搜索
与LangChain集成
Pinecone 采用了多种安全措施来保护用户的数据安全和隐私。多层次的访问控制机制可以控制用户的访问权限和操作权限,同时采用了数据加密、传输加密等技术来保护数据的安全性,还提供了数据备份和恢复等功能,可以防止数据丢失和损坏。
Pinecone 在性能方面表现非常出色,它能够支持高达 1 百万次的QPS,且具有低延迟和高吞吐量的特点,还具有分布式部署、实时索引构建和高效的向量相似度搜索等优点,可以帮助用户快速处理大规模的向量数据。
此外,Pinecone 还支持多种编程语言和框架,如 Python、Java、TensorFlow 等,使得用户可以轻松地将其集成到自己的应用程序中。
Milvus
Milvus是一个开源的分布式向量数据库,它具备高可用、高性能、易拓展的特点,用于海量向量数据的实时召回。
Milvus 基于 Faiss、Annoy、HNSW 等向量搜索库构建,可以轻松管理数百万个实体,可以根据不同的数据特点选择最合适的索引算法,核心是解决稠密向量相似度检索的问题。在向量检索的基础上,Milvus 支持数据分区分片、数据持久化、增量数据摄取、标量向量混合查询、time travel 等功能,同时大幅优化了向量检索的性能,可满足任何向量检索场景的应用需求。
Milvus 还具有分布式部署、高可用性和高扩展性等优点,可以帮助用户快速处理海量的向量数据。它也提供了多种安全措施来保护用户的数据安全和隐私,支持 SSL/TLS 加密和访问控制等技术,可以防止数据被非法访问和窃取,还提供了数据备份和恢复等功能,可以保护数据的完整性和可用性。
此外,Milvus 还提供了多种客户端 SDK,如 Python、Java、C++ 等,使得用户可以方便地使用不同的编程语言来访问和操作 Milvus。
这类数据库包括Elastic/Lucene、OpenSearch和Solr。它们都具有丰富的文本检索功能,如可定制的标记器,分词器,停用词列表和N-grams等,大部分都基于开源库,且有大型集成的生态系统,包括了向量库。
例如,Elasticsearch,是一个支持各种类型数据的分布式搜索和分析引擎。Elasticsearch在7.3 版本中,添加了对向量数据索引的支持,支持混合查询,但是向量检索采用的仍然是暴力计算,性能损耗较大。在8.0版本引入了knn search其实就是一种近似最近邻搜索算法,相似度支持欧式距离,点积和余弦相似性,knn search底层其实使用的是HNSW。遗憾的是,这种方式无法进行混合检索。
几乎所有这些NoSQL数据库都是最近才通过添加向量搜索扩展而具备向量能力的,所以如果要是使用的话一定要做好测试。Cassandra,Rockset,Azure Cosmos DB和MongoDB等都纷纷宣布了增加向量搜索的计划。NoSQL数据库的向量搜索性能可能差别很大,这取决于所支持的向量函数、索引方法和硬件加速。
例如,RedisVector是一个向量数据库,专注于向量数据的有效处理。它擅长存储和分析大量向量数据,包括张量、矩阵和数值数组。通过 利用内存数据存储Redis,RedisVector可提供高性能的查询响应时间。它提供内置的索引和搜索功能,可以快速搜索和查找相似的载体,RedisVector还支持各种距离测量,用于比较向量和执行复杂的分析操作。通过对向量数据的操作,包括元素级算术和聚合,RedisVector 为处理向量提供了一个多功能环境,适用于处理和分析高维向量数据的机器学习应用,从而能够创建定制的推荐系统和基于相似性的准确搜索。
对于支持向量的NoSQL 数据库,探索尝试未尝不可,但在生产环境中使用要慎之又慎。
这些大都是关系型数据库并且支持sql查询,例如SingleStoreDB, PostgreSQL, Clickhouse和Kinetica的pgvector/Supabase Vector等。它们都宣布包含了向量搜索功能,如点积,余弦相似度,欧几里得距离和曼哈顿距离,并且使用相似度分数找到n个最近邻。由于提供了混合查询,可以将向量与其他数据结合起来以获得更有意义的结果。另外,大多数SQL数据库都可以作为服务部署,可以在云上进行完全的管理。
四、向量数据库的一些对比
可扩展性:能够高效处理高维度大数据量并能够根据数据需求的增长进行扩展。 性能:速度和效率对数据库至关重要,需要在数据搜索、搜索性能和执行各种向量操作方面表现出色。 灵活性:支持广泛的数据类型和格式,并且可以轻松适应不同的应用场景。 易用性:这些数据库易于使用和管理,易于安装和配置,具有直观的API,并且有良好的文档和支持。 可靠性:需要有可靠和稳定的声誉。
五、向量数据库与其他类型数据库的对比
六、向量数据库在大模型中的应用
参考资料
https://github.com/milvus-io/milvus
Milvus: A Purpose-Built Vector Data Management System, SIGMOD'21
https://github.com/facebookresearch/faiss
https://www.pinecone.io