向量数据库 2023:从 RAG 到大模型的知识引擎
前言
2023 年,大语言模型(LLM)的爆发催生了一个新的基础设施赛道——向量数据库。从 LlamaIndex 到 LangChain,几乎所有 LLM 应用框架都把向量数据库作为核心组件。GitHub 上向量数据库相关项目在一年内增长了 10 倍以上。那么,向量数据库到底是什么?它解决了什么问题?
什么是向量数据库?
向量(Vector)是什么
在 AI 世界中,任何数据——文本、图片、音频、视频——都可以被 AI 模型转化为一组浮点数,称为向量(embedding)。相似的向量在空间中距离更近:
"猫" → [0.12, 0.34, -0.56, 0.78, ...] # 512 维向量
"狗" → [0.15, 0.31, -0.50, 0.80, ...] # 与猫的向量接近
"汽车" → [0.90, -0.23, 0.45, -0.12, ...] # 与猫的向量很远传统数据库(MySQL、PostgreSQL)用精确匹配或关键字搜索,而向量数据库专门做相似性搜索——“找和这个最像的 N 个”。
与传统数据库的对比
| 维度 | 传统数据库 | 向量数据库 |
|---|---|---|
| 查询方式 | 精确匹配、B-tree 索引 | 近似最近邻(ANN)搜索 |
| 数据类型 | 结构化数据(字符串、数字) | 高维浮点向量(128-4096 维) |
| 索引结构 | B+ 树、哈希 | HNSW、IVF、PQ |
| 核心操作 | SELECT WHERE id = ? | SELECT WHERE vector ≈ ? |
| 典型场景 | 电商订单、用户信息 | 语义搜索、推荐系统 |
为什么 2023 年向量数据库突然火了?
大模型的"知识短板"
ChatGPT 等大模型有一个致命问题:训练数据有截止日期,不知道私有数据。要让它了解你自己的文档库、客服记录或代码库,就需要把数据喂给模型。但:
- 每次问答都把所有文档塞进 Prompt?——Token 数量爆炸,成本太高
- 让模型增量训练?——训练一次几百万美元,不现实
RAG(检索增强生成)架构
解决之道就是 RAG(Retrieval-Augmented Generation):
用户提问 → 向量搜索 → 找到最相关的 N 段文本 → 拼入 Prompt → LLM 回答RAG 把"记忆"外挂到向量数据库上,LLM 只管"理解"和"生成"。这样既省钱,又能随时更新知识。
RAG 是 2023 年最火的 LLM 应用架构,而向量数据库是 RAG 的基石。
主流向量数据库对比
Pinecone(SaaS / 专有)
最早商业化、最成熟的向量数据库。
import pinecone
pinecone.init(api_key="your-key")
index = pinecone.Index("my-index")
# 写入向量
index.upsert([
("id1", [0.1, 0.2, 0.3], {"text": "示例文档"}),
])
# 搜索
results = index.query(
vector=[0.1, 0.2, 0.3],
top_k=5,
include_metadata=True
)- 优点:零运维,开箱即用,性能稳定
- 缺点:专有 SaaS,数据不出云,成本较高
Milvus(开源 / CNCF 项目)
最流行的开源向量数据库,CNCF 毕业项目。
from pymilvus import Collection, connections
connections.connect("default", host="localhost", port="19530")
collection = Collection("my_collection")
# 搜索
results = collection.search(
data=[[0.1, 0.2, 0.3]],
anns_field="vector",
param={"metric_type": "L2", "params": {"ef": 64}},
limit=5,
output_fields=["text"]
)- 优点:功能丰富,支持 GPU 加速,大规模集群
- 缺点:部署运维复杂,小场景有点重
Qdrant(开源 / Rust 编写)
2023 年增长最快的向量数据库之一。
from qdrant_client import QdrantClient
client = QdrantClient(host="localhost", port=6333)
client.upsert(
collection_name="docs",
points=[
{"id": 1, "vector": [0.1, 0.2, 0.3], "payload": {"text": "示例"}}
]
)- 优点:Rust 编写,性能优秀,单二进制部署简单
- 优点:支持过滤 + 向量混合搜索,API 设计优雅
- 缺点:社区规模不如 Milvus
Chroma(轻量级 / 开发者友好)
专为 AI 应用设计的嵌入式向量数据库。
import chromadb
client = chromadb.Client()
collection = client.create_collection("docs")
collection.add(
documents=["这是一篇关于 AI 的文章"],
metadatas=[{"source": "blog"}],
ids=["doc1"]
)
results = collection.query(
query_texts=["机器学习"],
n_results=5
)- 优点:零配置,pip install 即用,完美嵌入 AI Prototype
- 缺点:不适合生产级大规模场景
性能对比总览
| 数据库 | 开源 | 部署方式 | 核心语言 | 适合场景 |
|---|---|---|---|---|
| Pinecone | ❌ | SaaS | — | 生产级、不想运维 |
| Milvus | ✅ | 自建/K8s | Go/C++ | 大规模、企业级 |
| Qdrant | ✅ | 自建/Docker | Rust | 高性能、中大规模 |
| Chroma | ✅ | 嵌入式 | Python | 原型开发、学习 |
| Weaviate | ✅ | 自建/Docker | Go | 自带向量化模块 |
实战:构建一个 RAG 知识库
下面用一个完整的 Python 示例,展示向量数据库在 RAG 中的工作流程:
import os
from openai import OpenAI
import chromadb
# 1. 初始化向量数据库
client = chromadb.Client()
collection = client.create_collection("knowledge_base")
# 2. 准备文档
documents = [
"Go 1.21 引入了 min/max 内置函数和 clear 函数",
"Go 1.21 的 log/slog 标准库提供了结构化日志",
"Go 1.21 新增了 slices 和 maps 两个标准包",
]
# 3. 创建 Embedding(使用 OpenAI 的 text-embedding-ada-002)
openai = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
for i, doc in enumerate(documents):
response = openai.embeddings.create(
model="text-embedding-ada-002",
input=doc
)
embedding = response.data[0].embedding
# 存入向量数据库
collection.add(
embeddings=[embedding],
documents=[doc],
ids=[f"doc_{i}"]
)
# 4. 用户提问
question = "Go 1.21 有什么新特性?"
# 5. 将问题转为向量
q_response = openai.embeddings.create(
model="text-embedding-ada-002",
input=question
)
q_embedding = q_response.data[0].embedding
# 6. 向量数据库中搜索
results = collection.query(
query_embeddings=[q_embedding],
n_results=2
)
# 7. 组装 Prompt
context = "\n".join(results["documents"][0])
prompt = f"""基于以下信息回答问题:
{context}
问题:{question}
"""
# 8. LLM 生成回答
answer = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
print(answer.choices[0].message.content)完整的 RAG 流程就是:文档 → 向量化 → 存储 → 搜索 → 增强 → 生成。
2023 年的趋势与新进展
1. PostgreSQL + pgvector
如果你不想引入额外的数据库,PostgreSQL 的 pgvector 扩展在 2023 年变得非常流行:
-- 安装 pgvector 扩展
CREATE EXTENSION vector;
-- 创建向量列
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536)
);
-- 创建索引(IVFFlat 或 HNSW)
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops);
-- 相似性搜索
SELECT content, 1 - (embedding <=> '[0.1, 0.2, ...]') AS similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5;pgvector 的意义在于:在已有的 PostgreSQL 上零额外运维成本获得向量能力。
2. 混合搜索(Hybrid Search)
Sparse + Dense 向量的混合搜索成为 2023 年热门方向。稀疏向量(如 BM25)擅长关键词精确匹配,稠密向量擅长语义理解,两者结合效果最佳。
关键词搜索(BM25) → 稀疏向量
语义搜索(Embedding) → 稠密向量
↓
加权融合结果
↓
最佳排序输出3. 向量数据库 + AI Agent
2023 年底,向量数据库不只是"知识外挂",还成为 AI Agent 的长期记忆层。Agent 的每次对话、行为、决策向量化后存入数据库,让 Agent 拥有"记忆"。
选型建议
| 场景 | 推荐 | 理由 |
|---|---|---|
| 学习/原型 | Chroma | 零配置,最快上手 |
| 已有 PostgreSQL | pgvector | 无需新基础设施 |
| 中小生产(<1M 向量) | Qdrant | 单二进制部署,性能好 |
| 大规模生产(>10M 向量) | Milvus + K8s | 集群能力,GPU 加速 |
| 不想运维 | Pinecone | SaaS,开箱即用 |
总结
2023 年是向量数据库从"小众技术"走向"基础设施"的一年。它的命运与 LLM 和 RAG 紧密绑定——只要大模型的"知识断层"问题存在,向量数据库就是不可或缺的一环。选型时要根据团队运维能力、数据规模和场景来决定,不必过度追求大规模方案。
| 核心要点 | 说明 |
|---|---|
| 核心价值 | 在百万级向量中毫秒级找到最相似的结果 |
| 爆发原因 | LLM 的"知识短板" + RAG 架构需求 |
| 主流方案 | Pinecone / Milvus / Qdrant / Chroma / pgvector |
| 发展趋势 | 混合搜索、PostgreSQL 集成、AI Agent 记忆层 |