30秒快速回答: 向量数据库不同于传统数据库用精确匹配查询数据,它通过「语义距离」找到最相似的内容。比如你问「苹果最近有什么新产品」,传统数据库只能找到包含这几个字的记录,向量数据库能找到关于「iPhone」「MacBook」等语义相关的内容——即使它们没有出现「苹果」二字。Pinecone、Milvus、Chroma、Weaviate 是 2026 年最主流的向量数据库。
为什么需要向量数据库?
传统数据库擅长精确查询,但在”模糊理解”上很弱:
| 传统数据库(MySQL/PostgreSQL) | 向量数据库(Pinecone/Milvus) |
|---|---|
WHERE title LIKE '%苹果%' |
搜”苹果”也能找到 iPhone/MacBook |
| 精确匹配关键词 | 语义相似度匹配 |
| 适合结构化数据 | 适合非结构化数据(文本/图片/音频) |
| 不能直接支持 AI | 专为 AI 应用设计 |
核心场景
- RAG 问答系统: 在知识库中检索与用户问题最相关的内容
- 语义搜索: 用户输入自然语言,找到意思相近的文档
- 推荐系统: 找到与用户偏好”最相似”的内容
- 图片检索: 用文字描述找最匹配的图片
- 异常检测: 找到与正常模式”最不同”的数据点
向量数据库的工作原理
第一步:文本转向量(Embedding)
文本「北京的秋天很美」
↓ Embedding 模型(如 text-embedding-3-small)
向量 [0.023, -0.451, 0.789, ..., -0.112] # 通常是 768 或 1536 维
Embedding 模型将文本映射到高维空间中的一个点。语义相似的文本在空间中距离更近。
第二步:近似最近邻搜索(ANN)
向量数据库的核心是高效找到”最近的邻居”。对于百万级向量,精确搜索太慢,所以使用近似算法:
| 算法 | 速度 | 精度 | 代表实现 |
|---|---|---|---|
| HNSW | 极快 | 高 (>95%) | Milvus、Weaviate |
| IVF | 快 | 中高 | Faiss |
| PQ(乘积量化) | 最快 | 中 | Faiss |
| 暴力搜索 | 慢 | 100% | 小规模场景 |
完整流程
┌─────────────────────────────────────────────┐
│ 离线索引阶段 │
│ │
│ 文档/图片/数据 │
│ ↓ Embedding 模型 │
│ 向量数组 │
│ ↓ 存入向量数据库 + 原始数据关联 │
│ 索引文件 + 元数据 │
└─────────────────────────────────────────────┘
┌─────────────────────────────────────────────┐
│ 在线查询阶段 │
│ │
│ 用户问题 │
│ ↓ Embedding 模型(同一个) │
│ 查询向量 │
│ ↓ ANN 搜索(取 Top-K) │
│ 最相似的 K 个向量 │
│ ↓ 返回对应的原始文本/图片/数据 │
│ 最终结果 │
└─────────────────────────────────────────────┘
实战:用 Chroma 搭建本地向量搜索
# 安装: pip install chromadb sentence-transformers
import chromadb
from sentence_transformers import SentenceTransformer
# 1. 初始化
client = chromadb.PersistentClient(path="./my_knowledge_base")
embedder = SentenceTransformer("shibing624/text2vec-base-chinese")
# 2. 创建集合
collection = client.get_or_create_collection(
name="company_docs",
metadata={"description": "公司内部文档知识库"}
)
# 3. 添加文档
documents = [
"2026年Q3营收目标为5000万元,同比增长30%。",
"公司年假政策:入职满1年享有5天,满3年享有10天。",
"弹性工作制:核心工作时间10:00-16:00,其余时间自由安排。",
"健康保险覆盖员工及其直系亲属,入职当日生效。",
"绩效奖金每季度发放,与个人OKR完成度挂钩。",
]
# 生成向量并批量插入
embeddings = embedder.encode(documents).tolist()
collection.add(
documents=documents,
embeddings=embeddings,
ids=[f"doc_{i}" for i in range(len(documents))]
)
# 4. 语义搜索
query = "放假能休几天?"
query_embedding = embedder.encode([query]).tolist()
results = collection.query(
query_embeddings=query_embedding,
n_results=2 # 返回 Top-2
)
print("用户问题:", query)
print("最相关结果:")
for doc, score in zip(results["documents"][0], results["distances"][0]):
print(f" [{score:.2f}] {doc}")
# 输出:
# 用户问题: 放假能休几天?
# 最相关结果:
# [0.32] 公司年假政策:入职满1年享有5天,满3年享有10天。
# [0.45] 弹性工作制:核心工作时间10:00-16:00,其余时间自由安排。
注意:向量数据库找到的是”年假政策”而不是”放假”——这就是语义搜索的力量。
2026 年主流向量数据库对比
| 产品 | 类型 | 特点 | 适合场景 |
|---|---|---|---|
| Pinecone | 云托管 | 零运维、毫秒级延迟、Serverless | 生产环境、不想管基础设施 |
| Milvus | 开源 | 十亿级向量、分布式架构 | 超大规模、自建集群 |
| Chroma | 开源 | 轻量级、Python-native、本地运行 | 开发原型、小项目 |
| Weaviate | 开源 | GraphQL 接口、混合搜索 | 需要向量+关键词混合搜索 |
| Qdrant | 开源 | Rust 编写、高性能 | 性能敏感场景 |
| pgvector | PostgreSQL 扩展 | 无需额外数据库 | 已有 PostgreSQL 的项目 |
| Elasticsearch | 全文搜索+向量 | 混合搜索(BM25+向量) | 企业搜索平台 |
选择建议
个人学习 / 原型开发 → Chroma(最简单)
小团队 / 创业公司 → Pinecone Serverless(省心)
企业自建 / 敏感数据 → Milvus(可控性强)
已有 PostgreSQL → pgvector(零额外成本)
需要关键词+语义混合 → Elasticsearch 或 Weaviate
常见问题
Q: 向量数据库和传统数据库能一起用吗?
当然。实际项目中通常是——PostgreSQL 存业务数据 + 向量数据库(或 pgvector)存向量。查询时先搜向量找到 ID,再回 PostgreSQL 取完整数据。
Q: 向量数据库需要多少数据才能有效果?
即使只有 100 条文档,向量数据库也比关键词搜索更准确。但数据量越大,优势越明显——当数据量达到数万条时,关键词搜索几乎不可用,向量搜索依然精准。
Q: Embedding 模型怎么选?
中文场景推荐:text2vec-base-chinese(本地免费)、text-embedding-3-small(OpenAI,付费但效果好)、bge-large-zh(开源中文最优之一)。英文场景:text-embedding-3-small 或 all-MiniLM-L6-v2(免费)。
下一步建议: 用 Chroma 搭一个你自己的本地知识库搜索系统,体验从”关键词搜不到”到”语义秒找”的飞跃。