Vector Database 向量数据库

AI时代的数据存储与检索基础设施

基础设施 RAG必备 数据库

📖 定义

向量数据库(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)和向量搜索提升准确性