前言
随着大语言模型(LLM)的快速发展,RAG(检索增强生成)技术成为解决模型"幻觉"、提升专业领域回答精度的核心方案,而向量数据库则是RAG技术的底层支撑。向量数据库专门用于存储、管理和检索高维嵌入向量(Embedding),通过高效的相似度匹配算法,快速从海量数据中找到与查询向量最相关的结果。
一、主流向量数据库
1. FAISS(Facebook AI Similarity Search)
核心介绍
FAISS是由Meta(原Facebook)AI团队开源的轻量级向量检索库,并非严格意义上的"完整数据库",而是专注于高维向量的高效相似度检索的核心算法库。它的设计初衷是实现"极致的检索性能",支持亿级高维向量的快速比对,占用资源少、部署简单,是入门向量检索、原型验证的首选。
核心特性:
- 支持多种相似度计算方式(L2欧式距离、余弦相似度、内积等)。
- 提供多种索引类型,从简单的暴力检索(IndexFlatL2)到高效的近似最近邻检索(IVF、HNSW等)。
- 仅存储向量数据,不支持原始文本、元数据存储,需手动维护向量与原始数据的映射关系。
- 支持CPU/GPU加速,GPU版本可大幅提升大规模向量的检索效率。
- 无独立服务,嵌入式运行,无需部署额外进程。
官方链接:
- GitHub仓库:https://github.com/facebookresearch/faiss
- 官方文档:https://faiss.ai/
基本使用代码(Python)
python
# 安装依赖:pip install faiss-cpu sentence-transformers numpy
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 1. 初始化向量化模型(生成384维向量)
embedding_model = SentenceTransformer('shibing624/text2vec-base-chinese')
# 2. 准备原始数据(需手动维护与向量的映射关系)
original_sentences = [
"驾驶汽车需要考取合法驾照",
"这是一篮新鲜的苹果和香蕉",
"数学课本里有很多复杂的公式",
"小白加小白等于小白兔(two)"
]
# 3. 原始文本转换为高维向量
sentence_embeddings = embedding_model.encode(original_sentences)
vector_dim = sentence_embeddings.shape[1] # 获取向量维度(384)
# 4. 初始化FAISS索引(使用内积计算,适配中文语义相似度)
faiss_index = faiss.IndexFlatIP(vector_dim)
# 5. 向量格式转换(FAISS仅支持float32类型)
vector_data = np.array(sentence_embeddings).astype('float32')
# 6. 插入向量到FAISS索引
faiss_index.add(vector_data)
print(f"成功插入 {faiss_index.ntotal} 条向量数据")
# 7. 检索相似向量
query_sentence = "我买了一辆新车,需要考驾照"
# 7.1 查询文本向量化
query_embedding = embedding_model.encode([query_sentence])
query_embedding = query_embedding / np.linalg.norm(query_embedding, axis=1, keepdims=True) # 归一化
query_embedding = np.array(query_embedding).astype('float32')
# 7.2 相似度检索(返回最相似的3条结果)
k = 3
distances, indices = faiss_index.search(query_embedding, k)
# 8. 手动关联原始数据(FAISS仅返回索引,需手动映射)
print("\n=== 检索结果 ===")
for i in range(k):
vec_index = indices[0][i]
similarity_score = distances[0][i]
corresponding_sentence = original_sentences[vec_index]
print(f"第 {i+1} 条:{corresponding_sentence}")
print(f"相似度得分:{similarity_score:.4f}\n")
2. Chroma
核心介绍
Chroma是一款开源轻量级企业级向量数据库,专为RAG场景设计,主打"开箱即用、零配置快速启动"。它解决了FAISS不存储原始数据的痛点,支持自动存储「向量+原始文本+元数据」,无需手动维护映射关系,同时提供简单直观的API,是中小项目、生产环境快速落地RAG的优选。
核心特性:
- 支持本地嵌入式运行(无需部署独立服务)和客户端/服务端运行(支持多节点协作)。
- 自动完成文本向量化(内置多种嵌入模型,也可自定义第三方模型)。
- 支持元数据存储与过滤检索(如按分类、标签筛选结果)。
- 无需手动管理向量索引,自动优化检索性能。
- 支持数据的增、删、改、查,提供完整的数据生命周期管理。
- 开源免费,无商业授权限制,易于二次开发。
官方链接:
- GitHub仓库:https://github.com/chroma-core/chroma
- 官方文档:https://docs.trychroma.com/
- 官方网站:https://www.trychroma.com/
基本使用代码(Python)
python
# 安装依赖:pip install chromadb sentence-transformers
import chromadb
from chromadb.utils.embedding_functions import SentenceTransformerEmbeddingFunction
# 1. 初始化Chroma客户端(本地嵌入式运行,无需部署)
chroma_client = chromadb.Client()
# 2. 初始化自定义向量化函数(中文专用)
embedding_function = SentenceTransformerEmbeddingFunction(
model_name="shibing624/text2vec-base-chinese"
)
# 3. 创建集合(类似数据库中的表,用于分类存储数据)
if chroma_client.list_collections():
chroma_client.delete_collection("daily_text_collection")
collection = chroma_client.create_collection(
name="daily_text_collection",
embedding_function=embedding_function,
metadata={"description": "存储日常场景文本数据"}
)
# 4. 准备数据(原始文本+唯一ID+元数据)
documents = [
"驾驶汽车需要考取合法驾照",
"这是一篮新鲜的苹果和香蕉",
"数学课本里有很多复杂的公式",
"小白加小白等于小白兔(two)"
]
ids = [f"id_{i}" for i in range(len(documents))]
metadatas = [
{"category": "生活", "type": "驾驶"},
{"category": "生活", "type": "食品"},
{"category": "学习", "type": "书籍"},
{"category": "娱乐", "type": "冷笑话"}
]
# 5. 插入数据到Chroma集合(自动完成向量化+存储)
collection.add(
documents=documents,
ids=ids,
metadatas=metadatas
)
print(f"成功插入 {collection.count()} 条数据")
# 6. 相似度检索(支持元数据过滤,可选)
query_sentence = "我买了一辆新车,需要考驾照"
results = collection.query(
query_texts=[query_sentence],
n_results=3, # 返回最相似的3条
where={"category": "生活"} # 元数据过滤,仅返回生活类数据
)
# 7. 格式化打印结果
print("\n=== 检索结果 ===")
for i in range(3):
document = results["documents"][0][i]
metadata = results["metadatas"][0][i]
distance = results["distances"][0][i]
print(f"第 {i+1} 条:{document}")
print(f"元数据:{metadata}")
print(f"相似度距离(越小越相似):{distance:.4f}\n")
3. Milvus
核心介绍
Milvus是一款开源分布式云原生向量数据库,专为大规模向量检索场景设计,由Zilliz团队开源并维护。它具备企业级的高可用、高可扩展性和高性能,支持十亿级、百亿级向量的高效检索,是中大型生产环境、分布式部署场景的首选向量数据库。
核心特性:
- 支持分布式部署,可横向扩容,满足大规模数据存储与检索需求。
- 提供丰富的索引类型(IVF_FLAT、HNSW、DISKANN等),平衡检索速度与精度。
- 支持完整的ACID特性,提供数据备份、恢复、容灾等企业级运维功能。
- 支持「向量+结构化数据+元数据」存储,支持复杂条件过滤与联合检索。
- 提供多语言客户端(Python、Java、Go等),支持Restful API调用。
- 支持云原生部署(K8s),与主流云服务平台兼容。
- 分为开源社区版(免费)和商业企业版(付费,提供高级运维与技术支持)。
官方链接:
- GitHub仓库:https://github.com/milvus-io/milvus
- 官方文档:https://milvus.io/docs/overview.md
- 官方网站:https://milvus.io/
基本使用代码(Python,需先部署Milvus服务)
python
# 安装依赖:pip install pymilvus sentence-transformers numpy
from pymilvus import MilvusClient, DataType
from sentence_transformers import SentenceTransformer
import numpy as np
# 1. 初始化向量化模型
embedding_model = SentenceTransformer('shibing624/text2vec-base-chinese')
# 2. 连接Milvus服务(本地部署默认地址:http://localhost:19530)
milvus_client = MilvusClient("http://localhost:19530")
# 3. 定义集合架构(若不存在则创建)
collection_name = "daily_text_collection"
if milvus_client.has_collection(collection_name):
milvus_client.drop_collection(collection_name)
milvus_client.create_collection(
collection_name=collection_name,
schema={
"fields": [
{"name": "id", "type": DataType.INT64, "is_primary": True, "auto_id": False},
{"name": "text", "type": DataType.VARCHAR, "max_length": 512},
{"name": "embedding", "type": DataType.FLOAT_VECTOR, "dim": 768}, # 向量维度与模型匹配
{"name": "category", "type": DataType.VARCHAR, "max_length": 64}
]
},
index_params={
"field_name": "embedding",
"index_type": "HNSW", # 高效近似最近邻索引
"metric_type": "COSINE", # 余弦相似度
"params": {"M": 16, "efConstruction": 64}
}
)
# 4. 准备数据并向量化
documents = [
"驾驶汽车需要考取合法驾照",
"这是一篮新鲜的苹果和香蕉",
"数学课本里有很多复杂的公式",
"小白加小白等于小白兔(two)"
]
categories = ["生活", "生活", "学习", "娱乐"]
data = []
for i in range(len(documents)):
text = documents[i]
embedding = embedding_model.encode(text).astype(np.float32).tolist()
data.append({
"id": i,
"text": text,
"embedding": embedding,
"category": categories[i]
})
# 5. 插入数据到Milvus
milvus_client.insert(collection_name=collection_name, data=data)
print(f"成功插入 {len(data)} 条数据")
# 6. 相似度检索
query_sentence = "我买了一辆新车,需要考驾照"
query_embedding = embedding_model.encode(query_sentence).astype(np.float32).tolist()
results = milvus_client.search(
collection_name=collection_name,
data=[query_embedding],
limit=3,
filter="category = '生活'", # 元数据过滤
output_fields=["text", "category"]
)
# 7. 格式化打印结果
print("\n=== 检索结果 ===")
for i, result in enumerate(results[0]):
text = result["entity"]["text"]
category = result["entity"]["category"]
similarity_score = 1 - result["distance"] # 余弦距离转换为相似度
print(f"第 {i+1} 条:{text}")
print(f"分类:{category}")
print(f"相似度得分:{similarity_score:.4f}\n")
4. Pinecone
核心介绍
Pinecone是一款商用托管式向量数据库,无需本地部署,开箱即用,专为生产环境的大规模向量检索场景设计。它提供全托管的运维服务,用户无需关注底层架构、扩容、容错等问题,只需通过API调用即可实现向量的存储与检索,是快速落地大规模RAG场景、无需自建运维团队的优选。
核心特性:
- 全托管服务,无需部署、无需运维,按需付费。
- 支持亿级向量的高效检索,提供低延迟、高吞吐量的服务。
- 支持多种相似度计算方式,自动优化索引性能。
- 支持元数据存储与过滤,支持复杂查询条件。
- 提供多语言客户端,与主流LLM、RAG框架无缝集成。
- 具备企业级的安全性、合规性和数据备份功能。
- 免费额度有限,超出后按存储量、查询量付费。
官方链接:
基本使用代码(Python,需先获取Pinecone API Key)
python
# 安装依赖:pip install pinecone-client sentence-transformers
import pinecone
from sentence_transformers import SentenceTransformer
from dotenv import load_dotenv
import os
# 1. 加载环境变量(Pinecone API Key)
load_dotenv()
PINECONE_API_KEY = os.getenv("PINECONE_API_KEY")
PINECONE_ENV = os.getenv("PINECONE_ENV")
# 2. 初始化向量化模型
embedding_model = SentenceTransformer('shibing624/text2vec-base-chinese')
# 3. 初始化Pinecone客户端
pinecone.init(
api_key=PINECONE_API_KEY,
environment=PINECONE_ENV
)
# 4. 创建索引(若不存在则创建)
index_name = "daily-text-index"
if index_name not in pinecone.list_indexes():
pinecone.create_index(
name=index_name,
dimension=768, # 向量维度与模型匹配
metric="cosine", # 余弦相似度
pods=1,
pod_type="p1.x1"
)
# 5. 连接索引
index = pinecone.Index(index_name)
# 6. 准备数据并向量化
documents = [
"驾驶汽车需要考取合法驾照",
"这是一篮新鲜的苹果和香蕉",
"数学课本里有很多复杂的公式",
"小白加小白等于小白兔(two)"
]
metadatas = [
{"category": "生活", "type": "驾驶"},
{"category": "生活", "type": "食品"},
{"category": "学习", "type": "书籍"},
{"category": "娱乐", "type": "冷笑话"}
]
vectors = []
for i in range(len(documents)):
text = documents[i]
embedding = embedding_model.encode(text).tolist()
vector_id = f"id_{i}"
vectors.append((vector_id, embedding, metadatas[i]))
# 7. 插入数据到Pinecone
index.upsert(vectors=vectors)
print(f"成功插入 {index.describe_index_stats()['total_vector_count']} 条向量数据")
# 8. 相似度检索
query_sentence = "我买了一辆新车,需要考驾照"
query_embedding = embedding_model.encode(query_sentence).tolist()
results = index.query(
vector=query_embedding,
top_k=3,
include_metadata=True,
filter={"category": "生活"}
)
# 9. 格式化打印结果
print("\n=== 检索结果 ===")
for i, match in enumerate(results["matches"]):
vector_id = match["id"]
metadata = match["metadata"]
similarity_score = match["score"]
print(f"第 {i+1} 条:ID={vector_id}")
print(f"元数据:{metadata}")
print(f"相似度得分:{similarity_score:.4f}\n")
# 10. 删除索引(可选,避免占用免费额度)
pinecone.delete_index(index_name)
5. Weaviate
核心介绍
Weaviate是一款开源分布式向量数据库,同时提供商用托管服务,主打"语义搜索与知识图谱结合"。它不仅支持向量检索,还具备结构化数据查询、知识图谱构建的能力,支持自然语言直接查询,非常适合需要融合语义检索与结构化数据查询的复杂场景。
核心特性:
- 支持开源自托管与商用托管两种部署方式。
- 内置自然语言处理能力,支持直接用自然语言查询数据。
- 支持「向量+结构化数据+知识图谱」融合存储与查询。
- 提供丰富的索引类型与相似度计算方式,支持高效近似最近邻检索。
- 支持多语言客户端,与主流LLM、RAG框架无缝集成。
- 具备企业级的高可用、可扩展性与安全性。
官方链接:
- GitHub仓库:https://github.com/weaviate/weaviate
- 官方文档:https://weaviate.io/developers/weaviate
- 官方网站:https://weaviate.io/
基本使用代码(Python,本地自托管)
python
# 安装依赖:pip install weaviate-client sentence-transformers
import weaviate
from sentence_transformers import SentenceTransformer
import json
# 1. 初始化向量化模型
embedding_model = SentenceTransformer('shibing624/text2vec-base-chinese')
# 2. 连接Weaviate服务(本地部署默认地址:http://localhost:8080)
client = weaviate.Client("http://localhost:8080")
# 3. 删除已有类(类似集合),避免冲突
if client.schema.exists("DailyText"):
client.schema.delete_class("DailyText")
# 4. 定义类架构
class_schema = {
"class": "DailyText",
"description": "日常场景文本数据",
"properties": [
{
"name": "text",
"dataType": ["string"],
"description": "原始文本内容"
},
{
"name": "category",
"dataType": ["string"],
"description": "文本分类"
}
],
"vectorizer": "none" # 手动提供向量,不使用Weaviate内置向量izer
}
client.schema.create_class(class_schema)
# 5. 准备数据并插入
documents = [
"驾驶汽车需要考取合法驾照",
"这是一篮新鲜的苹果和香蕉",
"数学课本里有很多复杂的公式",
"小白加小白等于小白兔(two)"
]
categories = ["生活", "生活", "学习", "娱乐"]
with client.batch as batch:
batch.batch_size = 4
for i in range(len(documents)):
text = documents[i]
category = categories[i]
embedding = embedding_model.encode(text).tolist()
data_object = {
"text": text,
"category": category
}
batch.add_data_object(
data_object=data_object,
class_name="DailyText",
vector=embedding
)
print("成功插入数据")
# 6. 相似度检索
query_sentence = "我买了一辆新车,需要考驾照"
query_embedding = embedding_model.encode(query_sentence).tolist()
results = client.query.get(
"DailyText",
["text", "category"]
).with_near_vector({
"vector": query_embedding,
"certainty": 0.5 # 相似度阈值
}).with_limit(3).with_where({
"path": ["category"],
"operator": "Equal",
"valueText": "生活"
}).do()
# 7. 格式化打印结果
print("\n=== 检索结果 ===")
for i, result in enumerate(results["data"]["Get"]["DailyText"]):
text = result["text"]
category = result["category"]
print(f"第 {i+1} 条:{text}")
print(f"分类:{category}\n")
二、主流向量数据库横向对比与区别
为了更清晰地明确各向量数据库的差异,我们从部署方式、核心定位、功能特性、适用场景等维度进行横向对比:
| 向量数据库 | 部署方式 | 核心定位 | 原始数据/元数据存储 | 检索性能 | 运维成本 | 授权/付费模式 | 适用场景 |
|---|---|---|---|---|---|---|---|
| FAISS | 嵌入式(无独立服务) | 轻量级向量检索库 | 不支持,需手动关联 | 极高(亿级向量快速检索) | 极低(无需运维,嵌入式运行) | 开源免费(Apache 2.0) | 1. 向量检索入门、原型验证; 2. 小规模数据场景; 3. 对检索性能要求极高,无需存储原始数据的场景; 4. 科研、算法验证。 |
| Chroma | 1. 本地嵌入式; 2. 客户端/服务端 | 轻量级企业级向量数据库(RAG专用) | 支持,自动存储与映射 | 较高(百万级向量高效检索) | 极低(开箱即用,无需复杂配置) | 开源免费(Apache 2.0) | 1. 中小项目RAG快速落地; 2. 无需分布式部署的生产环境; 3. 需要存储原始数据与元数据的场景; 4. 快速迭代的创业项目。 |
| Milvus | 1. 本地自托管; 2. 分布式(K8s); 3. 云托管(Zilliz Cloud) | 分布式企业级向量数据库(大规模场景) | 支持,完整存储与复杂过滤 | 极高(十亿/百亿级向量分布式检索) | 中等(需要运维团队负责扩容、容灾、备份) | 1. 社区版:开源免费(Apache 2.0); 2. 企业版/云托管:付费。 | 1. 中大型生产环境,大规模向量数据; 2. 分布式部署、高可用要求的场景; 3. 需要企业级运维功能(备份、容灾)的场景; 4. 电商、金融等大规模RAG场景。 |
| Pinecone | 全托管云服务(无自托管选项) | 商用托管式向量数据库(生产环境快速落地) | 支持,完整存储与复杂过滤 | 极高(亿级向量低延迟检索) | 极低(全托管,无需运维) | 1. 免费额度有限; 2. 超出后按存储量/查询量付费。 | 1. 无需自建运维团队的生产环境; 2. 快速落地大规模RAG场景,追求开箱即用; 3. 对成本敏感度较低,注重效率的场景; 4. 创业项目、快速验证的商业场景。 |
| Weaviate | 1. 本地自托管; 2. 商用托管云服务 | 开源/商用向量数据库(语义搜索+知识图谱) | 支持,融合知识图谱存储 | 较高(亿级向量高效检索) | 中等(自托管需运维,托管无需) | 1. 社区版:开源免费(MIT); 2. 托管版:付费。 | 1. 需要融合语义检索与知识图谱的场景; 2. 支持自然语言直接查询的场景; 3. 既想开源自托管,又可灵活切换到托管的场景; 4. 智能问答、知识管理系统。 |
三、总结与选型建议
- 快速入门/原型验证 :优先选择 FAISS 或 Chroma。FAISS 适合理解向量检索核心逻辑,Chroma 适合快速搭建可运行的RAG原型。
- 中小项目生产环境 :优先选择 Chroma。开箱即用、无需运维、支持完整数据存储,能够满足大部分中小项目的RAG需求。
- 大规模/分布式生产环境 :优先选择 Milvus (自托管,成本可控)或 Pinecone(全托管,高效便捷)。Milvus 适合有运维团队、对成本敏感的企业;Pinecone 适合无需运维、追求快速落地的商业项目。
- 语义搜索+知识图谱场景 :优先选择 Weaviate。其独特的知识图谱融合能力,能够满足复杂场景的查询需求。
- 数据隐私要求极高/涉密场景 :优先选择 开源自托管方案(FAISS、Chroma、Milvus、Weaviate),避免使用商用托管服务,确保数据存储在自有环境中。