主流向量数据库全面解析

前言

随着大语言模型(LLM)的快速发展,RAG(检索增强生成)技术成为解决模型"幻觉"、提升专业领域回答精度的核心方案,而向量数据库则是RAG技术的底层支撑。向量数据库专门用于存储、管理和检索高维嵌入向量(Embedding),通过高效的相似度匹配算法,快速从海量数据中找到与查询向量最相关的结果。

一、主流向量数据库

1. FAISS(Facebook AI Similarity Search)

核心介绍

FAISS是由Meta(原Facebook)AI团队开源的轻量级向量检索库,并非严格意义上的"完整数据库",而是专注于高维向量的高效相似度检索的核心算法库。它的设计初衷是实现"极致的检索性能",支持亿级高维向量的快速比对,占用资源少、部署简单,是入门向量检索、原型验证的首选。

核心特性

  • 支持多种相似度计算方式(L2欧式距离、余弦相似度、内积等)。
  • 提供多种索引类型,从简单的暴力检索(IndexFlatL2)到高效的近似最近邻检索(IVF、HNSW等)。
  • 仅存储向量数据,不支持原始文本、元数据存储,需手动维护向量与原始数据的映射关系。
  • 支持CPU/GPU加速,GPU版本可大幅提升大规模向量的检索效率。
  • 无独立服务,嵌入式运行,无需部署额外进程。

官方链接

基本使用代码(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的优选。

核心特性

  • 支持本地嵌入式运行(无需部署独立服务)和客户端/服务端运行(支持多节点协作)。
  • 自动完成文本向量化(内置多种嵌入模型,也可自定义第三方模型)。
  • 支持元数据存储与过滤检索(如按分类、标签筛选结果)。
  • 无需手动管理向量索引,自动优化检索性能。
  • 支持数据的增、删、改、查,提供完整的数据生命周期管理。
  • 开源免费,无商业授权限制,易于二次开发。

官方链接

基本使用代码(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),与主流云服务平台兼容。
  • 分为开源社区版(免费)和商业企业版(付费,提供高级运维与技术支持)。

官方链接

基本使用代码(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框架无缝集成。
  • 具备企业级的高可用、可扩展性与安全性。

官方链接

基本使用代码(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. 智能问答、知识管理系统。

三、总结与选型建议

  1. 快速入门/原型验证 :优先选择 FAISSChroma。FAISS 适合理解向量检索核心逻辑,Chroma 适合快速搭建可运行的RAG原型。
  2. 中小项目生产环境 :优先选择 Chroma。开箱即用、无需运维、支持完整数据存储,能够满足大部分中小项目的RAG需求。
  3. 大规模/分布式生产环境 :优先选择 Milvus (自托管,成本可控)或 Pinecone(全托管,高效便捷)。Milvus 适合有运维团队、对成本敏感的企业;Pinecone 适合无需运维、追求快速落地的商业项目。
  4. 语义搜索+知识图谱场景 :优先选择 Weaviate。其独特的知识图谱融合能力,能够满足复杂场景的查询需求。
  5. 数据隐私要求极高/涉密场景 :优先选择 开源自托管方案(FAISS、Chroma、Milvus、Weaviate),避免使用商用托管服务,确保数据存储在自有环境中。
相关推荐
Full Stack Developme2 小时前
Redis 可以实现哪些业务功能
数据库·redis·缓存
rgeshfgreh2 小时前
Spring事务传播机制深度解析
java·前端·数据库
无名-CODING2 小时前
Java Spring 事务管理深度指南
java·数据库·spring
想唱rap2 小时前
MYSQL在ubuntu下的安装
linux·数据库·mysql·ubuntu
蕨蕨学AI2 小时前
【Wolfram语言】45.2 真实数据集
java·数据库
The Sheep 20233 小时前
MongoDB与.Net6
数据库·mongodb
BryceBorder3 小时前
SCAU--数据库
数据库·oracle·dba
有味道的男人3 小时前
京东关键词API接口获取
数据库
罗光记3 小时前
《人工智能安全治理研究报告(2025年)发布
数据库·其他·百度·新浪微博