在AI盛行的当下,Vector Search结合LLM的应用模式已经在应用领域逐渐成为主流,要想开好AI这辆跑车,那么首先需要有一款衬手的引擎,它就是向量数据库。这也是ChatGPT曝火后,很多向量数据库公司获得了数亿美元的融资的原因。
大体思路为:由于目前的技术栈中有在用Elasticsearch,所以会先从ES开始着手调研。接着会调研一下市面上常用的小巧的向量数据库,如果没有适合业务场景的,会直接选择使用国产开源的Milvus。
Elasticsearch 是一个基于 Lucene 的搜索引擎,它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。虽然 Elasticsearch 本身并不能直接支持向量搜索(vector search),但有一些开源插件可以提供这个功能,如 Elasticsearch Vector Scoring,Elastiknn 等。以下是这些插件的一些基本信息和安装指南:
1.Elasticsearch Vector Scoring: 这是一个 Elasticsearch 插件,用于在 Elasticsearch 查询中添加余弦相似度评分(cosine similarity scoring)。安装步骤:
注意:需要将 {version} 替换为 Elasticsearch 的版本号
./bin/elasticsearch-plugin install https://github.com/MLnick/elasticsearch-vector-scoring/releases/download/v{version}/elasticsearch-vector-scoring-{version}.zip
2.Elastiknn: Elastiknn 是一个 Elasticsearch 插件,可以有效地进行高维向量近似最近邻(approximate nearest neighbor)搜索。安装步骤:
注意:需要将 {version} 替换为 Elasticsearch 的版本号
./bin/elasticsearch-plugin install https://github.com/alexklibisz/elastiknn/releases/download/{version}/elastiknn-{version}.zip
注意,上述安装步骤都假定你已经在你的系统中安装了 Elasticsearch。如果你还没有安装,你需要先进行安装。同时,由于 Elasticsearch 插件需要与 Elasticsearch 本身的版本兼容,所以在安装插件时,你需要确保下载的插件版本与你的 Elasticsearch 版本相匹配。如果你在安装过程中遇到任何问题,你应该参考插件的官方文档或者 Elasticsearch 的官方文档。
另外,你需要知道的是,虽然 Elasticsearch 有这些插件可以支持向量搜索,但它并不是为此设计的。如果你的主要需求是向量搜索,你可能需要考虑一些专门为向量搜索设计的系统,如 Faiss,Annoy,NMSLIB 或者 Vespa。这些系统在向量搜索方面可能会有更好的性能和效率。
当前github上最近还在更新的插件为:
•GitHub - alexklibisz/elastiknn: Elasticsearch plugin for nearest neighbor search. Store vectors and run similarity search using exact and approximate algorithms.[1]•GitHub - lior-k/fast-elasticsearch-vector-scoring: Score documents using embedding-vectors dot-product or cosine-similarity with ES Lucene engine[2]•GitHub - MLnick/elasticsearch-vector-scoring: Score documents with pure dot product / cosine similarity with ES[3]
向量数据库是一种专门设计用来处理高维度数据和进行向量搜索的数据库。以下是一些市面上常用的向量数据库:
1.Faiss (Facebook AI Similarity Search): Facebook研发的一款用于高效相似度搜索和聚类的库。Faiss提供了多种搜索高维空间中近似最近邻(NN)的方法。Faiss本身不是一个完整的数据库,但可以嵌入到数据库系统中。2.Milvus: 开源的向量数据库,支持动态增删、在线索引构建,兼容FAISS和ANNOY等索引库,同时提供了丰富的SDK接口和图形化管理界面。3.Annoy (Approximate Nearest Neighbors Oh Yeah): 是由Spotify开源的一款用于高维空间中近似最近邻搜索的C++库,与Faiss类似,Annoy也不是一个完整的数据库,但可以嵌入到数据库系统中。4.Pinecone: 是一款全托管的向量搜索服务,专门为机器学习模型构建,提供简单易用的API,支持大规模向量搜索。5.Weaviate: 是一款开源的语义搜索引擎,其利用机器学习来理解和搜索大规模的数据。6.HNSW (Hierarchical Navigable Small World): 是一种基于图的方法,可以在高维空间中进行高效的近似最近邻搜索。HNSW不是一个完整的数据库,但可以嵌入到数据库系统中。
请注意,虽然这些向量数据库都非常强大,但每种数据库都有其特定的优缺点。在选择的时候,需要根据你的特定需求来考虑,例如数据的规模,查询的速度需求,是否需要支持在线查询和更新等等。
Qdrant和FAISS都是用于处理高维度向量的工具,但它们的设计目标和功能有所不同。以下是它们的主要区别和各自的优缺点。
Qdrant:
Qdrant是一个向量搜索引擎,它的目标是提供一个功能齐全的解决方案,包括数据存储、索引和查询功能。
优点:
1.持久化存储:Qdrant不仅可以索引数据,而且还可以作为一个数据库来持久化存储数据。2.支持元数据:Qdrant可以存储与向量相关的元数据,这使得用户可以进行复杂的向量和元数据联合查询。3.动态更新:Qdrant支持动态添加、删除和更新向量,而无需重新构建整个索引。4.分布式存储和查询:Qdrant的设计可以支持分布式存储和查询,这使得它可以处理大规模的数据集。5.对多种距离度量的支持:Qdrant支持各种距离度量,包括欧氏距离、余弦相似度等。
缺点:
1.项目相对较新:Qdrant是一个相对较新的项目,可能在某些功能和稳定性方面不如成熟的项目。2.社区支持较少:由于是新项目,Qdrant的社区支持可能不如FAISS等成熟项目丰富。
FAISS:
FAISS是由Facebook AI研究院开发的,专注于高效的最近邻搜索。
优点:
1.高效性能:FAISS专门为大规模的最近邻搜索设计,它的性能非常高。2.丰富的索引类型:FAISS支持多种类型的索引,包括精确索引,近似索引,和量化索引,可以根据具体的需求选择合适的索引类型。3.文档和社区支持:FAISS有丰富的文档和一个活跃的社区,如果遇到问题可以很容易地找到解决方案。4.深度学习集成:FAISS与PyTorch深度学习框架有良好的集成,方便在深度学习模型中使用。
缺点:
1.不支持持久化存储:FAISS主要专注于向量的索引和搜索,它本身并不提供数据的持久化存储。2.缺乏元数据支持:FAISS主要关注于向量的存储和搜索,而不支持与向量相关联的元数据的存储和查询。3.不支持动态更新:FAISS构建的索引不支持动态添加、删除和更新向量。如果数据发生改变,通常需要重新构建整个索引。4.不支持分布式存储和查询:虽然可以通过第三方库和工具进行一些扩展,但FAISS本身并不原生支持分布式存储和查询。根据上述对比,我们可以看出,Qdrant和FAISS在设计目标和功能上有很大的不同。FAISS主要专注于大规模的最近邻搜索,而Qdrant则提供了一个更全面的解决方案,包括数据存储、索引和查询。在选择哪个工具时,你应该根据你的具体需求来决定。如果你需要一个功能齐全的向量数据库,支持持久化存储、元数据查询和动态更新,那么Qdrant可能是一个更好的选择。如果你主要关注高效的最近邻搜索,并且有足够的资源来管理数据的存储和更新,那么FAISS可能是一个更好的选择。
如果只从Faiss和Qdrant中选择一种的话,对于大规模存储和检索的需求,你可能需要考虑一些其他的因素:
1.数据的动态性:如果你的数据经常变动,那么你可能会更倾向于选择Qdrant,因为它支持动态更新。2.查询的复杂性:如果你的查询需求仅仅是基于向量的最近邻搜索,那么FAISS的性能可能会更优。但是,如果你需要利用元数据进行复杂的查询,那么Qdrant可能会更适合你。3.分布式需求:如果你有分布式存储和查询的需求,Qdrant可能会更适合,因为FAISS本身不支持分布式。4.计算资源:FAISS在GPU上有非常好的性能,但是如果你的计算资源主要是CPU,那么Qdrant可能会更适合。5.数据持久化:如果你需要持久化存储数据,Qdrant可能是更好的选择,因为FAISS主要专注于内存中的最近邻搜索,对于数据的持久化存储支持不是很好。6.开发和维护的便利性:Qdrant提供了更完整的数据库功能,包括数据的存储、索引和查询,使用起来可能更加方便。而FAISS主要提供了基于向量的最近邻搜索的功能,对于数据的存储和更新,你可能需要自己实现或者借助其他工具。
根据以上因素,你可以根据你的具体需求来选择最适合你的工具。如果你的需求更倾向于完整的数据库功能和动态更新,那么Qdrant可能是更好的选择。如果你的需求更倾向于高效的最近邻搜索,并且数据变动不频繁,那么FAISS可能是更好的选择。
如果考虑其他选择,像Milvus、ES也是不错的选择,要根据你实际的业务场景来做选择。
找到了一篇比较好的基准测试文章,感兴趣的可以自行查阅:
本文是根据实际调研过程中的一些问题和GPT4的回答,结合笔者自己网上的调研结果整理而成。后续会陆续推出诸如Elasticsearch Knn的实践、Qdrant和FAISS、Milvus的探索实践流程与示例,感兴趣的同学可以关注一下。
[1]
GitHub - alexklibisz/elastiknn: Elasticsearch plugin for nearest neighbor search. Store vectors and run similarity search using exact and approximate algorithms.: https://github.com/alexklibisz/elastiknn
[2]
GitHub - lior-k/fast-elasticsearch-vector-scoring: Score documents using embedding-vectors dot-product or cosine-similarity with ES Lucene engine: https://github.com/lior-k/fast-elasticsearch-vector-scoring
[3]
GitHub - MLnick/elasticsearch-vector-scoring: Score documents with pure dot product / cosine similarity with ES: https://github.com/MLnick/elasticsearch-vector-scoring