热闻岛
返回全网热点

什么是向量数据库?有没有做过向量数据库的对比选型?

6月25日34 阅读
什么是向量数据库?有没有做过向量数据库的对比选型?配图
别把向量数据库理解成“存向量的 MySQL” 很多同学第一次做 RAG,会以为向量数据库只是把 embedding 数组塞进一个字段里,然后再像 MySQL 一样查询。这个理解很容易踩坑:普通数据库擅长的是精确匹配,向量数据库擅长的是“语义
什么是向量数据库?有没有做过向量数据库的对比选型?配图

别把向量数据库理解成“存向量的 MySQL”

很多同学第一次做 RAG,会以为向量数据库只是把 embedding 数组塞进一个字段里,然后再像 MySQL 一样查询。这个理解很容易踩坑:普通数据库擅长的是精确匹配,向量数据库擅长的是“语义相似度搜索”。

换句话说,MySQL 问的是“有没有等于这个值的数据”,向量数据库问的是“有没有意思最接近这句话的数据”。二者不是替代关系,而是能力边界不同。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

一、向量数据库到底是什么?

向量数据库是专门用来存储、索引和检索高维向量的数据库。这里的向量通常由 Embedding 模型生成:文本、图片、音频、代码片段都会被转成一串浮点数,这串数字表达的是“语义位置”。

在 RAG 里,向量数据库负责检索环节:用户问题先被转成查询向量,再到向量库里找 Top-K 相似 Chunk,最后把这些 Chunk 塞进 Prompt,让大模型基于证据回答。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

面试里可以先这样回答:

向量数据库是为高维向量相似度搜索设计的数据库,核心能力是 ANN(Approximate Nearest Neighbor,近似最近邻搜索)。它能在海量向量中快速找出语义最相近的 Top-K 结果,是 RAG 检索链路的底层支撑。

普通数据库适合精确匹配,例如 id、状态、时间范围。

向量数据库适合语义相似,例如“退款流程”和“如何退钱”虽然字面不同,但语义接近。

生产级向量库还需要支持 metadata 过滤、混合检索、增量更新、分区、备份、权限和可观测。

二、为什么不能直接暴力算相似度?

如果库里只有几百条数据,暴力遍历完全可以。问题是企业知识库通常会有几十万、几百万甚至上亿个 Chunk。每次查询都把 query vector 和全库向量算一遍余弦相似度,延迟和 CPU 成本都会爆。

这就是 ANN 索引存在的原因:它不保证数学意义上的绝对最优解,而是在召回率可接受的前提下,把检索范围快速缩小到“最可能相关”的候选集。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

三、向量数据库里存的不只是 vector

真正可用的 RAG 系统,向量库里不能只存一个 embedding。它至少要保存五类信息:唯一 ID、向量、原始文本、metadata、索引结构。尤其是 metadata,决定了权限过滤、租户隔离、时间过滤、业务线过滤和可追溯能力。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

id:用于回溯原文、更新、删除、去重。

vector:由 embedding 模型生成,用于相似度检索。

text:返回给 LLM 的真实证据内容。

metadata:来源、部门、产品线、权限、版本、时间、标签。

index:HNSW、IVF、PQ、DiskANN 等加速结构。

四、核心索引算法:HNSW、IVF、PQ 怎么理解?

1. HNSW:多层图导航

HNSW 可以理解成“高速公路 + 城市道路”。它先在高层稀疏图里找到大方向,再逐层下降到底层图里做精细搜索。优点是召回率高、延迟低;缺点是内存占用较大,构建和维护成本更高。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

2. IVF:先分桶,再搜桶

IVF 会先用聚类把向量空间分成多个桶。查询时不再全库遍历,而是先找到最相关的几个桶,只在这些桶里计算相似度。IVF 的好处是内存更友好,适合大规模;代价是参数调不好会丢召回。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

3. PQ:向量压缩

PQ(Product Quantization)解决的是成本问题:向量维度高、数量大时,存储和内存都很贵。PQ 会把一个大向量拆成多个子向量,再用码本近似表示,从而大幅降低内存,但它是有损压缩,通常需要配合 rerank 或 residual 修正。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

索引选型一句话

追求高召回、低延迟、数据量中等:优先 HNSW。

数据量非常大、内存有限:考虑 IVF / IVFPQ / DiskANN。

向量特别多、成本敏感:考虑 PQ/SQ 等量化压缩。

过滤条件很强:不要只看向量索引,还要看 payload/metadata 索引和过滤执行策略。

五、生产级向量数据库必须具备哪些能力?

1. Metadata 过滤

RAG 不是全库乱搜。一个企业知识库里可能有客服文档、研发文档、财务制度、销售话术。用户只能看自己有权限的内容,且通常还要限制产品线、语言、时间和版本。

错误做法是先全库 ANN,再过滤;这样 Top-K 结果可能被过滤掉很多,最后给 LLM 的证据不足。更合理的是把 metadata 过滤融入检索过程,先缩小合法候选集,再做 ANN。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

2. 混合检索

纯向量检索擅长语义泛化,但对专有名词、型号、错误码、英文缩写可能不如关键词检索稳定。所以生产 RAG 通常会做混合召回:向量召回找“语义接近”,BM25/全文检索找“字面命中”,再用 RRF 或 reranker 融合排序。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

3. 实时更新与删除合规

RAG 知识库不是一次性导入后永不变化。文档会新增、修改、下线,权限也会变化。所以向量数据库要支持增量写入、按 ID 删除、metadata 更新、索引后台构建、版本回滚和审计。

特别注意:删除不能只做“业务层隐藏”。对合规敏感场景,还要确认底层索引文件、备份、缓存、快照是否也满足数据删除和保留策略。

六、常见向量数据库怎么选?

