最近,我必须进入向量数据库世界并为一个特定项目选择一个。令我惊讶的是,向量数据库由于大语言模型(LLMs)的兴起而重新受到关注。虽然它们被认为是“新技术”并不准确,但向量数据库其实已有很长时间的历史,并经过了多年的工程和科学测试。
就像关系数据库一样,向量数据库种类繁多,各有千秋。相比于选择SQL数据库,我对向量数据库完全是新手。所以,我需要四处打听,自己搜集数据,检查并形成对各个数据库的看法,以选择适合特定用例的产品。
在深入了解之前,先澄清一下我并不是AI专家,文章中的看法仅为个人观点,可能有偏见,请读者自行查证。
向量、相似度和我们的大脑
首先,我们要了解一些基本概念。计算机不能理解字词,它们只能处理二进制语言,即0和1。所有计算机操作最终都是数字。自然数、浮点数都可以转化为二进制表达。目前计算机可以通过某些方法,将不同的单词在不同上下文中转化为不同的数字,这就是所谓的上下文化词嵌入。
这种表示缺乏语境,导致理解的局限性。例如,“dust” 在“dust the furniture” (打扫家具)和 “dust on the furniture”(家具上的灰尘)中的意义不同,但在基础情况下,它们在计算机中的表示是相同的。
为了解决缺乏语境的问题,我们开发了上下文化词嵌入技术。该方法根据单词的语境或语义生成不同的唯一数字。
number_representation_of_a_word_and_meaning(“dust”, context=“dust on the floor”) == 42
number_representation_of_a_word_and_meaning(“dust”, context=“dust the floor”) == 24
具有相似语义的单词在不同语境中会被分配接近的数字。这使得计算机能够判断不同的语义差异。
嵌入的定义:
嵌入(Embeddings)是根据特定标准(例如语义意义)分配的数字表示方法。在嵌入空间中,语义相似的词汇将会靠近彼此,而语义差异较大的词汇将会距离较远。
例子:
number_representation_of_a_word_and_meaning(“bark”, context=“bark is a noun”) == 12
number_representation_of_a_word_and_meaning(“bark”, context=“bark is a verb”) == 19
“bark”作为名词和动词在不同语境中有不同的数字表示,但同样都与保护有关,因此它们的数字接近。
在高维向量空间中,不同语义和上下文的单词会被分配不同的向量值,而这些向量值之间的距离可以表示语义的相似度。向量空间的维度越高,表示的语义越丰富。然而,计算高维向量相似性的问题也越复杂,这就是所谓的“维度灾难”。为了解决这个问题,引入了像HNSW这样的分层可导航小世界算法。
实际上,LLM只是复杂的算法,它们处理大量数据,将这些数据向量化并嵌入高维空间,然后基于语义上下文进行近似匹配和猜测,并不是在“思考”。
人脑与GPT-4的比较
尽管现代大语言模型(如GPT-4)在模拟自然语言方面表现出色,但它们并不具备真正的“理解”能力。
- GPT-4 的硬件需巨大的数据中心和约7.5兆瓦每小时的功耗,而人脑仅需24瓦每小时。
- 计算下来,人脑的效率大约是GPT-4的300万倍,且复杂性至少高出一个量级。
各大向量数据库的使用体验总结
ChromaDB
- 优点:快速上手,适合概念验证。
- 缺点:不适应生产级应用,特别是在数据持久化和扩展方面有问题。
• 最新改进:ChromaDB 进行了架构改革,性能和耐用性得到提升。
Pinecone
- 缺点:黑盒模式,数据控制不在用户手中,不适合有数据隐私和合规需求的人。
Faiss
- 缺点:仅是一个库,不是完整的向量数据库,不适合生产环境。
Milvus
- 优点:支持新功能,适合自托管和云服务。
- 缺点:实际使用中有很多问题,如数据索引和边缘情况处理。
pgvector
- 缺点:性能和准确性差,特别是在并发情况下。不被所有Postgres版本支持。
Redis
- 优点:性能不错,适合作为入门方案。
- 缺点:不能作为专门的向量数据库使用,核心业务不是向量存储。
Qdrant
- 优点:开源,自托管和云服务选项,性能优异,社区活跃,易用性高。
Weaviate
- 优点:功能集丰富。
- 缺点:性能可能不如Qdrant。
结论
- Qdrant: 各方面表现优秀,适合生产级应用。
- ChromaDB: 新增功能使其在某些情况下是不错的选择。
- Pinecone: 适合快速上手,存在锁定风险。
- Redis: 性能不错,但不建议作为专门的向量数据库。
- pgvector: 不推荐用于高并发和需要高准确性的环境。
- Milvus: 实践中存在太多问题,不推荐使用。
- Faiss: 仅适合简单的业余项目,不适合生产环境。
4 个帖子 - 3 位参与者