向量数据库选择浅谈
初见大模型
作为新手接触大模型后,LLM模型、Embedding模型、rank模型、vector模型等等选择上可谓是一步一个坑,迷茫的走在迷茫的大路上。总之各种途径去选择合适的模型,今天了解下向量数据库选择依据。
借鉴前人
学习之前先看看大家都在关注什么,主要看市面上那个火,大厂们关注那个、开源项目用的那个?为此看了dify、langchain、llama-index等框架里面默认用的那些。
- dify:默认使用的weaviate,可能主要考虑他是sass版本天然支持多租户。
- langchain: 提供的代码示例主要用了Chroma,可能考虑可以基于内存直接运行,直接上手测试
- 网上关注度比较高的Faiss,weaviate、Milvus
- 我司用的qdrant
选择合适的向量数据库
共性
- 都是能够实现基础的文本语义检索,
- 支持多语言客户端
- 在三方框架都有相应的支持
- 多种部署方式(云原生、docker、本地等等)
现在聊聊他们各自的特点
数据库 | Qdrant | Weaviate | Milvus | Faiss | |
---|---|---|---|---|---|
开源且可自托管 | ✅ | ✅ | ✅ | ✅ | |
开源协议 | Apache-2.0 | BSD | Apache-2.0 | MIT | |
开发语言 | Rust | Go | Go, C++ | C++ | |
Github Stars (k) | 18.8 | 10.2 | 28.1 | 29.4 | |
首次发布时间 | 2021 | 2019 | 2019 | 2017 | |
SDK客户端 | Python, JS, Go, Java, .Net, Rust | Python, JS, Java, Go | Python, Java, JS, Go | Python,Java,JavaScript,C++ | |
托管云服务 | ✅ | ✅ | ✅ | ✅ | |
内置文本嵌入 | ❌ | ✅ | ❌ | ❌ | |
混合检索 | ❌ | ✅ | ✅表内多向量混合 | ✅ | |
元信息筛选 | ✅ | ✅ | ✅ | ✅ | |
BM25支持 | ❌ | ✅ | ✅ | 倒排索引 | |
文本搜索 | ✅ | ✅ | ❌ | ❌ | |
Langchain集成 | ✅ | ✅ | ✅ | ✅ | |
Llama-index集成 | ✅ | ✅ | ✅ | ✅ | |
Geo地理信息搜索 | ✅ | ✅ | ❌ | ❌ | |
多租户支持 | ✅ | ✅ | ✅ | ❌ | |
最大维度 | 无限制 | 65535 | 32768 | 无 | |
索引种类 | HNSW | HNSW | ANNOY, FAISS, HNSW, ScANN | FAISS, HNSW | |
分片 | 静态分片 | 静态分片 | 动态分片 | 不支持提供 | |
Facets(带有计数的聚合) | ❌ | ✅ | ✅ | ❌ | |
Rest API | ✅ | ✅ | ✅ | ❌ | ❌ |
调用内置LLM用于RAG | - | ✅Generative Search | - | ❌ |
总结个人观点
数据库 | 说明 | 个人观点 |
---|---|---|
Qdrant | 1. 一个集合中可以存多种向量(图片、文字等)2. 资源占用相当少 | API简单易懂,有可视化页面,初学者友好,不支持混合检索,功能不够强大 |
Weaviate | 1. 性能相对不错2. 支持内置嵌入3. 支持文本搜索4. GraphQL API5. 支持S3备份 | 功能强大,花活挺多,内置嵌入初学者没啥用,没有可视化页面也不友好 |
Milvus | 1. 官方支持的可视化操作界面2. 较高的搜索准确率3. 丰富的SDK4. GPU加速 | 功能同样强大,支持GPU加速对大数据量友好,官网API稳定易懂,对比mysql学习 |
Faiss | GPU加速的高速检索,特别擅长处理庞大数据集的快速最近邻搜索;2.适应不同技术风格的搜索技术 | 一直强调GPU加速,可能是真的强 |
检索方式对比
- Milvus:多向量搜索
- Weaviate: 混合搜索(向量检索+BM25关键词搜索)
- Qdrant:向量检索(关键字全文过滤)
- Faiss: 支持批量查询(GPU高效索引)
多向量检索:适合复杂的场景,例如当一个实体可以通过多个不同的向量表示时。这适用于同一数据(如一个句子)通过不同嵌入模型处理,或当多模态信息(如个人的图像、指纹和声纹)转换成各种向量格式的情况。通过表范围内的“多路召回”,并给这些向量分配权重,它们的综合作用可以明显增加召回能力,并提高搜索结果的有效性。
BM25和简单的关键词搜索有什么区别?
简单的关键词搜索通常基于词频:如果一个词在文档中出现,那么这个文档就被认为是相关的。这种方法可能只计算关键词的出现次数,并且所有关键词都被视为同等重要。
BM25则是基于IF-IDF(词频-逆文档率算法)采用更复杂的算法,不仅考虑词频,还考虑文档长度和词的逆文档频率(即在所有文档中的稀有程度)。这意味着BM25可以提供一个更为精细化的相关性评分,更好地反映查询与文档的匹配程度
综上所述
对于新人入门尝试可以使用drant,学习成本低。
具体还得看业务需求,是否有复杂的逻辑,比如多模态需求、前端开发能力等可以使用Milvus,社区也比较活跃。
个人对Weaviate接受程度不高,初学者学习有点费劲,但是网上weaviate的文章还是挺多的,于用生产。
转载自:https://juejin.cn/post/7388096340503707688