人工智能之向量数据库介绍及使用
向量数据库是AI时代的核心基础设施,尤其在RAG(检索增强生成)和多模态AI应用中扮演着“长期记忆”的角色。本文将从核心原理、关键算法、横向对比到三款主流数据库的详细用法,带你系统掌握向量数据库的全貌。
一、为什么需要向量数据库?
传统关系型数据库擅长处理结构化数据(如表格),但面对文本、图像、音频等非结构化数据时束手无策。向量数据库的诞生正是为了解决这一问题。
核心逻辑链条:
- 向量化(Embedding):使用深度学习模型(如BERT、CLIP)将非结构化数据转换为高维浮点数数组(向量)。
- 语义映射:语义相似的实体在向量空间中的位置彼此靠近。
- 相似性搜索:通过计算向量间的距离(如余弦相似度)来检索语义相关的内容。
传统数据库基于精确匹配(如 WHERE name = "张三"),而向量数据库基于近似最近邻(ANN)搜索,能在海量高维数据中实现毫秒级响应。
二、核心技术剖析
1. 向量数据模型
- 本质:多维浮点数数组(如768维或1024维)。
- 元数据:与向量关联的结构化信息(如时间戳、标签、来源),用于检索时过滤。
2. 相似度度量(Similarity Metrics)
| 度量方式 | 特点 | 适用场景 |
|---|---|---|
| 余弦相似度 | 衡量方向夹角,忽略向量长度 | 文本语义搜索(最常用) |
| 欧氏距离(L2) | 衡量空间中的直线距离 | 图像特征、需要关注“大小”的场景 |
| 内积(Dot Product) | 衡量投影长度,关注幅值一致性 | 推荐系统中的协同过滤 |
3. 核心算法:ANN索引
为了不遍历整个数据集,向量数据库使用ANN算法来“投机取巧”地找到最近邻。主流算法对比如下:
| 算法类型 | 代表实现 | 原理 | 优缺点 |
|---|---|---|---|
| HNSW(分层可导航小世界) | Milvus、Qdrant | 构建多层图结构,上层“走高速”跳转,下层“走街串巷”精搜 | 精度极高,查询快,但内存消耗大、构建慢 |
| IVF(倒排文件) | FAISS、Milvus | K-Means聚类分桶,只搜索与查询向量最近的几个桶 | 内存友好,构建快,但精度略低于HNSW |
| PQ(乘积量化) | FAISS | 将高维向量切割,压缩编码,大幅降低内存占用 | 极低内存占用,适合十亿级数据 |
| LSH(局部敏感哈希) | 部分系统 | 哈希函数确保相近向量碰撞到同一个桶 | 速度快,精度中等,适合实时性要求高的场景 |
三、主流向量数据库全景对比
市面上有超过30种向量数据库,选型是决定项目成败的关键一步。
1. 核心选型维度
| 维度 | Milvus | Pinecone | Qdrant | Weaviate | Chroma |
|---|---|---|---|---|---|
| 定位 | 企业级分布式 | 全托管SaaS | 高性能开源 | AI原生+知识图谱 | 轻量级嵌入式 |
| 部署方式 | 自建/K8s/云托管 | 注册即用(云服务) | Docker/自建/云 | Docker/自建/云 | 进程内(Lib)/独立 |
| 运维成本 | 高(需etcd+MinIO+Milvus三件套) | 零(SaaS) | 低(单容器) | 中 | 极低(pip install) |
| 性能与规模 | 亿级,高并发 | 百万-千万级 | 千万级,单机性能炸裂 | 千万级 | 百万级以下 |
| 特色功能 | 多索引支持、存算分离 | Namespace多租户 | Rust编写、复杂Payload过滤 | GraphQL API、混合检索 | LangChain原生集成 |
| 数据合规 | 可私有化部署 | 数据需上传海外服务器 | 可私有化部署 | 可私有化部署 | 完全本地 |
| 典型适用 | 国内大厂、金融政务 | 海外原型验证、不想运维 | 追求性价比的中型项目 | 英文项目、知识图谱 | 个人学习、POC测试 |
2. 选型建议速查表
- 追求性价比,国内部署:Milvus(功能全,生态好)或 Qdrant(部署简单,性能强)。
- 不想运维,快速验证:Pinecone(按月付费买省心)。
- 已有PostgreSQL,向量规模小:PGVector(无需引入新组件)。
- 个人开发者做Demo:Chroma(内存运行,零配置)。
四、三款最常用向量数据库实战用法
环境准备:以下教程均基于Python 3.9+。建议使用虚拟环境隔离依赖。
1. Milvus 实战(企业级部署首选)
Milvus 由 Zilliz 开发,是 Linux 基金会毕业项目,国内生态最完善。
(1)安装与连接
pip install --upgrade pymilvus
使用阿里云Milvus托管服务示例:
from pymilvus import MilvusClient
# 连接实例(替换为你的URI和Token)
client = MilvusClient(
uri="http://c-xxxx.milvus.aliyuncs.com:19530",
token="<yourUsername>:<yourPassword>",
db_name="default"
)
(2)创建 Collection(相当于关系型数据库的“表”)
可以快速创建(仅指定维度)或自定义Schema精细控制。
# 快速创建:自动包含id和vector字段,默认启用动态字段
client.create_collection(
collection_name="demo_collection",
dimension=768
)
# 自定义 Schema:精细控制字段类型和索引
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema(auto_id=False, enable_dynamic_field=True)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="text_vector", datatype=DataType.FLOAT_VECTOR, dim=768)
schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=200)
# 配置索引
index_params = client.prepare_index_params()
index_params.add_index(field_name="text_vector", index_type="HNSW", metric_type="COSINE")
client.create_collection(
collection_name="custom_collection",
schema=schema,
index_params=index_params
)
(3)插入与检索
import random
# 模拟生成向量数据
data = [{
"id": i,
"text_vector": [random.uniform(-1, 1) for _ in range(768)],
"title": f"Document_{i}"
} for i in range(100)]
client.insert(collection_name="demo_collection", data=data)
# 执行向量检索
query_vector = [random.uniform(-1, 1) for _ in range(768)]
results = client.search(
collection_name="demo_collection",
data=[query_vector],
limit=5, # Top 5
output_fields=["title"] # 返回元数据
)
# 带过滤条件的检索(Filter Search)
results = client.search(
collection_name="demo_collection",
data=[query_vector],
filter="id in [1, 2, 3, 4, 5]", # 仅在这些ID中搜索
limit=3
)
print(results)
2. Pinecone 实战(SaaS极速体验)
Pinecone 是全托管的云原生服务,适合不想管理服务器的场景。
(1)安装与环境变量
pip install pinecone langchain-pinecone
import os
from pinecone import Pinecone
# 初始化(API Key 从 app.pinecone.io 获取)
pc = Pinecone(api_key=os.getenv("PINECONE_API_KEY"))
(2)创建索引并插入数据
# 创建索引(如果不存在)
index_name = "quickstart"
if index_name not in pc.list_indexes().names():
pc.create_index(
name=index_name,
dimension=768, # 必须匹配你的嵌入模型维度
metric="cosine"
)
index = pc.Index(index_name)
# 插入数据(向量 + 元数据 Metadata)
vectors = [
{
"id": "vec_1",
"values": [0.1] * 768, # 模拟向量
"metadata": {"category": "AI", "source": "blog"}
},
{
"id": "vec_2",
"values": [0.2] * 768,
"metadata": {"category": "Database", "source": "paper"}
}
]
index.upsert(vectors=vectors)
# 查询
query_results = index.query(
vector=[0.15] * 768,
top_k=3,
include_metadata=True,
filter={"category": "AI"} # 元数据过滤
)
print(query_results)
(3)集成RAG助手
Pinecone 提供了高级 Assistant API,类似 OpenAI Assistants,直接挂载文档进行问答:
assistant = pc.assistant.Assistant(assistant_name="my-rag-bot")
response = assistant.chat_completions(
messages=[{"role": "user", "content": "什么是向量数据库?"}]
)
3. Qdrant 实战(高性能+复杂过滤)
Qdrant 用 Rust 编写,性能优异,支持非常丰富的结构化过滤条件。
(1)本地Docker启动
docker run -p 6333:6333 qdrant/qdrant
(2)Python 操作
pip install qdrant-client
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct, Filter, FieldCondition, Range
import random
# 连接本地服务
client = QdrantClient(host="localhost", port=6333)
# 创建 Collection
client.create_collection(
collection_name="my_books",
vectors_config=VectorParams(size=768, distance=Distance.COSINE)
)
# 插入数据(带复杂Payload)
points = [
PointStruct(
id=i,
vector=[random.uniform(-1, 1) for _ in range(768)],
payload={
"title": f"Book_{i}",
"price": random.randint(20, 100),
"in_stock": True if i % 2 == 0 else False,
"tags": ["fiction", "sci-fi"] if i % 3 == 0 else ["non-fiction"]
}
) for i in range(50)
]
client.upsert(collection_name="my_books", points=points)
# 高级过滤检索:价格在 30-50 之间且 in_stock 为 True
search_result = client.search(
collection_name="my_books",
query_vector=[0.0] * 768, # 示例查询向量
limit=5,
query_filter=Filter(
must=[
FieldCondition(key="in_stock", match={"value": True}),
Range(key="price", gte=30, lte=50)
]
)
)
print(search_result)
五、总结
向量数据库的世界没有“银弹”,选型本质是业务场景、数据规模、运维能力和预算的权衡。
- 搞原型、图省事:上 Pinecone 或 Chroma。
- 跑生产、要控制:先试 Qdrant(简约),再考虑 Milvus(复杂)。
- 混检索、多模态:Weaviate 是潜力股。
无论选哪一款,掌握其索引原理(HNSW vs IVF)和元数据过滤机制,才能在生产环境中真正调优出最佳性能。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)