为什么需要向量数据库?
向量数据库的核心能力是高效的近似最近邻(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免费套餐即可使用。
大规模生产(千万级以上)
选 Milvus 或 Qdrant。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