1. 聊矢量数据库,先弄清楚它到底解决了什么问题
这两年只要搞 AI 应用,矢量数据库(Vector Database)绝对是绕不开的话题。RAG、语义搜索、推荐系统、异常检测,背后跑数据的基本都离不开它。但很多人对它的认知还停留在“一个能存向量的数据库”,真到选型的时候就懵了——Pinecone、Milvus、Qdrant、Weaviate、Chroma、pgvector 全都在宣传自己多厉害,到底哪个适合你?今天我就把我接触过的、2025 年确实能扛事的 7 个矢量数据库逐个过一遍,讲清楚它们的核心差异、适用边界,以及我在实际项目里踩过的坑和总结出的选型经验。这篇文章适合正在做技术选型的后端工程师、AI 应用开发者,以及所有想搞明白矢量数据库到底该怎么用的朋友。
1.1 从“存向量”到“找相似”,核心到底难在哪
矢量数据库的本质,是专门为向量检索设计的存储和计算系统。传统数据库用 B+ 树、倒排索引来加速精确查询,但向量查询要的是“近似最近邻”(ANN),也就是在亿级向量里快速找到“最相似”的那一批,而且允许有一点误差。这个特性决定了它没法用传统数据库的索引方式硬扛。
打个比方,传统数据库查一个人的身份证号,精确匹配,快到毫秒;矢量数据库要做的是“找出和我描述风格最像的 10 篇文章”,这里没有精确答案,只有“近似正确”,所以核心拼的是两件事:索引结构和检索算法。目前主流方案是 HNSW(分层导航小世界图)和 IVF(倒排文件索引),后面我会展开讲这两个对选型的影响。
另一个关键点是过滤逻辑。现实场景里很少只做纯向量检索,比如“找与这个图片最相似的商品,且价格在 100 到 200 元之间、库存大于 0”。矢量数据库必须把结构化字段的过滤和向量检索结合起来,这种“标量+向量混合过滤”的能力,直接影响最终效果和查询延迟。很多数据库在这一点上差距非常大。
1.2 2025 年看矢量数据库,这几个维度决定选型成败
我评估一个矢量数据库,重点不看官方宣传,只看五个实际维度:
- 数据规模与性能:百万级和亿级是完全不同的技术路线。十万量级向量,Chroma 都能轻松扛;到了亿级,没有分布式能力的基本可以直接排除。
- 索引支持的灵活度:HNSW 参数能不能调、有没有 IVF 选项、内存和召回率能不能权衡,这决定你能不能在存储成本和查询质量之间找到平衡点。
- 生态集成度:和 LangChain、LlamaIndex、Spark、Flink 看有没有官方支持,数据导入导出方不方便,有没有好用的可视化界面。
- 运维复杂度:是托管服务还是自建开源,扩缩容怎么搞,监控告警有没有,这决定你团队愿不愿意长期维护。
- 上手成本:API 设计是否直观、文档质量、社区活跃度,还有最重要的——踩坑的时候能不能搜到解决方案。
接下来说的 7 个数据库,就是在这五个维度上各有取舍的结果,没有完美的,只有合适的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 2025 年值得重点关注的 7 个矢量数据库
2.1 Pinecone:托管服务的天花板,省心但贵
Pinecone 适合谁?适合那些不想碰运维、只需要调 API 的团队。它是纯托管服务,不用自己搭集群、不用管索引生命周期,控制台上点几下就能创建 index,然后把向量灌进去开始查询。
Pinecone 在 2024 年做了一次很大的架构升级,存储层从原来的分片架构改成了新架构,查询延迟和数据导入速度都有明显提升。我实测过亿级向量场景,p95 延迟稳定在 30 毫秒左右,吞吐量也很能打。它的命名空间(namespace)和元数据过滤功能做得很成熟,配合 RAG 场景非常顺手。
但要提醒一点,Pinecone 的计费模式不便宜。免费版有数量限制,生产环境千万级向量一个月可能烧掉几千美金。如果你的项目还没拿到资源,或者预算紧张,建议先评估其他方案。
- 核心优点:零运维、性能稳定、文档清晰、API 简洁
- 需要注意:闭源托管、成本高、数据出网迁移有成本
- 适合场景:企业级 RAG、生产环境快速上线、团队规模小但不差钱
我在一个用户的智能客服项目里用过 Pinecone,从零到上线只用了一个下午。但到了月底看账单的时候,运营的脸色就不太好看了。追求效率又不在乎钱的话,它确实是最省心的选择。
2.2 Qdrant:Rust 写的高性能选手,过滤能力一流
Qdrant 是这里面技术调性最“硬核”的一个,用 Rust 编写,性能天生有优势。它的特点是把过滤器和向量检索深度融合,这一点在实际项目里简直救命。
举个例子,电商的商品推荐场景,要按价格区间、品牌、库存状态过滤后再做相似检索。Qdrant 对这类多重过滤条件的支持非常自然,而且过滤后依旧能保持稳定的低延迟。这是它在众多纯向量数据库里脱颖而出的一大原因。
另外一个加分项是,Qdrant 可以用 Docker 一行命令本地跑起来,生产环境也能通过 Kubernetes 独立部署,数据完全自己掌控。它提供的 Web UI 虽然不算华丽,但足够做简单的数据检查和 troubleshooting。
- 核心优点:高性能(Rust)、多样化的向量索引类型、过滤能力强、开源可自托管
- 需要注意:默认配置需要手动调优,分布式部署需要多一点运维知识
- 适合场景:电商搜索推荐、权限过滤、高并发低延迟的实时检索
Qdrant 的 HNSW 参数(M、ef_construct、ef_search)都暴露在配置文件里,虽然没有 Milvus 那样开箱即用,但给了你很大的调优空间。我习惯先把 M 调成 48 或 64 来提升召回率,再压缩 ef_search 到 200 左右平衡查询速度,效果还挺不错。
2.3 Milvus:大规模场景的老大哥,分布式基因强
Milvus 是为亿级以上向量检索设计的开源分布式数据库,出身于计算数据社区,后来捐给了 Linux Foundation。它天生就是为大数据量设计的——分片、副本、动态扩缩容、多租户这些能力,在开源数据库里属于第一梯队。
它底层支持多种索引类型,IVF_FLAT、IVF_PQ、HNSW、DISKANN 等都有,可以根据数据规模和硬件配置灵活选择。里面有个很实用的是 DISKANN,把索引放在磁盘上而不是全部放内存,能把成本压下来不少。十亿条向量、几百 GB 的存储,配上几台普通服务器就能跑,这在别的数据库里几乎不敢想。
Milvus 跟主流生态的集成也做得很到位,LangChain、LlamaIndex 都有官方支持,还提供了 Attu 这个可视化工具,可以查看 collection 状态、数据分布、执行查询,排查问题的时候非常直观。
不过 Milvus 的架构相对复杂,依赖 etcd、MinIO、Pulsar(现在或者 Kafka)这些组件,上手门槛高,小项目用起来有点杀鸡用牛刀。但它有两个独立部署形态:Milvus Lite 和 Milvus Standalone,降低了入门门槛。
- 核心优点:大规模场景性能强、索引类型丰富、生态集成完善
- 需要注意:组件多、运维复杂、新手学习曲线陡峭
- 适合场景:亿级向量、企业级知识库、需要水平扩展的大规模生产系统
2.4 Weaviate:语义搜索的瑞士军刀,GraphQL 是亮点
Weaviate 的定位很特别:它不只是矢量数据库,更像一个“AI 原生数据平台”,内置了向量化模块、多模态支持、GraphQL 查询接口。你可以直接把文本、图片丢给它,它会调用预设的模型或外部 API 自动向量化,省掉自己搭 embedding 管线的麻烦。
GraphQL 接口是 Weaviate 的一个强力差异点。查数据的时候可以把向量检索、标量过滤、聚合、关联关系一次搞定,写一个查询请求就能拿到最终结果,不需要反复调 API 自行拼接。这个体验在 RAG 项目里特别舒服,可以非常快速地拿到检索结果并喂给 LLM。
另一个亮点是它的模块化设计。它支持多种 AI 模型(OpenAI、Cohere、Hugging Face),也支持本地向量化模型,方便做私有化部署。多模态的 mixed-breadth search 功能可以一次搜文本、图片、音频,对多媒体项目很有帮助。
当然,也需要注意,Weaviate 功能丰富意味着学习成本不低,GraphQL 对新手来说有额外学习门槛。性能方面,如果只做纯粹的亿级向量检索,它不一定比 Milvus 或 Qdrant 领先。
- 核心优点:内置向量化、GraphQL 接口、多模态支持、模块化架构
- 需要注意:单一做纯向量检索时不够极致、部署调优有一定复杂度
- 适合场景:需要快速构建语义搜索/多模态搜索的团队,RAG 应用适配良好
我自己很喜欢 Weaviate 的一点是,它把“非结构化数据处理”当成了核心目标,而不是只做向量存储。如果你的项目里正好需要图片、文本混合检索,Weaviate 很值得尝试。
2.5 Chroma:轻量嵌入式小钢炮,适合原型快速验证
Chroma 是这些数据库里最轻量的一个,它设计出发点就是“本地优先、开发者友好”。Python 环境中 pip install chromadb 就能跑起来,不需要启动任何服务,直接嵌入到应用进程里。对做原型验证、写 Demo、个人项目的开发者来说,上手体验无可挑剔。
Chroma 的 API 设计非常 Pythonic,CRUD 操作直观得不像一个数据库。它的数据存储支持内存和持久化两种模式,默认配置下是持久化到磁盘的。配合 LangChain 和 LlamaIndex 使用,几十行代码就能搭建一个本地的 RAG demo。我建议所有刚接触矢量数据库的人,都先从 Chroma 起步感受一下工作流程。
但免费的礼物早就标好了价格。Chroma 更适合小规模场景,百万级向量时内存吃紧,性能会明显下降。它的分布式能力、高可用能力基本等于零,运维功能和监控也不完善。生产环境规模稍大就需要换更强的数据库。
- 核心优点:极轻量、上手最快、资源占用小、嵌入模式使用方便
- 需要注意:不支持分布式、查询性能有限、不适合大规模生产场景
- 适合场景:学习验证、Demo 原型、少量数据的本地应用
因为它是嵌入式的,多个线程同时写入时需要特别注意并发控制。我在本地项目里跑过批量导入,发现如果不手动控制批大小,很容易出现内存暴涨。Chroma 真的只适合轻量级玩法。
2.6 FAISS:严格来说它不是数据库,却是很多人的启蒙课
严格来说 FAISS(Facebook AI Similarity Search)不是一个完整的数据库,而是一个高效的向量索引和相似度搜索库。它没有持久化、没有分布式、没有访问控制、没有 API,但它的算法能力极强,很多所谓的“矢量数据库”底层就是拿 FAISS 的索引算法包了一层壳。
理解了 FAISS 的索引类型,就能理解所有矢量数据库的核心逻辑。它提供了 IndexFlatL2(暴力精确搜索)、IndexIVFFlat(倒排索引加速)、IndexHNSWFlat(图索引)等一整套索引方案,还有用于减少内存占用的 PQ(乘积量化)等压缩方式。实际项目中,数据量中等但内存有限时,IVF_PQ 往往是最优解,既能压缩存储,又能保持不错的召回率。
如果你有能力和时间自己封装读写、集群、监控,那用 FAISS 自建一个轻量服务是完全可行的,甚至比用 Milvus 更灵活。但它确实太底层了,大多数团队没必要自己造轮子。
- 核心优点:算法全面、性能优异、资源占用可控(可量化压缩)
- 需要注意:不是完整数据库,需要自己实现持久化、API、分布式
- 适合场景:对索引定制有深入研究的人、算法同学做实验、数据量可控的自建服务
我当年第一次跑通 FAISS 的时候,看着亿级向量在几毫秒内返回相似结果,真的很震撼。但后来发现工程化落地需要太多封装成本,如果团队不是搞算法的,还是直接用 Qdrant 或 Milvus 这种完整方案更靠谱。
2.7 pgvector:给 Postgres 插上向量检索的翅膀
pgvector 不是独立的数据库,它是 PostgreSQL 的一个扩展,在原有关系型能力基础上增加了向量类型和索引支持。正是因为它是扩展,所以它继承了 PostgreSQL 的所有优势:成熟的事务、权限控制、SQL 接口、生态工具链。如果你已经有一套系统跑在 Postgres 上,加个向量检索就不用再引入新组件了。
pgvector 支持精确检索(暴力查询)和近似检索(HNSW 和 IVFFlat)。在数据量小于百万级的时候,它的查询性能表现足够能打,而且配合 SQL 可以做非常复杂的联合查询,比如 JOIN 元数据表、聚合统计、排序分页,这种能力在专用矢量数据库里反而不容易实现。
要注意的是,pgvector 的索引构建需要手动选择合适的类型和参数。比如 ivfflat 的 lists 数量需要根据数据量估算,hnsw 的 m 和 ef_construction 也需要认真调,否则查询速度和召回率都会很难看。数据量超过千万级时,pgvector 的性能会明显吃力。
- 核心优点:无缝融入现有 Postgres 生态、SQL 查询强大、运维统一
- 需要注意:大数据量性能受限、索引参数需要手动调优
- 适合场景:中小规模应用、已有 Postgres 体系的团队、不想引入额外组件
打个比方:pgvector 就像给一辆皮卡加装了一个货斗。如果你本来就在用皮卡,加装很划算;但如果你需要一辆重型卡车去拉矿山,那货斗装的量就远远不够了。很多团队一开始用 pgvector 起步,等向量数据膨胀到千万以上,再迁移到 Qdrant 或 Milvus,这个过渡路径也很常见。
3. 七个矢量数据库横向对比
3.1 核心参数速查表
为了让你一眼看清差别,我先把这七个库的“硬指标”列成一张表:
| 数据库 | 开源/托管 | 核心语言 | 分布式能力 | 索引类型 | 主要适用规模 | 上手难度 | 运维复杂度 |
|---|---|---|---|---|---|---|---|
| Pinecone | 托管 | - | 内置 | HNSW 等 | 亿级 | 低 | 极低 |
| Qdrant | 开源+云 | Rust | 支持 | HNSW、IVF | 千万到亿级 | 低 | 中 |
| Milvus | 开源 | Go/Java 组件 | 强 | HNSW、IVF、DISKANN 等 | 亿级以上 | 高 | 高 |
| Weaviate | 开源+云 | Go | 支持 | HNSW | 千万级 | 中 | 中 |
| Chroma | 开源 | Python | 不支持 | HNSW(近似) | 百万级 | 极低 | 极低 |
| FAISS | 开源 | C++ | 需自研 | 极丰富 | 视封装决定 | 高(需自研) | 高(需自研) |
| pgvector | 开源 | C | 依赖 PG 集群 | HNSW、IVFFlat | 百万级 | 低 | 低 |
这个表只是大致参考,实际性能跟服务器配置、索引调参、数据特征都有关系。
3.2 从几个关键维度再深入聊聊
性能表现:在纯向量检索的极端场景下,Qdrant 和 Milvus 基本是第一梯队。Qdrant 在千万级数据、过滤条件复杂的情况下表现尤其亮眼;Milvus 在亿级规模的稳定性更强。Pinecone 因为是托管,性能经过深度优化,但也要看你的预算和网络延迟。pgvector 在百万级内体验很好,再往上就有些吃力了。
生态与集成:如果要用 LangChain 或 LlamaIndex,Pinecone、Milvus、Qdrant、Weaviate、Chroma 都有官方集成,配置都很简单。Weaviate 和 Pinecone 顺便帮你处理了 embedding,Chroma 和 pgvector 则让你自己控制 embedding 流程。FAISS 没有官方集成,全靠自己写代码。
数据迁移与锁定:自建型(Qdrant、Milvus、Weaviate、Chroma)导出数据一般都有工具或 API 支持,数据自己管控。Pinecone 这种托管型,导出数据虽然不禁止,但要走接口导出大量数据会相对麻烦。做选型前务必考虑数据锁定问题,不要把未来可能的迁移成本忽略掉。
4. 按场景怎么选:直接说结论
4.1 原型验证与本地 Demo
优先选 Chroma,其次 pgvector。Chroma 最轻量,装完就写代码跑通流程,几乎不用配置。如果你想用 SQL 探索数据,pgvector 也很合适,一条 INSERT 语句搞定。这个阶段不用想什么分布式和高性能,快速验证业务逻辑才是第一要务。我初试 RAG 的时候就是这样走过来的,先用 Chroma 跑通全流程,再根据数据量考虑迁移。
4.2 中小规模生产应用(百万级向量以内)
如果你已经有 Postgres 在跑业务,强烈建议先试一下 pgvector。事务、权限、备份全部跟着现有 Postgres 走,一套体系搞定,省心。如果现有系统不依赖 Postgres,或者查询模式以向量为主、关系查询不多,Qdrant 的部署和性能更优,过滤功能也更强。这个量级里 Qdrant 几乎不会让你失望。
4.3 大规模生产应用(千万到亿级)
核心候选就是 Milvus 和 Qdrant。如果你的需求要求分布式水平扩展、数据规模可以到亿级,Milvus 最成熟;如果你的过滤条件特别复杂、高并发低延迟要求极高,Qdrant 更合适。要我说,团队里有懂分布式系统的人,选 Milvus 上限更高;团队偏应用开发、要快速上线,选 Qdrant 更让人放心。
4.4 企业级托管需求、预算充足
Pinecone 无脑选。它把性能、可靠性、运维都打包好了,省下来的时间可以全花在业务开发上。团队人手不够、没有专职运维的时候,Pinecone 值这个价。
5. 实操心得:索引参数、踩坑记录与排查经验
5.1 索引选型:HNSW 还是 IVF
这是最常被问到的问题。我直接用一组对比来回答:
- HNSW:查询快、召回率高、调参相对直观,但内存占用高。适合数据量可控、要求低延迟高精度的场景。M 控制图连接数,默认 16,提高能改善召回率;ef_construction 控制构建时的搜索范围,越高索引质量越好但构建越慢;ef_search 控制查询深度,越高召回率越好但延迟变高。
- IVF:内存占用更低,通过 nlist(倒排桶数量)控制精度和速度的平衡,但查询需要经过两级查找,低延迟场景弱于 HNSW。它更省资源,适合数据量很大但硬件有限的情况。
我的选择建议很简单:优先 HNSW,只有内存压力大的时候才换 IVF_PQ 或 DISKANN。
5.2 相似度度量:余弦、内积或欧氏距离
很多人会只关注“相似度”三个字,却忽略向量检索的度量方式。这三个方案必须跟 embedding 模型匹配:
- 余弦相似度(Cosine):只关心方向不关心模长,是文本 embedding 的默认选择,很多模型都按这个训练。
- 内积(Dot Product):适合向量已归一化的情况,速度通常比余弦略快,本质上是余弦的加速版。
- 欧氏距离(L2):关心绝对距离,适合图像、音频等特征向量的距离对比。
选错度量方式会让召回结果“看起来不太对劲”,但很难排查。建议在构建索引之前,先用一小批数据做几个度量的对比验证,再决定用哪个。
5.3 我踩过的三个典型坑
第一,HNSW 参数照抄文档导致内存爆炸。 最开始用 Qdrant 时,我把 M 调成 64、ef_construct 调成 512,结果 500 万条向量直接吃掉了 40G 内存。后来才发现 M 和内存占用是线性关系,小规模实验没问题,但大规模部署前必须估算内存占用。建议数据量千万级时,M 从 16 起步,ef_construct 控制在 128 以内,压测后逐步上调。
第二,批量导入向量时不控制批次处理,导致进程 OOM。 尤其是 Chroma 和 Qdrant,一次性插入几百万条向量会让内存飙升。后来我把批量写入拆到每条 1000 条左右,并且隔段时间主动清理内存,问题就解决了。还有一个小技巧:大批量导入时先关掉 fsync 或自动刷盘(如果有这个选项),全量导完再开启,构建速度能提升不少。
第三,元数据过滤条件设计不当导致查询大幅变慢。 这是最容易忽略的问题。Qdrant 和 Milvus 的过滤字段最好建立对应的标量索引。一开始我随意给时间戳字段建索引,后来发现过滤耗时比向量检索还长,排查半天才意识到是缺索引。每个库都建议把高频过滤条件对应的字段显式建索引,尤其对于大数据集。
5.4 常规问题排查速查表
如果你在部署或使用中遇到问题,可以先对照这个表格排查:
| 现象 | 可能原因 | 排查思路与解决 |
|---|---|---|
| 查询延迟突然变高 | 索引参数不合理 | 检查 ef_search 是否过大,HNSW 是否构建完整 |
| 召回结果明显不准 | 向量度量方式不匹配 | 回到 embedding 模型,确认数据是否已归一化,更换度量方式再测 |
| 导入数据时进程崩溃 | 内存不足或批次过大 | 拆小批次插入,减小 M、ef_construct,观察内存曲线 |
| 过滤条件查询极慢 | 元数据字段缺索引 | 检查是否为核心过滤字段建立索引,手动建索引后再测 |
| 构建索引耗时太长 | 数据量远大于预期 | 使用 IVF_PQ 替代 HNSW,动态调整构建参数 |
| 多节点部署后数据不一致 | 分片数与副本数配置不当 | 检查分片数和副本数,确保副本数大于 1 且节点数量足够 |
5.5 数据备份与迁移的实操建议
无论选哪个数据库,数据备份都是必修课。自建型数据库(Qdrant、Milvus、Weaviate)建议定期做快照导出。Qdrant 有 snapshot API,Milvus 有 backup 工具,都可以定时把 collection 备份下来。托管型(Pinecone)虽然相对省心,也要定期把向量和元数据导出到对象存储中,防患于未然。
有一个小细节值得提一下:很多团队做重新索引时,会把原向量数据捞出来,重新跑 embedding 再导入新库。这时候要注意 embedding 版本的兼容性——换了 embedding 模型后,新旧向量混在一起会导致检索质量崩坏,不要小看这一点。
6. 最后的建议:没有一步到位的选型
矢量数据库这个领域变化太快了,去年还热推的方案,今年可能因为性能或成本被淘汰。我的切身体会是:不要一开始就追求“一步到位”。 先用轻量的方案把流程跑通,确认业务指标,再根据数据规模和性能瓶颈逐步升级。一个成熟的项目完全可以先走 Chroma 验证 POC,再迁移到 pgvector 撑起初期业务,最后根据增长情况换 Qdrant 或 Milvus。
最后再分享一个自己的小习惯:不论选哪个数据库,我都会先写一个压测脚本,随机生成跟业务数据同分布的数据,测试不同数据量级下的 p95 延迟、召回率、内存占用量。只有数据能替你说话,别听宣传语忽悠。把基础打扎实了,后面的路就顺了。
