为什么需要向量数据库?

向量数据库的核心能力是高效的近似最近邻(ANN)搜索。普通数据库能精确匹配关键词,但无法计算语义相似性。当你的知识库有几万甚至几千万条向量时,暴力遍历计算相似度太慢,需要专门的索引结构(HNSW、IVF等)来加速。

主流向量数据库对比

数据库 类型 规模上限 易用性 云托管 适用场景
Chroma 开源/嵌入式 中小规模(<100万) ⭐⭐⭐⭐⭐ 有云版 原型开发、个人项目
FAISS 开源库 大规模(亿级) ⭐⭐⭐ 离线批量检索、研究
pgvector PostgreSQL扩展 中等(<1000万) ⭐⭐⭐⭐ Supabase/Neon 已有PG基础设施的项目
Milvus 开源分布式 超大规模(百亿级) ⭐⭐⭐ Zilliz Cloud 企业级大规模生产
Weaviate 开源/云原生 大规模 ⭐⭐⭐⭐ Weaviate Cloud GraphQL接口,多模态
Qdrant 开源/Rust 大规模 ⭐⭐⭐⭐ Qdrant Cloud 高性能、过滤检索

如何选择?

小项目 / 原型阶段

Chroma。本地零配置启动,Python原生API,与LangChain/LlamaIndex深度集成。不需要Docker,不需要服务器,5行代码搞定。

已有PostgreSQL的项目

pgvector。在现有PG数据库中加一个扩展,向量和业务数据在同一个数据库中,事务一致性天然保证,运维成本最低。Supabase免费套餐即可使用。

大规模生产(千万级以上)

MilvusQdrant。Milvus支持分布式部署,Qdrant用Rust实现,性能和稳定性都很好,都有完善的云托管方案。

Chroma快速上手代码

pip install chromadb
import chromadb
from chromadb.utils import embedding_functions

# 本地持久化存储
client = chromadb.PersistentClient(path="./chroma_db")

# 使用OpenAI Embedding(需要OPENAI_API_KEY)
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
    api_key="your-api-key",
    model_name="text-embedding-3-small"
)

# 创建集合
collection = client.get_or_create_collection(
    name="knowledge_base",
    embedding_function=openai_ef
)

# 添加文档(自动计算embedding)
collection.add(
    ids=["doc1", "doc2", "doc3"],
    documents=[
        "Hermes Agent是AI助手框架",
        "RAG通过检索增强生成质量",
        "向量数据库存储高维向量"
    ],
    metadatas=[
        {"source": "intro.md", "page": 1},
        {"source": "rag.md", "page": 5},
        {"source": "db.md", "page": 2}
    ]
)

# 查询
results = collection.query(
    query_texts=["什么是AI助手?"],
    n_results=2,
    include=["documents", "metadatas", "distances"]
)
print(results["documents"][0])
print(results["distances"][0])

pgvector快速上手代码

# 安装pgvector扩展(PostgreSQL中执行)
# CREATE EXTENSION vector;
import psycopg2
import numpy as np
from openai import OpenAI

client = OpenAI()

def get_embedding(text):
    resp = client.embeddings.create(
        model="text-embedding-3-small",
        input=text
    )
    return resp.data[0].embedding

# 连接数据库
conn = psycopg2.connect("postgresql://user:pass@localhost/mydb")
cur = conn.cursor()

# 创建表(1536维向量)
cur.execute("""
    CREATE TABLE IF NOT EXISTS documents (
        id SERIAL PRIMARY KEY,
        content TEXT,
        source TEXT,
        embedding vector(1536)
    )
""")

# 创建HNSW索引(检索加速)
cur.execute("""
    CREATE INDEX IF NOT EXISTS doc_embedding_idx
    ON documents USING hnsw (embedding vector_cosine_ops)
""")

# 插入文档
text = "RAG技术通过检索增强模型回答质量"
embedding = get_embedding(text)
cur.execute(
    "INSERT INTO documents (content, source, embedding) VALUES (%s, %s, %s)",
    (text, "rag.md", embedding)
)
conn.commit()

# 语义检索
query_vec = get_embedding("如何提高AI回答质量?")
cur.execute("""
    SELECT content, source, 1 - (embedding <=> %s::vector) AS similarity
    FROM documents
    ORDER BY embedding <=> %s::vector
    LIMIT 5
""", (query_vec, query_vec))

for row in cur.fetchall():
    print(f"相似度: {row[2]:.3f} | 内容: {row[0]}")

选型决策树

文档量 < 10万,快速原型?
    └─ YES → Chroma(本地)
已有 PostgreSQL 基础设施?
    └─ YES → pgvector + Supabase
需要大规模(百万+)& 生产级?
    └─ Milvus 或 Qdrant
需要GraphQL / 多模态?
    └─ Weaviate
纯离线批量研究?
    └─ FAISS