选型不要只看 GitHub Star,也不要只看单机 Benchmark。真正要看的是:你的数据量多大、是否需要混合检索、是否需要复杂过滤、是否自托管、是否已有 PostgreSQL、团队有没有运维能力。

什么是向量数据库?有没有做过向量数据库的对比选型?配图什么是向量数据库?有没有做过向量数据库的对比选型?配图

更落地的建议

快速原型:Chroma 上手快,适合 Demo、课程、个人知识库。

中小规模生产:Qdrant 过滤能力和 API 体验好,适合团队快速上线。

大规模分布式:Milvus 索引类型丰富,适合亿级向量和复杂集群,但运维门槛更高。

云托管:Pinecone、Zilliz Cloud、Qdrant Cloud 这类服务可以减少运维,但要评估成本和合规。

已有 PostgreSQL:pgvector 可以降低组件复杂度,适合中小规模和需要 SQL JOIN 的业务。

算法库:FAISS 很强,但它更像底层检索引擎,不是带权限、备份、租户、API 的完整数据库。

七、代码示例:pgvector 怎么做最简单的向量检索?

如果项目已经在 PostgreSQL 上,pgvector 是非常适合入门和中小规模业务的选择。它可以把 embedding 存在业务表里,并和 metadata 一起过滤。

SQL 代码示例

-- 安装 pgvector 扩展

CREATE EXTENSION IF NOT EXISTS vector;

-- 建表:embedding 维度要和模型输出保持一致

CREATE TABLE doc_chunks (

id BIGSERIAL PRIMARY KEY,

doc_id TEXT NOT NULL,

chunk_text TEXT NOT NULL,

department TEXT,

updated_at TIMESTAMP,

embedding vector(1536)

);

-- 建 HNSW 索引,加速向量相似度搜索

CREATE INDEX doc_chunks_embedding_hnsw

ON doc_chunks USING hnsw (embedding vector_cosine_ops);

-- 检索:先按 metadata 过滤,再按向量距离排序

SELECT id, doc_id, chunk_text,

embedding <=> '[0.12, -0.87, 0.34, ...]' AS distance

FROM doc_chunks

WHERE department = '客服'

ORDER BY embedding <=> '[0.12, -0.87, 0.34, ...]'

LIMIT 5;

八、代码示例:Milvus 基础检索流程

如果数据规模更大,或者需要专门的向量数据库能力,可以用 Milvus/Qdrant 这一类系统。下面示例展示的是“写入向量 + metadata + Top-K 搜索”的最小链路。

Python 代码示例

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")

# 创建 collection

client.create_collection(

collection_name="rag_chunks",

dimension=1536,

metric_type="COSINE",

)

# 插入:向量 + 原文 + metadata

client.insert(

collection_name="rag_chunks",

data=[

{

"id": 1,

"vector": [0.12, -0.87, 0.34] + [0.0] * 1533,

"text": "退款规则需要先校验订单状态,再进入审批流程。",

"department": "客服",

"doc_id": "refund_policy_v3"

}

]

)

# 查询:带 metadata 过滤的向量搜索

results = client.search(

collection_name="rag_chunks",

data=[[0.10, -0.80, 0.31] + [0.0] * 1533],

filter='department == "客服"',

limit=5,

output_fields=["text", "doc_id", "department"]

)

for hit in results[0]:

print(hit["distance"], hit["entity"]["text"])

九、生产级架构:别把向量库当成唯一核心

在生产系统里,向量数据库只是检索层的一部分。它前面有数据清洗、切分、embedding、权限和版本管理;它后面有 Query Rewrite、混合召回、rerank、Prompt 组装、答案引用和评测反馈。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

十、上线前必须压测的指标

向量数据库选型不能靠感觉。至少要用自己的业务数据和真实 Query 集压测四类指标:检索质量、性能、成本、运维。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

检索质量:Recall@K、MRR、nDCG、人工标注通过率。

性能:P50/P95/P99 延迟、QPS、索引构建时间、批量写入吞吐。

成本:内存、磁盘、云服务费用、GPU/CPU 成本。

运维:备份恢复、增量更新、删除合规、多租户隔离、监控告警。

十一、常见坑

只用向量检索,不做关键词召回,导致型号、错误码、专有名词命中不稳定。

先 ANN 后过滤,Top-K 被权限过滤掉,最后上下文证据不足。

只看平均延迟,不看 P95/P99,线上一有并发就抖。

只测查询,不测批量导入、增量更新、删除和重建索引。

不存 doc_id、chunk_id、source_url、version,答案无法溯源。

embedding 模型升级后没有重建向量,导致新旧向量空间混在一起。

把 FAISS 当完整数据库使用,却没有权限、持久化、备份、并发写入和审计方案。

十二、面试回答模板

如果面试官问“什么是向量数据库?有没有做过向量数据库选型?”,可以按下面顺序回答。

什么是向量数据库?有没有做过向量数据库的对比选型?配图

总结

向量数据库的本质不是“存向量”,而是“高维语义相似搜索”。它的核心价值是用 ANN 索引把原本不可接受的全库相似度计算,变成可在线服务的 Top-K 检索。

真正落地时,选型不能只看某个工具火不火,而要看数据规模、过滤复杂度、混合检索、更新频率、运维能力、成本和合规。原型阶段可以轻量,生产阶段必须可观测、可追溯、可回滚、可评测。

要点速读

别把向量数据库理解成“存向量的 MySQL” 很多同学第一次做 RAG,会以为向量数据库只是把 embedding 数组

  • 别把向量数据库理解成“存向量的 MySQL” 很多同学第一次做 RAG,会以为向量数据库只是把 embedding 数组
  • 更多细节仍在持续更新中
  • 更多细节仍在持续更新中