📖 定义
向量数据库(Vector Database)是一种专门用于存储、管理和检索高维向量数据的数据库系统。它不同于传统关系型数据库,其核心能力是近似最近邻搜索(ANN)——在海量向量中快速找到与查询向量最相似的向量。
一句话理解:传统数据库存的是表格数据,向量数据库存的是"语义",通过相似度来查找相关内容。
⚙️ 工作原理
🔢 向量化
文本/图片 → Embedding模型 → 高维向量
"猫" → [0.12, -0.45, 0.89, ...] (768维)
📦 存储
向量 + 元数据 → 向量数据库
支持百万~十亿级向量存储
🔍 检索
计算向量相似度 → 返回最相似结果
余弦相似度、欧氏距离等
📊 相似度计算方法
余弦相似度 (Cosine Similarity)
衡量两个向量方向的夹角,适合语义相似度
cos(θ) = (A·B) / (|A|×|B|)
🔥 最常用,范围[-1,1],值越大越相似
欧氏距离 (Euclidean Distance)
空间中两点的直线距离
d = √(Σ(Ai - Bi)²)
适合稠密向量空间
点积 (Dot Product)
简单高效的相似度度量
A·B = Σ(Ai × Bi)
计算更快,适合归一化向量
🚀 主流向量数据库对比
| 数据库 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| Chroma | 嵌入式 | 轻量、易用、本地优先 | 原型开发、小型项目 |
| Pinecone | 托管 | 全托管、高可用、即开即用 | 企业级生产环境 |
| Milvus | 开源 | 分布式、高性能 | 大规模部署 |
| Weaviate | 开源 | 支持混合搜索、GraphQL | 复杂查询场景 |
| Qdrant | 开源 | Rust编写、高性能 | 高性能需求 |
| pgvector | 扩展 | PostgreSQL扩展 | 已有PostgreSQL环境 |
💻 代码示例
使用 Chroma (最简实现)
import chromadb
from chromadb.utils import embedding_functions
# 1. 创建客户端
client = chromadb.Client()
# 2. 创建集合 (类似数据库表)
collection = client.create_collection(
name="my_documents",
embedding_function=embedding_functions.DefaultEmbeddingFunction()
)
# 3. 添加文档
collection.add(
documents=[
"这是关于机器学习的文档",
"这是关于深度学习的文档",
"这是关于数据库的文档"
],
metadatas=[
{"category": "AI"},
{"category": "AI"},
{"category": "Database"}
],
ids=["doc1", "doc2", "doc3"]
)
# 4. 查询
results = collection.query(
query_texts=["神经网络"],
n_results=2
)
print(results)
# {'documents': [['这是关于深度学习的文档', '这是关于机器学习的文档']], ...}
使用 Pinecone (云服务)
import pinecone
from sentence_transformers import SentenceTransformer
# 初始化
pinecone.init(api_key="YOUR_API_KEY", environment="us-west1-gcp")
# 创建索引
index_name = "my-index"
if index_name not in pinecone.list_indexes():
pinecone.create_index(
name=index_name,
dimension=768, # 向量维度
metric="cosine"
)
# 连接索引
index = pinecone.Index(index_name)
# 加载嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 准备数据
texts = ["人工智能正在改变世界", "机器学习是AI的子集"]
embeddings = model.encode(texts).tolist()
# 插入数据
vectors = [
("id1", embeddings[0], {"category": "AI"}),
("id2", embeddings[1], {"category": "ML"})
]
index.upsert(vectors=vectors)
# 查询
query_embedding = model.encode(["AI技术"]).tolist()
results = index.query(
vector=query_embedding,
top_k=2,
include_metadata=True
)
print(results)
使用 pgvector (PostgreSQL扩展)
-- 启用扩展
CREATE EXTENSION IF NOT EXISTS vector;
-- 创建表
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(768)
);
-- 创建索引
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops);
-- 插入数据
INSERT INTO documents (content, embedding)
VALUES ('AI文档内容', '[0.1, 0.2, 0.3, ...]');
-- 相似度搜索
SELECT id, content,
1 - (embedding <=> '[0.1, 0.2, 0.3, ...]') AS similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, 0.3, ...]'
LIMIT 5;
🎯 应用场景
🔍 语义搜索
理解搜索意图,返回语义相关结果,而非关键词匹配
💬 推荐系统
基于用户兴趣向量,推荐相似内容或商品
🖼️ 以图搜图
上传图片,查找视觉上相似的图片
🤖 RAG应用
存储知识库文档,支撑大模型问答
🔐 去重检测
检测相似或重复的内容、商品、专利等
⚠️ 性能优化技巧
- 分区过滤:使用metadata先缩小搜索范围,再执行向量搜索
- 索引选择:小数据集用精确搜索,大数据集用近似索引(IVF、HNSW)
- 批量操作:批量插入和查询可大幅提升吞吐量
- 量化压缩:使用量化技术减少存储,牺牲部分精度换取性能
- 混合搜索:结合关键词搜索(BM25)和向量搜索提升准确性